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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

uClinux 启动过程详细分析.docx

1、uClinux 启动过程详细分析uClinux 启动过程详细分析级别: 中级余 涛 (yut616), 高级软件工程师2007 年 6 月 28 日uclinux 启动的详细过程有着诸多的信息可以给我们巨大的启发,我们在这里讨论的就是要对这些信息做一个具体细致的分析,通过我们的讨论,大家会对uclinux启 动过程中出现的、以前感觉熟悉的、但却又似是而非的东西有一个确切的了解,并且能了解到这些输出信息的来龙去脉。uclinux的启动过程,它是一幅缩影图,对它有了一个详细的了解后,有助于指导我们更加深入地了解uclinux的核心。大家对uclinux的启动应该都比较熟悉,作为一名嵌入系统开发者,

2、你一定遇到过下面的情景:在某论坛上看到一篇帖子,上面贴着uclinux开发板启动时的一堆信息,然后大家在帖子里讨论着这个启动过程中出现的问题,随机举例如下: Linux version 2.4.20-uc1 (rootLocal) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http:/f (uClinux XIP and shared lib patches from #20 三 6月 1 8 00:58:31 CST 2003 Processor: Samsung S3C4510B revi

3、sion 6 Architecture: SNDS100 On node 0 totalpages: 4096 zone(0): 0 pages. zone(1): 4096 pages. zone(2): 0 pages. Kernel command line: root=/dev/rom0 Calibrating delay loop. 49.76 BogoMIPS Memory: 16MB = 16MB total Memory: 14348KB available (1615K code, 156K data, 40K init) Dentry cache hash table en

4、tries: 2048 (order: 2, 16384 bytes) Inode cache hash table entries: 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 UNIFIX

5、Linux NET4.0 for Linux 2.4 Based upon Swansea University Computer Society NET3.039 Initializing RT netlink socket Starting kswapd Samsung S3C4510 Serial driver version 0.9 (2001-12-27) with no serial options en abled ttyS00 at 0x3ffd000 (irq = 5) is a S3C4510B ttyS01 at 0x3ffe000 (irq = 7) is a S3C4

6、51 Blkmem copyright 1998,1999 D. Jeff Dionne Blkmem copyright 1998 Kenneth Albanowski Blkmem 1 disk images: 0: BE558-1A5D57 VIRTUAL BE558-1A5D57 (RO) RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize Samsung S3C4510 Ethernet driver version 0.1 (2002-02-20) eth0: 00:40:95:36:35:34

7、 NET4: Linux TCP/IP 1.0 for NET4.0 IP Protocols: ICMP, UDP, TCP IP: routing cache hash table of 512 buckets, 4Kbytes TCP: Hash tables configured (established 1024 bind 1024) VFS: Mounted root (romfs Freeing init memory: 40K上面的这些输出信息,也可能包括你自己正在做的uclinux开发板的输出信息,其中的每一行,每一个字的含义,你是否深究过,或者说大部分的含义你能确切地知道的

8、?本人想在这里结合本人在实践中一些体会来和广大uclinux的开发者一起读懂这些信息。我们在这里将以一个真实的uclinux系统的启动过程为例,来分析这些输出信息。启动信息的原始内容将用标记标出,以区别与注释。uclinux的启动主要分为两个阶段: 第一部分bootloader启动阶段 第二部分linux 内核初始化和启动阶段 o 第一节:start_kernelo 第二节:用户模式( user_mode )开始,start_kernel结束o 第三节:加载linux内核完毕,转入cpu_idle进程第一部分 : bootloader启动图 1:uclinux启动状态转移示意图Boot loa

9、der v0.12NOTE: this boot loader is designed to boot kernels made with the2.4.xx releasesbootloader for XVBuilt at Nov 20 2005 10:12:35Bootloader头信息,版本,编译时间等,这个因不同的bootloader的设计而有所不同,由此你能看出bootloader的版本信息,有很多使用的是通用的bootloader,如u-boot,redboot等。Loaded to 0x90060000将bootloader加载到内存ram中的0x90060000处,即将boo

10、tloader加载到内存的高端地址处。Linux内核将被bootloader加载到0x90090000处。Found boot configuration查找到了启动boot的配置信息。Booted from parallel flash从flash中启动代码,此处的flash为并行闪存。注意:任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。从上面的信息,我们可以对flash类型特点有个比较明确的了解。CPU clock rate: 20

11、0 MHz开发板上所使用的CPU的主频为200MHZ。DRAM size is 128MB (128MB/0MB)动态内存ram大小为128M。在嵌入式系统中使用DRAM内存的设计比较广泛。在uclinux的系统中,系统运行时间较长后,会出现内存碎片的问题,导致再分配大块内存时会失败。这是在uclinux系统中经常遇到的问题,解决的办法通常有使用静态内存、应用程序启动时预先分配大内存、使用内存池等。地址辅助说明:先说明一下内存地址数字情况,主要是为了方便记忆。可以访问的内存为4G。0x40000000是1GB处;0x00040000是256K处,0x00020000是128K处,0x90000

12、000是2GB多的地方。1M-0x00100000, 2M-0x00200000,8M-0x00800000,16M-0x01000000, 32M-0x02000000,256M-0x10000000,64K-0x00010000,4K-0x00001000这个是个快速记忆的方法,你可以根据地址中1的位置和其后0的个数来快速知道换算后的地址是在多少兆的地方。比如,1的后面5个0,代表1M的大小,6个0,代表16M,以此类推。ROMFS found at 0x46040000, Volume name = rom 43f291aaromfs,只读文件系统所在的地址为:0x46040000 (f

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

14、区域来分别存放。注意:rootfs并不是一个具体的文件系统类型,如jffs。它只是一个理论上的概念。在具体的嵌入系统实例中,可以将某种具体的文件系统设置为根文件系统rootfs,如我们可以设置romfs为根文件系统,也可以设置jffs为根文件系统。这里的ROMFS只读文件系统只是一种具体的文件系统类型,也是在嵌入系统中经常使用到的类型。看完了上面的内容,以后你对出现的类似“kernel Panic:VFS:Unable to mount root fs on 0:00”的含义应该已经了解了。其中“VFS:”就是虚拟文件系统管理器操作时的输出信息了。File linux.bin.gz found

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

16、4)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 kernel的启动过程了。第二部分 : linux内核初始化以及启动第一节:start_ker

17、nelLinux的源代码可以从 www.kernel.org 得到,或者你可以查看linux代码交叉引用网站:http:/lxr.linux.no/ 进行在线的代码查看,这是一个很好的工具网站。在start_kernel中将调用到大量的init函数,来完成内核的各种初始化。如:图 2:kernel start up初始化过程具体内容可以参考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:0

18、9:106上面的代码输出信息,是跟踪linux代码分析后得到的,进入init目录下的main.c的start_kernel启动函数。uclinux使用的是linux内核版本为2.4.22。linux source code代码中start_kernel中输出的linux_banner信息。这个信息是每个linux kernel都会打印一下的信息,如果你没有把这句去掉的话。Found bootloader memory map at 0x10000fc0.bootloader经过内存映射后的地址为:0x10000fc0, 按上面的地址换算方法,1后面有7个0,那么虚拟地址256M左右处。Proc

19、essor: ARM pt110 revision 0pT110是ARM微处理器arm核的一种,另一种为pT100。此处为显示ARM的类型。On node 0 totalpages: 20480zone(0): 20480 pages.zone(0): Set minimum memory threshold to 12288KBWarning: wrong zone alignment (0x90080000, 0x0000000c, 0x00001000)zone(1): 0 pages.zone(2): 0 pages.预留内存大小,在节点0上总共20页, zone(0) 设置最小内存为

20、12MB, zone(1)和zone(2)为0页。警告:对齐不正确。Kernel command line: root=/dev/mtdblock3Kernel 启动命令设为:/dev/mtdblock3(在后面的说明中会看到mtdblock3是指的flash上的romfs分区。),用来指定根文件系统所在 的位置,kernel会将块设备mtdblock3当作文件系统来处理。也就是说,内核会根据上面的kernel命令行,知道只读文件系统romfs将是 根文件系统rootfs。start_kernel(void) 中输出的上面的这句信息。这行命令是在linux内核启动过程中都会输出的一句。Cons

21、ole: colour dummy device 80x30代码中console_init()的输出信息, 显示控制台属性:一般使用VGA text console,标准是80 X 25行列的文本控制台,这里是对属性进行了设置。serial_xx: setup_console 115串口设置值为115200,此为波特率输出信息。对串口设置的信息做一个打印的动作,在调试时会非常有用。Calibrating delay loop. 82.94 BogoMIPSCalibrate:校准, 进入时延校准循环。检查CPU的MIPS(每秒百万条指令),Bogo是Bogus(伪)的意思。这里是对CPU进行一

22、个实时测试,来得到一个大体的MIPS数值。上面这个输出,在所有的linux系统启动中都会打印出来。进入内存初始化:mem_init(void), arch/i386/mm/init.c Memory: 80MB = 80MB totalMemory: 76592KB available (1724K code, 2565K data, 72K init)当前内存使用情况,将列出总的内存大小, 及分配给内核的内存大小:包括代码部分,数据部分,初始化部分,总共刚好4M。请留意此处的内核的内存大小的各个值。进入虚拟文件系统VFS初始化:vfs_caches_init() Dentry cache h

23、ash table entries: 16384 (order: 5, 131072 bytes)Inode 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)在内存中建立各个缓冲h

24、ash表,为kernel对文件系统的访问做准备。VFS(virtual filesystem switch)虚拟文件切换目录树有用到类似这样的结构表。上面的输出信息,在一般的linux启动过程中都会看到。POSIX conformance testing by UNIFIXconformance:顺应, 一致。即POSIX适应性检测。UNIFIX是一家德国的技术公司,Linux 原本要基于 POSIX.1 的, 但是 POSIX 不是免费的, 而且 POSIX.1 证书相当昂贵. 这使得 Linux 基于 POSIX 开发相当困难. Unifix公司(Braunschweig, 德国) 开发了

25、一个获得了 FIPS 151-2 证书的 Linux 系统. 这种技术用于 Unifix 的发行版 Unifix Linux 2.0 和 Lasermoon 的 Linux-FT。在2.6的内核中就将上面的这句输出给拿掉了。第二节:用户模式( user_mode )开始,start_kernel结束图 3:用户模式初始化PCI: bus0: Fast back to back transfers disabledPCI: Configured XX as a PCI slave with 128MB PCI memoryPCI: Each Region size is 16384KBPCI:

26、Reserved memory from 0x10080000 to 0x15080000 for DMA and mapped to 0x12000000设备的初始化 init()-do_basic_init()-pci_init(),初始化PCI,检测系统的PCI设备。Linux NET4.0 for Linux 2.4Based upon Swansea University Computer Society NET3.039英国威尔士,斯旺西大学的NET3.039, TCP/IP 协议栈。此信息,在linux启动过程中都会出现。Initializing RT netlink socke

27、t对Socket的初始 化,socket_init(),Netlink 一种路由器管理协议(linux-2.4.22netcoreRtnetlink.c,Routing netlink socket interface: protocol independent part。 其中RT是route路由的意思。这句输出是在create产生rtnetlink的socket套接字时的一个调试输出。)此信息,在linux启动过程中都会出现。Starting kswapd启动交换守护进程kswapd,进程IO操作例程kpiod。kswapd 可以配合kpiod运行。进程有时候无事可做,当它运行时也不一定需

28、要把其所有的代码和数据都放在内存中。这就意味着我们可以通过把运行中程序不用的内容 切换到交换分区来更好的是利用内存。大约每隔1秒,kswapd醒来并检查内存情况。如果在硬盘的东西要读入内存,或者内存可用空间不足,kpiod就会 被调用来做移入/移出操作。kswapd负责检查,kpiod负责移动。Journalled Block Device driver loaded加载日志块设备驱动。日志块设备是用来对文件系统进行日志记录的一个块设备。日志文件系统是在传统文件系统的基础上,加入文件系统更改的日志记录。它 的设计思想是:跟踪记录文件系统的变化,并将变化内容记录入日志。日志文件系统在磁盘分区中保

29、存有日志记录,写操作首先是对记录文件进行操作,若整个写操 作由于某种原因(如系统掉电)而中断,系统重启时,会根据日志记录来恢复中断前的写操作。在日志文件系统中,所有的文件系统的变化都被记录到日志,每隔一 定时间,文件系统会将更新后的元数据及文件内容写入磁盘。在对元数据做任何改变以前,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些 什么,然后它修改元数据。devfs: v1.12c (20020818) Richard Gooch (rgoochatnf.csiro.au)devfs: boot_options: 0x1Devfs模块的输出信息。设备文件系统devfs,版本1.

30、12cpty: 256 Unix98 ptys configuredPty模块的输出信息,与控制台操作有关的设置。将通过 devpts 文件系统使用 Unix98 PTYs,(Pseudo-ttys (telnet etc) device是伪ttys设备的缩写。 TTY(/dev/tty)是TeleTYpe的一个老缩写,为用户输入提供不同控制台的设备驱动程序。它的名字来源于实际挂接到 UNIX系统的、被称为电传打字机(teletype)的终端。在Linux下,这些文件提供对虚拟控制台的支持,可以通过按Alt-F1到 Alt-F6键来访问这些虚拟控制台。这些虚拟控制台提供独立的、同时进行的本地登

31、录对话过程 ttys(/dev/ttys)是计算机终端的串行接口。/dev/ttyS0对应MS-DOS下的 COM1。使 用 make dev脚本MAKEDEV来建立pty文件。这样系统内核就支持Unix98风格的pty了。在进行Telnet登录时将要用到/dev/pty设备。 pty是伪终端设备,在远程登录等需要以终端方式进行连接,但又并非真实终端的应用程序中必须使用这种设备,如telnet或xterm等程序。 Linux 2.2以后增添了UNIX98风格的Pty设备,它使用一个新的文件系统(devpts针对伪终端的文件系统)和一个克隆的设备cloning device来实现其功能。linux-2.4.22driverscharPty.c, 在devfs_mk_dir (NULL, pts, NULL);时会输出上面的信息。loop: loaded (max 8 devices)加载返还块设备

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

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