织梦CMS - 轻松建站从此开始!

罗索

bootloader如何固化

落鹤生 发布于 2012-07-16 15:22 点击:次 
关于bootloader,先简要地总结一下。经过了第一个阶段的学习,对bootloader有了一个整体的认识,其实把它当作一个功能单元就可以了, 职责就是完成从硬件加电到操作系统内核运行之前的所有工作,这些工作包括硬件检测、硬件初始化、加载kernel。这些工作怎么完成呢?
TAG:

关于bootloader,先简要地总结一下。经过了第一个阶段的学习,对bootloader有了一个整体的认识,其实把它当作一个功能单元就可以了, 职责就是完成从硬件加电到操作系统内核运行之前的所有工作,这些工作包括硬件检测、硬件初始化、加载kernel。这些工作怎么完成呢?按照功能分为两个 部分比较合适,硬件检测和初始化功能实现作为stage1;加载kernel作为stage2。stage1完全依赖于硬件,这一部分用汇编语言实 现;stage2与操作系统有关,一般用C语言来实现。在嵌入式系统的开发过程中,bootloader有两种选择,要么自行开发,要么移植。我还没有写 过bootloader,只是移植过U-boot,使用过Redboot。

这里讨论一个问题,bootloader如何烧写(固化)到非易失性存储介质(比如Nor Flash,NAND Flash等)里呢?

讨论之前,先要理解编程器的概念。虽然学通信工程,应该对这些工具不陌生,但是本科下来,对这些概念确实没有深刻的印象。实际用到,才发现自己基础太差, 只能努力的弥补。我写blog,很大程度上是对基础知识的巩固,相信基础扎实了,知识体系才可以慢慢的完善,才能最终胜任更高难度的工作。

编程器也叫device programmer,是对非易失性存储介质和其他电可编程设备进行编程的工具。传统的编程器,需要把Flash(举例)从电路板上取下来,插到编程器的 接口上,以完成擦除和烧写。现在的编程器发展的方向是ISP(In-System Programming,在系统可编程),就是指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路板上取下器件。已经编程的器件也可以用 ISP方式擦除或再编程,如Nor Flash支持重复擦写10万次左右。可见,ISP,智能编程器是发展的方向。

利用编程器可以解决前面提高的问题,不仅可以烧写bootloader,还可以烧写kernel,fs等等。也就是都属于固化最终用户代码的过程。

下面考虑两种实际情况:
1、厂商已经提供固化的程序代码,不允许对其修改。那么这种情况下,用不到编程器。
2、厂商提供的硬件没有固化代码,或者固化了部分代码(后面举例说明),这样就需要用到编程器。

第一种情况是对最终用户而言,第二种情况则对开发者而言。也就是在嵌入式开发过程中,我们总是需要用到编程器,不管原来是否知道这个概念,即使是下载线, 也可以认为是简单的编程器。要想利用编程器进行数据交换,完成烧写擦除等操作,就必须硬件连接、软件操作。当然,复杂的地方在软件操作,因为对不同的硬 件,软件操作是不同的。有些厂商把编程器、编辑器、编译器、汇编器、链接器、调试器集成在一起,提供软硬件解决方案,在学校学习大多是这种集成环境了。比 如51单片机的仿真器和Keil开发环境。也因为这个原因,对于每个环节反而没有了概念。在Linux下开发的时候,这些问题就都凸现出来了。不过早出来 早解决,这样无论对于自己的认识,还是对于以后的发展,都是有利的。

有些厂商为了方便用户下载代码和调试,在其处理器内部集成了一个小的ROM,事先固化一小段代码。因为容量有限,所以代码的功能有限,一般只是初始化串 口,然后等待从串口输入数据。这样,串口线实际上就成为了编程器的硬件连接了。比如,Cirrus Logic 的EP93XX系列,它内部集成了一个BootROM,固化代码初始化串口,支持从串口下载数据。那么在Host端只需要相应的开发一个相同串口协议的 download程序,就可以完成bootloader(EP93XX系列使用的是Redboot)烧写到Falsh里【注:这里的编程器就可以认为是 download+RS-232交叉线】,然后从Falsh启动,有Redboot进行下面的工作。因为Redboot实现了串口传输协议和TFTP协 议,就可以通过RS-232来进行控制,通过Ethernet完成大的映象文件如kernel和fs的下载固化。这样,从硬件上电,到最后系统启动的所有 环节就都很清晰了。ATMEL的AT91RM9200内部也集成了一个ROM,固化代码,同样初始化串口,启动串口传输协议Xmodem,等待输入【注: 这里的编程器就可以认为是loader+RS-232交叉线】。官方提供的loader就是完成把U-boot下载固化到flash里面。因为 kernel和fs比较大,可以采用压缩,官方提供boot来完成从flash启动后自动解压过程。这样,从flash启动就慢了许多。

还有些厂商为了节省ROM空间,提高集成度,不支持从ROM启动模式。比如三星公司的S3C2410等。这样一种简单的方法就是采用JTAG下载线作为编 程器的硬件连接,完成其Bootloader(如Vivi)的烧写。在Windows环境下,针对JTAG硬件连接,编程器的软件有 JFlash(JTAG for Flash),SJF,Flash Programmer等,还是比较丰富的。在Linux环境下,我所知道的有JFlash的Linux版本【注:在Linux下,这里的编程器就可以认为 是JFlash+JTAG下载线,S3C2410是提供JTAG接口的】。因为学校实验室有S3C2410的实验箱,所以下个阶段会尝试以S3C2410 为中心,进行详细深入的学习。其中之一就是bootloader的研究。那么就可以分成两个部分:一是Linux环境下Flash烧写工具JFlash的 工作原理,完成移植工作。二是移植Vivi(U-boot)。在这个过程中,重点学习一下U-boot的移植和组织形式,掌握JTAG对应的软件 JFlash的源代码编写方法。然后尝试自己写一个简单的bootloader。我想,这样学习会更加有效。

总结完之后,对bootloader的理解有了一个新的概念。把bootloader理解成烧写工具和功能实现两个部分,对于实际理解会更有帮助。这样, 拿到一块板子,首先看它提供的启动方式有那些,是否支持从ROM启动,是否支持从Flash启动等等,针对启动方式,选择bootloader固化方式, 如果提供编程器软件资源最好,如果不提供,那么要么编写,要么移植。不过,大而全在商业中是行不通的,如同周立功所说,专注于自己最擅长的,其他的外包。 这是工作后应该信奉的原则。现在还是以研究为目的,尽量弄明白每个环节的工作原理,形成清晰的认识,然后选择自己最为擅长的,作为谋生的手段。即使工作 后,各个环节还是应该有所射猎,知识都是相通的,可能从别的方面得到启发,解决自己手头的难题。

(calmarrow(lqm))
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201207/16160.html]
本文出处:百度博客 作者:calmarrow(lqm) 原文
顶一下
(3)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容