ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:36.53KB ,
资源ID:14456409      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/14456409.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式linux启动信息完全注释.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式linux启动信息完全注释.docx

1、嵌入式linux启动信息完全注释嵌入式linux启动信息完全注释我们在这里讨论的是对嵌入式linux系统的启动过程的输出信息的注释,通过我们的讨论,大家会对嵌入式linux启动过程中出现的、以前感觉熟悉的、但却又似是而非的东西有一个确切的了解,并且能了解到这些输出信息的来龙去脉。嵌入式linux的启动信息是一个很值得我们去好好研究的东西,它能将一幅缩影图呈现在我们面前,来指导我们更加深入地理解linux内核。关键字:linux,嵌入式,启动,bootloader正文作为一名嵌入系统开发者,你一定遇到过下面的情景:在某论坛上看到一篇帖子,上面贴着嵌入式linux开发板启动时的有关信息,然后大家在

2、帖子里讨论着这个启动过程中出现的问题,随机举例如下:Linux version 2.4.20-uc0 (rootLocal) (gcc version 2.95.320010315 (release)(ColdFire patches - 20010318 fromhttp:/f(uClinux XIP and shared lib patches from) #20 三 6月 18 00:58:31 CST 2003Processor: Samsung S3C4510B revision 6Architecture: SNDS100On node 0 totalpages: 4096zone

3、(0): 0 pages.zone(1): 4096 pages.zone(2): 0 pages.Kernel command line: root=/dev/rom0Calibrating delay loop. 49.76 BogoMIPSMemory: 16MB = 16MB totalMemory: 14348KB available (1615K code, 156K data, 40K init)Dentry cache hash table entries: 2048 (order: 2, 16384 bytes)Inode cache hash table entries:

4、1024 (order: 1,Mount-cache hash table entries: 512 (order: 0, 4096 bytes)Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)Page-cache hash table entries: 4096 (order: 2, 16384 bytes)POSIX conformance testing by UNIFIXLinux NET4.0 for Linux 2.4Based upon Swansea University Computer Society

5、NET3.039Initializing RT netlink socketStarting kswapdSamsung S3C4510 Serial driver version 0.9 (2001-12-27) with no serial options enabledttyS00 at 0x3ffd000 (irq = 5) is a S3C4510BttyS01 at 0x3ffe000 (irq = 7) is a S3C451Blkmem copyright 1998,1999 D. Jeff DionneBlkmem copyright 1998 Kenneth Albanow

6、skiBlkmem 1 disk images:0: BE558-1A5D57 VIRTUAL BE558-1A5D57 (RO)RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksizeSamsung S3C4510 Ethernet driver version 0.1 (2002-02-20)eth0: 00:40:95:36:35:34NET4: Linux TCP/IP 1.0 for NET4.0IP Protocols: ICMP, UDP, TCPIP: routing cache hash tab

7、le of 512 buckets, 4KbytesTCP: Hash tables configured (established 1024 bind 1024)VFS: Mounted root (romfsFreeing init memory: 40K上面的这些输出信息,也可能包括你自己正在做的嵌入式linux开发板的输出信息,其中的每一行,每一个字的含义,你是否深究过,或者说大部分的含义你能确切地知道的?本人想在这里结合本人在实践中一些体会来和广大嵌入式linux的开发者一起读懂这些信息。我们在这里将以一个真实的嵌入式linux系统的启动过程为例,来分析这些输出信息。启动信息的原始内

8、容将用标记标出,以区别与注释。#P#嵌入式linux的启动主要分为两个阶段: 第一部分bootloader启动阶段 第二部分linux 内核初始化和启动阶段第一节:start_kernel第二节:用户模式( user_mode )开始,start_kernel结束第三节:加载linux内核完毕,转入cpu_idle进程第一部分 : bootloader启动Boot loader v0.12NOTE: this boot loader is designed to boot kernels made with the2.4.xx releasesbootloader for XVBuilt at

9、 Nov 20 2005 10:12:35Bootloader头信息,版本,编译时间等,这个因不同的bootloader的设计而有所不同,由此你能看出bootloader的版本信息,有很多使用的是通用的bootloader,如u-boot,redboot等。Loaded to 0x90060000将bootloader加载到内存ram中的0x90060000处,即将bootloader加载到内存的高端地址处。Linux内核将被bootloader加载到0x90090000处。Found boot configuration查找到了启动boot的配置信息Booted from parallel

10、flash从flash中启动代码,此处的flash为并行闪存。Flash的分类列举如下:闪存分三类:并行,串行,不可擦除。并行Parallel flashNOR Flash,Intel于1988年发明随机读取的速度比较快,随机按字节写,每次可以传输8Bit。一般适合应用于数据/程序的存贮应用中NOR还可以片内执行(execute-in-place)XIP写入和擦除速度很低。NAND Flash,1989年,东芝公司发明是以块和页为单位来读写的,不能随机访问某个指定的点.因而相对来说读取速度较慢,而擦除和写入的速度则比较快,每次可以传输16Bit,一般适用在大容量的多媒体应用中,容量大。如:CF

11、,SM.串行Serial Flash 是以字节进行传输的,每次可以传输1-2Bit.如:MMC,SD,MS卡串行闪存器件体积小,引脚也少,成本相对也更低廉。不可擦除Mask Rom Flash的特点是一次性录入数据,具有不可更改性,经常运用于游戏和需版权保护文件等的录入。其显著特点是成本低。注意:任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。从上面的信息,我们可以对flash类型特点有个比较明确的了解。CPU clock rate: 2

12、00 MHz开发板上所使用的CPU的主频为200MHZDRAM size is 128MB (128MB/0MB)动态内存ram大小为128M。这里我们列举一下内存的类型及工作原理。根据内存的工作原理可以划分出两种内存:DRAM和SRAMDRAM表示动态随机存取存储器。这是一种以电荷形式进行存储的半导体存储器。DRAM中的每个存储单元由一个晶体管和一个电容器组成。数据存储在电容器中。电容器会由于漏电而导致电荷丢失,因而DRAM器件是不稳定的。为了将数据保存在存储器中,DRAM器件必须有规律地进行刷新。SRAM是静态的,因此只要供电它就会保持一个值。一般而言,SRAM 比DRAM要快,这是因为S

13、RAM没有刷新周期。每个SRAM存储单元由6个晶体管组成,而DRAM存储单元由一个晶体管和一个电容器组成。相比而言,DRAM比SRAM每个存储单元的成本要高。照此推理,可以断定在给定的固定区域内DRAM的密度比SRAM 的密度要大。SRAM常常用于高速缓冲存储器,因为它有更高的速率;而DRAM常常用于PC中的主存储器,因为其拥有更高的密度。在嵌入式系统中使用DRAM内存的设计比较广泛。地址辅助说明:先说明一下内存地址数字情况,主要是为了方便记忆。可以访问的内存为4G。0x40000000是1GB处;0x00040000是256K处,0x00020000是128K处,0x90000000是2GB

14、多的地方。1M-0x00100000,2M-0x00200000,8M-0x0080000016M-0x01000000,32M-0x02000000256M-0x1000000064K-0x000100004K-0x00001000这个是个快速记忆的方法,你可以根据地址中1的位置和其后0的个数来快速知道换算后的地址是在多少兆的地方。比如,1的后面5个0,代表1M的大小,6个0,代表16M,以此类推。ROMFS found at 0x46040000, Volume name = rom 43f291aaromfs,只读文件系统所在的地址为:0x46040000 (flash映射后的第3分区)

15、。卷名为rom。romfs和rootfs概念上有所区别。flash在内存中的的起始地址为0x46000000,而ROMFS在flash分区上的起始位置为0x00040000,所以ROMFS在内存地址中的位置就为0x46040000。这个细节的部分可以参考flash分区时的地方,Creating 3 MTD partitions。romfs中包括kernel和app应用,不包括bootloader和firmware信息头。romfs只读文件系统里的内容有很多种分类方法,我们可以将kernel和app同时放里面,作为根文件系统下的一个文件,也可以在flash上另外划分区域来分别存放。VFS虚拟文件

16、系统交换器在linux系统中,目前已经开发出多种文件系统,那么如何让这些文件系统能共存在一个系统中呢,从linux 2.0开始,引入了虚拟文件系统管理器 VFS的概念。Linux 下的文件系统主要可分为三大块: 一是上层的文件系统的系统调用, 二是虚拟文件系统交换器 VFS(Virtual Filesystem Switch), 三是挂载到 VFS 中的各实际文件系统,例如 ext2,jffs 等。VFS的确切叫法是Virtual Filesystem Switch虚拟文件系统交换器,这里的VFS中的“S”是指的switch,这个需要强调一下的,它很容易被混淆成“system”,如果理解成“s

17、ystem”将是不正确的,请多加注意。VFS是具体文件系统filesystem的一个管理器。VFS是Linux内核中的一个软件层,一种软件机制,它也提供了内核中的一个抽象功能,允许不同的文件系统共存,可以称它为 Linux 的文件系统管理者,与它相关的数据结构只存在于物理内存当中。所以在每次系统初始化期间,Linux 都首先要在内存当中构造一棵 VFS 的目录树。VFS 中的各目录其主要用途是用来提供实际文件系统的挂载点。而rootfs将是这个目录树的根结点的(root),即 /目录,VFS的结构就是从这个rootfs开始的。有了VFS,那么对文件的操作将使用统一的接口,将来通过文件系统调用对

18、 VFS 发起的文件操作等指令将被 rootfs 文件系统中相应的函数接口所接管。注意:rootfs并不是一个具体的文件系统类型,如jffs。它只是一个理论上的概念。在具体的嵌入系统实例中,可以将某种具体的文件系统设置为根文件系统rootfs,如我们可以设置romfs为根文件系统,也可以设置jffs为根文件系统。这里的ROMFS只读文件系统只是一种具体的文件系统类型,也是在嵌入系统中经常使用到的类型。看完了上面的内容,以后你对出现的类似“kernel Panic:VFS:Unable to mount root fs on 0:00”的含义应该已经了解了。其中“VFS:”就是虚拟文件系统管理器

19、操作时的输出信息了。File linux.bin.gz foundlinux kernel内核文件名,它是在只读文件系统romfs上的一个组成部分。Unzipping image from 0x4639DE60 to 0x90090000, size = 1316021将romfs中的linux kernel解压缩到0x90090000,之后会从这个内存地址启动内核。romfs为压缩格式文件,使用压缩的只读文件系统,是为了保持制作出来的整个系统所占用的flash空间减小。这个内核的大小为1.3M左右,这也是目前大多数嵌入系统所使用的方法。Inptr = 0x00000014(20)Inflat

20、ing.释放,解压中。(变大,充气, 膨胀)Outcnt = 0x0030e7c8(3205064)Final Inptr = 0x001414ad(1316013)Original CRC = 0xcbd73adbComputed CRC = 0xcbd73adb做释放后的CRC检查Boot kernel at 0x90090000 with ROMFS at 0x46040000kernel已经被从romfs中释放到内存地址0x90090000处,可以跳转到此处启动kernel了,这里是指定的kernel的起始地址Press enter to boot系统等待启动,后面将看到linux k

21、ernel的启动过程了。#P#第二部分 : linux内核初始化以及启动第一节:start_kernelLinux的源代码可以从www.kernel.org得到,或者你可以查看linux代码交叉引用网站:http:/lxr.linux.no/进行在线的代码查看,这是一个很好的工具网站。在start_kernel中将调用到大量的init函数,来完成内核的各种初始化。如:page_address_init();sched_init();page_alloc_init();init_IRQ();softirq_init();console_init();calibrate_delay();vfs_c

22、aches_init(num_physpages);rest_init();具体内容可以参考http:/lxr.linux.no/source/init/main.cLinux version 2.4.22-uc0 (rootlocal) (gcc version 2.95.3 20010315 (release) #33 .?1. 20 12:09:106上面的代码输出信息,是跟踪linux代码分析后得到的,进入init目录下的main.c的start_kernel启动函数.嵌入式linux使用的是linux内核版本为2.4.22linux source code代码中start_kerne

23、l中输出的linux_banner信息。这个信息是每个linux kernel都会打印一下的信息,如果你没有把这句去掉的话。Found bootloader memory map at 0x10000fc0.bootloader经过内存映射后的地址为:0x10000fc0, 按上面的地址换算方法,1后面有7个0,那么虚拟地址256M左右处。Processor: ARM pt110 revision 0pT110是ARM微处理器arm核的一种,另一种为pT100。此处为显示ARM的类型。On node 0 totalpages: 20480zone(0): 20480 pages.zone(0)

24、: Set minimum memory threshold to 12288KBWarning: wrong zone alignment (0x90080000, 0x0000000c, 0x00001000)zone(1): 0 pages.zone(2): 0 pages.预留内存大小,在节点0上总共20页, zone(0) 设置最小内存为12MB, zone(1)和zone(2)为0页。警告:对齐不正确Kernel command line: root=/dev/mtdblock3Kernel 启动命令设为:/dev/mtdblock3(在后面的说明中会看到mtdblock3是指的f

25、lash上的romfs分区。),用来指定根文件系统所在的位置,kernel会将块设备mtdblock3当作文件系统来处理。也就是说,内核会根据上面的kernel命令行,知道只读文件系统romfs将是根文件系统rootfs。start_kernel(void)中输出的上面的这句信息。这行命令是在linux内核启动过程中都会输出的一句。Console: colour dummy device 80x30代码中console_init()的输出信息, 显示控制台属性:一般使用VGA text console,标准是80 X 25行列的文本控制台,这里是对属性进行了设置。serial_xx: setu

26、p_console 115串口设置值为115200,此为波特率输出信息。对串口设置的信息做一个打印的动作,在调试时会非常有用。Calibrating delay loop. 82.94 BogoMIPSCalibrate:校准, 进入时延校准循环。检查CPU的MIPS(每秒百万条指令),Bogo是Bogus(伪)的意思。这里是对CPU进行一个实时测试,来得到一个大体的MIPS数值Bogomips,是由linus Torvalds写的, 是Linux操作系统中衡量计算机处理器运行速度的一种尺度。提供这种度量的程序被称为BogoMips,当启动计算机时,BogoMips能显示系统选项是否处于最佳性

27、能。linux内核中有一个函数calibrate_delay(),它可以计算出cpu在一秒钟内执行了多少次一个极短的循环,计算出来的值经过处理后得到BogoMIPS值你可以将计算机的bogomips与计算机处理器的bogomips进行比较。Torvalds称这个程序为BogoMips来暗示两台计算机间的性能度量是错误的,因为并非所有起作用因素都能被显示出来或被认可。尽管计算机基准中经常用到MIPS,但环境的变化容易导致度量的错误。Bogomips能测出一秒钟内某程序运行了多少次。察看/proc/cpuinfo文件中的最后一行也能得到这个数值。上面这个输出,在所有的linux系统启动中都会打印出

28、来。进入内存初始化mem_init(void), arch/i386/mm/init.cMemory: 80MB = 80MB totalMemory: 76592KB available (1724K code, 2565K data, 72K init)当前内存使用情况,将列出总的内存大小, 及分配给内核的内存大小:包括代码部分,数据部分,初始化部分,总共刚好4M。请留意此处的内核的内存大小的各个值。进入虚拟文件系统VFS初始化vfs_caches_init()Dentry cache hash table entries: 16384 (order: 5, 131072 bytes)In

29、ode cache hash table entries: 8192 (order: 4, 65536 bytes)Mount cache hash table entries: 512 (order: 0, 4096 bytes)Buffer cache hash table entries: 4096 (order: 2, 16384 bytes)Page-cache hash table entries: 32768 (order: 5, 131072 bytes)名词: Dentry:目录数据结构 Inode:i节点 Mount cache:文件系统加载缓冲 buffer cache:

30、内存缓冲区 Page Cache:页缓冲区Dentry目录数据结构(目录入口缓存),提供了一个将路径名转化为特定的dentry的一个快的查找机制,Dentry只存在于RAM中;i节点(inode)数据结构存放磁盘上的一个文件或目录的信息,i节点存在于磁盘驱动器上;存在于RAM中的i节点就是VFS的i节点,dentry所包含的指针指向的就是它;buffer cache内存缓冲区,类似kupdated,用来在内存与磁盘间做缓冲处理;Page Cache 用来加快对磁盘上映像和数据的访问。在内存中建立各个缓冲hash表,为kernel对文件系统的访问做准备。VFS(virtual filesyste

31、m switch)虚拟文件切换目录树有用到类似这样的结构表。上面的输出信息,在一般的linux启动过程中都会看到。POSIX conformance testing by UNIFIXconformance:顺应, 一致。即POSIX适应性检测。UNIFIX是一家德国的技术公司,Linux 原本要基于 POSIX.1 的, 但是 POSIX 不是免费的, 而且 POSIX.1 证书相当昂贵. 这使得 Linux 基于 POSIX 开发相当困难. Unifix公司(Braunschweig, 德国) 开发了一个获得了 FIPS 151-2 证书的 Linux 系统. 这种技术用于 Unifix 的发行版 Unifix Linux 2.0 和 Lasermoon 的 Linux-FT。在2.6的内核中就将上面的这句输出给拿掉了。#P#第二节:用户模式( user

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1