<script type="text/javascript"></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

uclinux启动的详细过程有着诸多的信息可以给我们巨大的启发,我们在这里讨论的就是要 对这些信息做一个具体细致的分析,通过我们的讨论,大家会对uclinux启动过程中出现的、以前感觉熟悉的、但却又似是而非的东西有一个确切的了解,并 且能了解到这些输出信息的来龙去脉。

uclinux的启动过程,它是一幅缩影图,对它有了一个详细的了解后,有助于指导我们更加深入地了解uclinux的核心。

大家对uclinux的启动应该都比较熟悉,作为一名嵌入系统开发者,你一定遇到过下面的情景:
在某论坛上看到一篇帖子,上面贴着uclinux开发板启动时的一堆信息,然后大家在帖子里讨论着这个启动过程中出现的问题,随机举例如下:

Linux version 2.4.20-uc1 (root@Local) (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 三 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 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 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 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) <mac@os.nctu.edu.tw> 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, 4Kbytes TCP: Hash tables configured (established 1024 bind 1024) VFS: Mounted root (romfs Freeing init memory: 40K

上面的这些输出信息,也可能包括你自己正在做的uclinux开发板的输出信息,其中的每一行,每一个字的含义,你是否深究过,或者说大部分的含义你能确切地知道的?本人想在这里结合本人在实践中一些体会来和广大uclinux的开发者一起读懂这些信息。

我们在这里将以一个真实的uclinux系统的启动过程为例,来分析这些输出信息。启动信息的原始内容将用标记标出,以区别与注释。

uclinux的启动主要分为两个阶段:

  • ① 第一部分bootloader启动阶段
  • ② 第二部分linux 内核初始化和启动阶段
    • 第一节:start_kernel
    • 第二节:用户模式( user_mode )开始,start_kernel结束
    • 第三节:加载linux内核完毕,转入cpu_idle进程

第一部分 : bootloader启动

图 1:uclinux启动状态转移示意图

Boot loader v0.12NOTE: this boot loader is designed to boot kernels made with the2.4.xx releasesbootloader for XVBuilt at Nov 20 2005 10:12:35

Bootloader头信息,版本,编译时间等,这个因不同的bootloader的设计而有所不同,由此你能看出bootloader的版本信息,有很多使用的是通用的bootloader,如u-boot,redboot等。

Loaded to 0x90060000

将bootloader加载到内存ram中的0x90060000处,即将bootloader加载到内存的高端地址处。

Linux内核将被bootloader加载到0x90090000处。

Found boot configuration

查找到了启动boot的配置信息。

Booted from parallel flash

<script type="text/javascript"></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

从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系统中经常遇到的问题,解决的办法通常有使用静态内存、应用程序启动时预先分配大内存、使用内存池等。

地址辅助说明:

先说明一下内存地址数字情况,主要是为了方便记忆。

可以访问的内存为4G。0x40000000是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 on 0:00”的含义应该已经了解了。其中“VFS:”就是虚拟文件系统管理器操作时的输出信息了。

File linux.bin.gz found

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(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上另外划分区域来分别存放。

<script type="text/javascript"></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

uClinux 启动过程详细分析(一)相关推荐

  1. uClinux 启动过程详细分析

    uclinux启动的详细过程有着诸多的信息可以给我们巨大的启发,我们在这里讨论的就是要对这些信息做一个具体细致的分析,通过我们的讨论,大家会对uclinux启动过程中出现的.以前感觉熟悉的.但却又似是 ...

  2. IMX6Q 启动过程详细分析

    一.预览 本文主要对IMX6Q的启动过程进行分析,主要参考文档来自NXP官方文档IMX6DQRM.pdf,使用的uboot为NXP官方提供uboot-imx,使用的开发板为迅为iTOP-i.MX6.N ...

  3. Linux开机启动过程详细分析

    from: http://www.linuxidc.com/Linux/2007-11/8701.htm 由于操作系统正在变得越来越复杂,所以开机引导和关机下电的过程也越来越智能化.从简单的DOS系统 ...

  4. Android系统默认Home应用程序(Launcher)的启动过程源代码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...

  5. Android应用程序组件Content Provider的启动过程源代码分析(1)

             通过前面的学习,我们知道在Android系统中,Content Provider可以为不同的应用程序访问相同的数据提供统一的入口.Content Provider一般是运行在独立的进 ...

  6. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...

  7. Android系统默认Home应用程序 Launcher 的启动过程源代码分析

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在前面一 ...

  8. MOSFET导通、关断过程详细分析、损耗分析、米勒效应、datasheet解释

    一,MOSFET导通.关断过程详细分析(转)详见下 MOSFET导通.关断过程详细分析(转) - 知乎 二,弄懂mosfet的导通过程和损耗分析  详见下 弄懂MOS管的导通过程和损耗分析 三.MOS ...

  9. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)

    Step 13.  ActivityStack.startActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/ ...

  10. Linux启动过程详细介绍

    Linux启动过程详细介绍 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相 ...

最新文章

  1. Mac下安装Node.js
  2. MelGan原理与实践篇
  3. VUE中使用sass
  4. Android开发举步维艰,上弘法寺七七四十九天取得“真经”!
  5. 芝麻HTTP:redis-py的安装
  6. OSG造成屏幕闪烁,且鼠标不能操作的一行代码
  7. javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/el/ELResolver错误解决办法...
  8. Swift基本语法学习笔记
  9. 【Silverlight5矢量打印】如何用C#代码检测打印机和驱动是否支持PostScript
  10. C++ 函数参数3种传值方式(以交换两个数为例)
  11. 用了这么久,你真的真的明白 HttpClient 的实现原理了吗?
  12. 51 -leetcode 38 -字符串
  13. Java 在方法和作用域内的内部类
  14. WPS 2019使用技巧及WPS2019政府版最全合集
  15. 《陶哲轩实分析》阅读
  16. 迅雷软件一直出现崩溃问题的常见解决方法
  17. EastWave应用案例:机箱屏蔽效能仿真
  18. 互联网贷款大数据风控能做到什么程度?
  19. 大数据分析师与数据分析师_非分析师的数据分析
  20. 计算机学院篮球队介绍,计算机与信息学院男子篮球队荣获“抗疫杯”校篮球赛冠军采访纪实...

热门文章

  1. win2003修改密码后提示确认用户名及域无误_周知!贵州高考志愿填报系统提示!...
  2. 抖音姓名测试软件,抖音名字大全霸气
  3. adb 切换usb模式_adb调试命令,adb强制打开usb调试,adb命令打开usb调试
  4. pyhanlp常用功能简单总结
  5. 20155201李卓雯 20155212江振思 20155313杨瀚《信息安全技术》 实验三 数字证书应用...
  6. 网页实现数据离线永久保存localStorage、storage
  7. 2021年中国百香果果汁进出口贸易分析:贸易逆差明显,越南是主要进口国[图]
  8. no zuo no die _0_
  9. 腾讯天龙八部手游服务器账号上线,天龙八部手游服务器的注册已达到上限_服务器注册上限怎么解决_玩游戏网...
  10. 科研工具:公式书写神器(Mathpix Snipping Tool)