资源预览内容
第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
第9页 / 共17页
第10页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
uclinux:uClinux启动过程详细分析 疯狂代码 http:/CrazyCoder.cn/ :http:/CrazyCoder.cn/Linux/Article28302.html uc启动详细过程有着诸多信息可以给我们巨大启发我们在这里讨论就是要 对这些信息做个具体细致分析 通过我们讨论大家会对uc启动过程中出现、以前感觉熟悉、但却又似是而非东西有个确切了解并 且能了解到这 些输出信息来龙去脉 uclinux启动过程它是幅缩影图对它有了个详细了解后有助于指导我们更加深入地了解uclinux核心 大家对uclinux启动应该都比较熟悉作为名嵌入系统开发者你定遇到过下面情景:在某论坛上看到篇帖子上 面贴着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 http:/www.snapgear.com/) #20 3 6月 1 8 00:58:31 CST 2003 Processor: Samsung S3C4510B revision 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 entries: 2048 (order: 2, 16384 s) Inode cache hash table entries: 1024 (order: 1, Mount-cache hash table entries: 512 (order: 0, 4096 s) Buffer-cache hash table entries: 1024 (order: 0, 4096 s) Page-cache hash table entries: 4096 (order: 2, 16384 s) POSIX conformance testing by UNIFIX Linux NET4.0 for Linux 2.4 Based upon Swansea University Computer Society NET3.039 Initializing RT netlink 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 S3C451 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 NET4: Linux TCP/IP 1.0 for NET4.0 IP Protocols: ICMP, UDP, TCP IP: routing cache hash table of 512 buckets, 4Ks TCP: Hash tables configured (established 1024 bind 1024) VFS: Mounted root (romfs Freeing init memory: 40K 上面这些输出信息也可能包括你自己正在做uclinux开发板输出信息其中每行每个字含义你是否深究过或者 说大部分含义你能确切地知道?本人想在这里结合本人在实战中些体会来和广大uclinux开发者起读懂这些信息 我们在这里将以个真实uclinux系统启动过程为例来分析这些输出信息启动信息原始内容将用标记标出以区 别和注释 uclinux启动主要分为两个阶段: 第部分bootloader启动阶段 第 2部分linux 内核化和启动阶段 第节:start_kernel第 2节:用户模式( user_mode )开始start_kernel结束第 3节:加载linux内核完毕转入 cpu_idle进程第部分 : bootloader启动 图 1:uclinux启动状态转移示意图 Boot loader v0.12NOTE: this boot loader is designed to boot kernels made with the2.4.xxreleasesbootloader for XVBuilt at Nov 20 2005 10:12:35 Bootloader头信息版本编译时间等这个因区别bootloader设计而有所区别由此你能看出bootloader版本 信息有很多使用是通用bootloader如u-bootredboot等 Loaded to 0x90060000 将bootloader加载到内存ram中0x90060000处即将bootloader加载到内存高端地址处 Linux内核将被bootloader加载到0x90090000处 Found boot configuration 查找到了启动boot配置信息 Booted from parallel flash 从flash中启动代码此处flash为并行闪存 注意:任何flash器件写入操作只能在空或已擦除单元内进行所以大多数情况下在进行写入操作的前必须先 执行擦除NAND器件执行擦除操作是十分简单而NOR则要求在进行擦除前先要将目标块内所有位都写为0 从上面信息我们可以对flash类型特点有个比较明确了解 CPU clock rate: 200 MHz 开发板上所使用CPU主频为200MHZ DRAM size is 128MB (128MB/0MB) 动态内存ram大小为128M 在嵌入式系统中使用DRAM内存设计比较广泛 在uclinux系统中系统运行时间较长后会出现内存碎片问题导致再分配大块内存时会失败这是在uclinux系 统中经常遇到问题解决办法通常有使用静态内存、应用启动时预先分配大内存、使用内存池等 地址辅助介绍说明: 先介绍说明下内存地址数字情况主要是为了方便记忆 可以访问内存为4G0x40000000是1GB处;0x00040000是256K处0x00020000是128K处0x90000000是 2GB多地方1M-0x00100000, 2M-0x00200000,8M-0x00800000,16M-0x01000000, 32M- 0x02000000,256M-0x10000000,64K-0x00010000,注意:rootfs并不是个具体文件系统类型如jffs它只是 个理论上概念在具体嵌入系统例子中可以将某种具体文件系统设置为根文件系统rootfs如我们可以设置romfs为 根文件系统也可以设置jffs为根文件系统 这里ROMFS只读文件系统只是种具体文件系统类型也是在嵌入系统中经常使用到类型 看完了上面内容以后你对出现类似“kernel Panic:VFS:Unable to mount root fs _disibledevent= 将romfs中linux kernel解压缩到0x90090000,的后会从这个内存地址启动内核romfs为压缩格式文件,使用压 缩只读文件系统是为了保持制作出来整 个系统所占用flash空间减小这个内核大小为1.3M左右这也是目前大多 数嵌入系统所使用思路方法 Inptr = 0x00000014(20)Inflating 释放 Outcnt = 0x0030e7c8(3205064)Final Inptr = 0x001414ad(1316013)Original CRC = 0xcbd73adbComputed CRC = 0xcbd73adb 做释放后CRC检查 Boot kernel at 0x90090000 with ROMFS at 0x46040000 kernel已经被从romfs中释放到内存地址0x90090000处可以跳转到此处启动kernel了这里是指定kernel起始地址 Press enter to boot 系统等待启动后面将看到linux kernel启动过程了 4K-0x00001000这个是个快速记忆思路方法你可以根据地址中1位置和其后0个数来快速知道换算后地址 是在多少兆地方比如1后面5个0代表1M大小6个0代表16M以此类推 ROMFS found at 0x46040000, Volume name = rom 43f291aa romfs,只读文件系统所在地址为:0x46040000 (flash映射后第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上另外划分区域来分 别存放 第节:start_kernel Linux源代码可以从 得到或者你可以查看linux代码交叉引用网站WebSite: 进行在线代码查看这是个很好 工具网站WebSite 在start_kernel中将到大量init来完成内核各种化如: 图 2:kernel start up化过程 化过程“ src=“http:/www.crazycoder.cn/WebFiles/20092/188e54f6-bd79-40a3-b869- 9cca469d02f9.jpg“ width=269 具体内容可以参考http:/lxr.linux.no/source/init/.c Linux version 2.4.22-uc0 (gcc version 2.95.3 20010315 (release) #33 .?1 20 12:09:106 上面代码输出信息是跟踪linux代码分析后得到进入
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号