[ZLG-ARM] 好**

[复制链接]
1690|3
 楼主| tmake 发表于 2009-7-7 13:17 | 显示全部楼层 |阅读模式
摘要<br /><br />我们在这里讨论的是对嵌入式linux系统的启动过程的输出信息的注释,通过我们的讨论,大家会对嵌入式linux启动过程中出现的、以前感觉熟悉的、但却又似是而非的东西有一个确切的了解,并且能了解到这些输出信息的来龙去脉。<br /><br />嵌入式linux的启动信息是一个很值得我们去好好研究的东西,它能将一幅缩影图呈现在我们面前,来指导我们更加深入地理解linux内核。<br /><br /><br /><br />关键字:linux,嵌入式,启动,bootloader<br /><br />正文<br /><br />作为一名嵌入系统开发者,你一定遇到过下面的情景:<br /><br />在某论坛上看到一篇帖子,上面贴着嵌入式linux开发板启动时的有关信息,然后大家在帖子里讨论着这个启动过程中出现的问题,随机举例如下:<br /><br />Linux&nbsp;version&nbsp;2.4.20-uc0&nbsp;(root@Local)&nbsp;(gcc&nbsp;version&nbsp;2.95.3&nbsp;<br />20010315&nbsp;(release)(ColdFire&nbsp;patches&nbsp;-&nbsp;20010318&nbsp;from&nbsp;http://f&nbsp;<br />(uClinux&nbsp;XIP&nbsp;and&nbsp;shared&nbsp;lib&nbsp;patches&nbsp;from&nbsp;http://www.snapgear.com/))&nbsp;#20&nbsp;三&nbsp;6月&nbsp;1&nbsp;<br />8&nbsp;00:58:31&nbsp;CST&nbsp;2003&nbsp;<br />Processor:&nbsp;Samsung&nbsp;S3C4510B&nbsp;revision&nbsp;6&nbsp;<br />Architecture:&nbsp;SNDS100&nbsp;<br />On&nbsp;node&nbsp;0&nbsp;totalpages:&nbsp;4096&nbsp;<br />zone(0):&nbsp;0&nbsp;pages.&nbsp;<br />zone(1):&nbsp;4096&nbsp;pages.&nbsp;<br />zone(2):&nbsp;0&nbsp;pages.&nbsp;<br />Kernel&nbsp;command&nbsp;line:&nbsp;root=/dev/rom0&nbsp;<br />Calibrating&nbsp;delay&nbsp;loop...&nbsp;49.76&nbsp;BogoMIPS&nbsp;<br />Memory:&nbsp;16MB&nbsp;=&nbsp;16MB&nbsp;total&nbsp;<br />Memory:&nbsp;14348KB&nbsp;available&nbsp;(1615K&nbsp;code,&nbsp;156K&nbsp;data,&nbsp;40K&nbsp;init)&nbsp;<br />Dentry&nbsp;cache&nbsp;hash&nbsp;table&nbsp;entries:&nbsp;2048&nbsp;(order:&nbsp;2,&nbsp;16384&nbsp;bytes)&nbsp;<br />Inode&nbsp;cache&nbsp;hash&nbsp;table&nbsp;entries:&nbsp;1024&nbsp;(order:&nbsp;1,&nbsp;<br />Mount-cache&nbsp;hash&nbsp;table&nbsp;entries:&nbsp;512&nbsp;(order:&nbsp;0,&nbsp;4096&nbsp;bytes)&nbsp;<br />Buffer-cache&nbsp;hash&nbsp;table&nbsp;entries:&nbsp;1024&nbsp;(order:&nbsp;0,&nbsp;4096&nbsp;bytes)&nbsp;<br />Page-cache&nbsp;hash&nbsp;table&nbsp;entries:&nbsp;4096&nbsp;(order:&nbsp;2,&nbsp;16384&nbsp;bytes)&nbsp;<br />POSIX&nbsp;conformance&nbsp;testing&nbsp;by&nbsp;UNIFIX&nbsp;<br />Linux&nbsp;NET4.0&nbsp;for&nbsp;Linux&nbsp;2.4&nbsp;<br />Based&nbsp;upon&nbsp;Swansea&nbsp;University&nbsp;Computer&nbsp;Society&nbsp;NET3.039&nbsp;<br />Initializing&nbsp;RT&nbsp;netlink&nbsp;socket&nbsp;<br />Starting&nbsp;kswapd&nbsp;<br />Samsung&nbsp;S3C4510&nbsp;Serial&nbsp;driver&nbsp;version&nbsp;0.9&nbsp;(2001-12-27)&nbsp;with&nbsp;no&nbsp;serial&nbsp;options&nbsp;en&nbsp;<br />abled&nbsp;<br />ttyS00&nbsp;at&nbsp;0x3ffd000&nbsp;(irq&nbsp;=&nbsp;5)&nbsp;is&nbsp;a&nbsp;S3C4510B&nbsp;<br />ttyS01&nbsp;at&nbsp;0x3ffe000&nbsp;(irq&nbsp;=&nbsp;7)&nbsp;is&nbsp;a&nbsp;S3C451&nbsp;<br />Blkmem&nbsp;copyright&nbsp;1998,1999&nbsp;D.&nbsp;Jeff&nbsp;Dionne&nbsp;<br />Blkmem&nbsp;copyright&nbsp;1998&nbsp;Kenneth&nbsp;Albanowski&nbsp;<br />Blkmem&nbsp;1&nbsp;disk&nbsp;images:&nbsp;<br />0:&nbsp;BE558-1A5D57&nbsp;[VIRTUAL&nbsp;BE558-1A5D57]&nbsp;(RO)&nbsp;<br />RAMDISK&nbsp;driver&nbsp;initialized:&nbsp;16&nbsp;RAM&nbsp;disks&nbsp;of&nbsp;1024K&nbsp;size&nbsp;1024&nbsp;blocksize&nbsp;<br />Samsung&nbsp;S3C4510&nbsp;Ethernet&nbsp;driver&nbsp;version&nbsp;0.1&nbsp;(2002-02-20)&nbsp;<br />eth0:&nbsp;00:40:95:36:35:34&nbsp;<br />NET4:&nbsp;Linux&nbsp;TCP/IP&nbsp;1.0&nbsp;for&nbsp;NET4.0&nbsp;<br />IP&nbsp;Protocols:&nbsp;ICMP,&nbsp;UDP,&nbsp;TCP&nbsp;<br />IP:&nbsp;routing&nbsp;cache&nbsp;hash&nbsp;table&nbsp;of&nbsp;512&nbsp;buckets,&nbsp;4Kbytes&nbsp;<br />TCP:&nbsp;Hash&nbsp;tables&nbsp;configured&nbsp;(established&nbsp;1024&nbsp;bind&nbsp;1024)&nbsp;<br />VFS:&nbsp;Mounted&nbsp;root&nbsp;(romfs&nbsp;<br />Freeing&nbsp;init&nbsp;memory:&nbsp;40K<br /><br /><br /><br />上面的这些输出信息,也可能包括你自己正在做的嵌入式linux开发板的输出信息,其中的每一行,每一个字的含义,你是否深究过,或者说大部分的含义你能确切地知道的?本人想在这里结合本人在实践中一些体会来和广大嵌入式linux的开发者一起读懂这些信息。<br /><br />我们在这里将以一个真实的嵌入式linux系统的启动过程为例,来分析这些输出信息。启动信息的原始内容将用标记标出,以区别与注释。<br /><br /><br /><br />嵌入式linux的启动主要分为两个阶段:<br /><br />①&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一部分bootloader启动阶段<br /><br />②&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二部分linux&nbsp;内核初始化和启动阶段<br /><br />第一节:start_kernel<br /><br />第二节:用户模式(&nbsp;user_mode&nbsp;)开始,start_kernel结束<br /><br />第三节:加载linux内核完毕,转入cpu_idle进程<br /><br /><br /><br />第一部分&nbsp;:&nbsp;bootloader启动<br /><br />Boot&nbsp;loader&nbsp;v0.12<br /><br />NOTE:&nbsp;this&nbsp;boot&nbsp;loader&nbsp;is&nbsp;designed&nbsp;to&nbsp;boot&nbsp;kernels&nbsp;made&nbsp;with&nbsp;the<br /><br />2.4.xx&nbsp;releases<br /><br />bootloader&nbsp;for&nbsp;XV<br /><br />Built&nbsp;at&nbsp;Nov&nbsp;20&nbsp;2005&nbsp;10:12:35<br /><br /><br /><br />Bootloader头信息,版本,编译时间等,这个因不同的bootloader的设计而有所不同,由此你能看出bootloader的版本信息,有很多使用的是通用的bootloader,如u-boot,redboot等。<br /><br />Loaded&nbsp;to&nbsp;0x90060000<br /><br /><br /><br />将bootloader加载到内存ram中的0x90060000处,即将bootloader加载到内存的高端地址处。<br /><br />Linux内核将被bootloader加载到0x90090000处。<br /><br /><br /><br />Found&nbsp;boot&nbsp;configuration<br /><br /><br /><br />查找到了启动boot的配置信息<br /><br /><br /><br />Booted&nbsp;from&nbsp;parallel&nbsp;flash<br /><br /><br /><br />从flash中启动代码,此处的flash为并行闪存。Flash的分类列举如下:<br /><br />闪存分三类:并行,串行,不可擦除。<br /><br />①并行Parallel&nbsp;flash<br /><br /> NOR&nbsp;Flash,Intel于1988年发明.随机读取的速度比较快,随机按字节写,每次可以传输8Bit。一般适合应用于数据/程序的存贮应用中.NOR还可以片内执行(execute-in-place)XIP.写入和擦除速度很低。<br /><br /> NAND&nbsp;Flash,1989年,东芝公司发明.是以块和页为单位来读写的,不能随机访问某个指定的点.因而相对来说读取速度较慢,而擦除和写入的速度则比较快,每次可以传输16Bit,一般适用在大容量的多媒体应用中,容量大。如:CF,SM.<br /><br />②串行Serial&nbsp;Flash&nbsp;是以字节进行传输的,每次可以传输1-2Bit.如:MMC,SD,MS卡.串行闪存器件体积小,引脚也少,成本相对也更低廉。 <br /><br />③不可擦除Mask&nbsp;Rom&nbsp;Flash的特点是一次性录入数据,具有不可更改性,经常运用于游戏和需版权保护文件等的录入。其显著特点是成本低。&nbsp;<br /><br />注意:任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。<br /><br />从上面的信息,我们可以对flash类型特点有个比较明确的了解。<br /><br /><br /><br />CPU&nbsp;clock&nbsp;rate:&nbsp;200&nbsp;MHz<br /><br /><br /><br />开发板上所使用的CPU的主频为200MHZ.<br /><br /><br /><br />DRAM&nbsp;size&nbsp;is&nbsp;128MB&nbsp;(128MB/0MB)<br /><br /><br /><br />动态内存ram大小为128M。这里我们列举一下内存的类型及工作原理。<br /><br />根据内存的工作原理可以划分出两种内存:DRAM和SRAM<br /><br />①DRAM表示动态随机存取存储器。这是一种以电荷形式进行存储的半导体存储器。DRAM中的每个存储单元由一个晶体管和一个电容器组成。数据存储在电容器中。电容器会由于漏电而导致电荷丢失,因而DRAM器件是不稳定的。为了将数据保存在存储器中,DRAM器件必须有规律地进行刷新。&nbsp;<br /><br />②SRAM是静态的,因此只要供电它就会保持一个值。一般而言,SRAM&nbsp;比DRAM要快,这是因为SRAM没有刷新周期。每个SRAM存储单元由6个晶体管组成,而DRAM存储单元由一个晶体管和一个电容器组成。相比而言,DRAM比SRAM每个存储单元的成本要高。照此推理,可以断定在给定的固定区域内DRAM的密度比SRAM&nbsp;的密度要大。&nbsp;<br /><br /><br /><br />SRAM常常用于高速缓冲存储器,因为它有更高的速率;而DRAM常常用于PC中的主存储器,因为其拥有更高的密度。&nbsp;<br /><br />在嵌入式系统中使用DRAM内存的设计比较广泛。<br /><br /><br /><br />地址辅助说明:<br /><br />先说明一下内存地址数字情况,主要是为了方便**。<br /><br />可以访问的内存为4G。<br /><br />0x40000000是1GB处;0x00040000是256K处,0x00020000是128K处,0x90000000是2GB多的地方。<br /><br />1M-&gt0x00100000,&nbsp;<br /><br />2M-&gt0x00200000,<br /><br />8M-&gt0x00800000<br /><br />16M-&gt0x01000000,&nbsp;<br /><br />32M-&gt0x02000000<br /><br />256M-&gt0x10000000<br /><br />64K-&gt0x<br />&nbsp;<br /> &nbsp;&nbsp;<br />
postcode 发表于 2009-7-7 13:21 | 显示全部楼层

强顶,谢谢

  
chun1chun 发表于 2009-7-7 13:29 | 显示全部楼层

好**

  
 楼主| tmake 发表于 2009-7-9 13:29 | 显示全部楼层

多谢楼主

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

179

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部