嵌入式linux的启动主要分为两个阶段:
① 第一部分bootloader启动阶段
② 第二部分linux 内核初始化和启动阶段 第一节:start_kernel 第二节:用户模式( user_mode )开始,start_kernel结束 第三节:加载linux内核完毕,转入cpu_idle进程
第一部分 : bootloader启动Boot loader v0.12
NOTE: this boot loader is designed to boot kernels made with the
2.4.xx releases
bootloader for XV
Built at Nov 20 2005 10:12:35
Bootloader头信息,版本,编译时间等,这个因不同的bootloader的设计而有所不同,由此你能看出bootloader的版本信息,有很多使用的是通用的bootloader,如u-boot,redboot等。 Loaded to 0x90060000
释放,解压中。。。(变大,充气,
膨胀) Outcnt = 0x0030e7c8(3205064)
Final Inptr = 0x001414ad(1316013)
Original CRC = 0xcbd73adb
Computed CRC = 0xcbd73adb
做释放后的CRC检查 Boot kernel at 0x90090000 with ROMFS at 0x46040000
kernel已经被从romfs中释放到内存地址0x90090000处,可以跳转到此处启动kernel了,这里是指定的kernel的起始地址 Press 'enter' to boot
系统等待启动,后面将看到linux kernel的启动过程了。
本文轉自:http://blog.chinaunix.net/u/17660/showart_285306.html第二部分 : 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_caches_init(num_physpages);
rest_init(); 具体内容可以参考[http://lxr.linux.no/source/init/main.c] Linux version 2.4.22-uc0 (root@local) (gcc version 2.95.3 20010315 (release)) #33 .?1.. 20 12:09:106
上面的代码输出信息,是跟踪linux代码分析后得到的,进入init目录下的main.c的start_kernel启动函数. 嵌入式linux使用的是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左右处。 Processor: ARM pt110 revision 0
pT110是ARM微处理器arm核的一种,另一种为pT100。此处为显示ARM的类型。 On node 0 totalpages: 20480
zone(0): 20480 pages.
zone(0): Set minimum memory threshold to 12288KB
Warning: wrong zone alignment (0x90080000, 0x0000000c, 0x00001000)
zone(1): 0 pages.
zone(2): 0 pages.
名词:
①
Dentry:目录数据结构
②
Inode:i节点
③
Mount cache:文件系统加载缓冲
④
buffer cache:内存缓冲区
⑤
Page Cache:页缓冲区
Dentry目录数据结构(目录入口缓存),提供了一个将路径名转化为特定的dentry的一个快的查找机制,Dentry只存在于RAM中;
i节点(inode)数据结构存放磁盘上的一个文件或目录的信息,i节点存在于磁盘驱动器上;存在于RAM中的i节点就是VFS的i节点,dentry所包含的指针指向的就是它;
buffer cache内存缓冲区,类似kupdated,用来在内存与磁盘间做缓冲处理;
Page Cache 用来加快对磁盘上映像和数据的访问。 在内存中建立各个缓冲hash表,为kernel对文件系统的访问做准备。
VFS(virtual filesystem switch)虚拟文件切换目录树有用到类似这样的结构表。 上面的输出信息,在一般的linux启动过程中都会看到。 POSIX conformance testing by UNIFIX
conformance:顺应,
一致。即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的内核中就将上面的这句输出给拿掉了。
第二节:用户模式( user_mode )开始,start_kernel结束PCI: bus0: Fast back to back transfers disabled
PCI: Configured XX as a PCI slave with 128MB PCI memory
PCI: Each Region size is 16384KB
PCI: 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.4
Based upon Swansea University Computer Society NET3.039
USB设备信息,USB会被当做SCSI来处理。 mumk_register_tasklet: (1) tasklet 0x905bf9c0 status @0x9025e974
软中断信息输出。Tasklet是在2.4中才出现,它是为了更好地利用多CPU。
Probing XX Flash Memory
探测 XX的闪存(Flash Memory),"NOR NAND Flash Memory Technology" Amd/Fujitsu Extended Query Table v1.3 at 0x0040
number of CFI chips: 1
AMD与富士通合资设立的Flash供货商Spansion。AMD因获利不佳,已经退出Flash市场,后续由Spansion合资公司经营.主要生产NOR类型的flash,特点是容量小,速度快。Spansion商标的flash,在我们开发中会经常看到。以后大家看到Spansion的芯片,就能了解到它和AMD还有富士通的来龙去脉了。
Common flash Interface (CFI)是指一个统一的flash访问接口,表示这种flash是这种接口类型的。 Using buffer write method
Blkmem 驱动是专门为嵌入式linux
开发的一种块设备驱动,它是嵌入式linux系统中最为古老和通用的块设备驱动。它原理相对简单但是配置比较复杂,需要根据你即的Flash的分区使用情况来修改代码。当然修改的结果是它可以对一些NOR型的Flash进行读写操作。不过目前支持的Flash类型不够多。如果新加入对一种Flash的支持需要作的工作量比较大。
Linux的MTD驱动是标准Linux的Flash驱动。它支持大量的设备,有足够的功能来定义Flash的分区,进行地址映射等等。使用MTD你可以在一个系统中使用不同类型的Flash。它可以将不同的Flash组合成一个线性的地址让你来使用。 在标准的Linux 2.4内核中MTD有一系列的选项,你可以根据个人系统的需要来选择,定制。 另外一种选择就是RAM disk
驱动。在PC上它经常用于没有硬盘的Linux的启动过程。它和Flash没有直接的关系。不过当Flash上启动的是经过压缩的内核时。RAM disk
可以作为根文件系统。
MTD 驱动提供了对Flash强大的支持,你通过它甚至可以在Flash上运行一个可以读写的真正的文件系统,比如JFFS2。而Blkmem驱动则望尘莫及。 NET4: Linux TCP/IP 1.0 for NET4.0
会出现“cramfs: wrong magic”,别担心这没有什么害处,这个是kernel的书写bug,在2.6中有修改之,它是一个警告信息,用来检查cramfs的superblock超级块的。superblock也是VFS要用到的数据结构。 代码linux-2.4.22fscramfsInode.c: 2.4
cramfs_read_super(。。。)
/* Do sanity checks on the superblock */