您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

嵌入式linux启动信息完全表明

发布日期:2011-04-19

   我们在这里讨论的是对嵌入式linux体系的启动进程的输出信息的表明,通过我们的讨论,大家会对嵌入式linux启动进程中出现的、已往以为熟习的、但却又貌同实异的东西有一个确切的相识,并且能相识到这些输出信息的来龙去脉。嵌入式linux的启动信息是一个很值得我们去好好研究的东西,它能将一幅缩影图出如今我们面前目今目今,来引导我们越发深入地明白linux内核。


   正文

   作为一名嵌入体系开辟者,你肯定遇到过下面的情况:

在某论坛上看到一篇帖子,上面贴着嵌入式linux开辟板启动时的有关信息,然后大家在帖子里讨论着这个启动进程中出现的标题,随机举比喻下:

Linux version 2.4.20-uc0 (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

上面的这些输出信息,也大概包括你本身正在做的嵌入式linux开辟板的输出信息,此中的每一行,每一个字的含义,你是否追究过,大概说大部分的含义你能确切地知道的?本人想在这里连合本人在实践中一些了解来和宽大嵌入式linux的开辟者一起读懂这些信息。

我们在这里将以一个真实的嵌入式linux体系的启动进程为例,来阐发这些输出信息。启动信息的原始内容将用标记标出,以区别与表明。

 

嵌入式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-bootredboot等。

Loaded to 0x90060000

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

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

 

Found boot configuration

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

 

Booted from parallel flash

flash中启动代码,此处的flash为并行闪存。Flash的分类摆列如下:

闪存分三类:并行,串行,不可擦除。

①并行Parallel flash

NOR FlashIntel1988年发明.随机读取的速率比较快,随机按字节写,每次可以传输8Bit。一样通常得当应用于数据/步调的存贮应用中.NOR还可以片内实行(execute-in-place)XIP.写入和擦除速率很低。

NAND Flash1989年,东芝公司发明.因此块和页为单位来读写的,不克不及随机访问某个指定的点.因而相对来说读取速率较慢,而擦除和写入的速率则比较快,每次可以传输16Bit,一样通常实用在大容量的多媒体应用中,容量大。如:CFSM.

②串行Serial Flash 因此字节举行传输的,每次可以传输1-2Bit.如:MMC,SD,MS卡.串行闪存器件体积小,引脚也少,成本相对也更低廉。

③不可擦除Mask Rom Flash的特点是一次性录入数据,具有不可变动性,通常运用于游戏和需版权掩护文件等的录入。其明显特点是资源低。

过细:恣意flash器件的写入利用只能在空或已擦除的单位内举行,以是大多数环境下,在举行写入利用之前必须先实行擦除。NAND器件实行擦除利用好坏常大抵的,而NOR则恳求在举行擦除前先要将目标块内全部的位都写为0

从上面的信息,我们可以对flash典范特点有个比较明白的相识。

 

CPU clock rate: 200 MHz

开辟板上所利用的CPU的主频为200MHZ

 

DRAM size is 128MB (128MB/0MB)

动态内存ram大小为128M。这里我们摆列一下内存的典范及变乱原理。

根据内存的变乱原理可以分别出两种内存:DRAMSRAM

DRAM表现动态随机存取存储器。这是一种以电荷情势举行存储的半导体存储器。DRAM中的每个存储单位由一个晶体管和一个电容器构成。数据存储在电容器中。电容器会由于泄电而导致电荷丢失,因而DRAM器件是不稳固的。为了将数据生存在存储器中,DRAM器件必须有规律地举行改造。

SRAM是静态的,因此只要供电它就会保持一个值。一样通常而言,SRAM DRAM要快,这是由于SRAM没有改造周期。每个SRAM存储单位由6个晶体管构成,而DRAM存储单位由一个晶体管和一个电容器构成。相比而言,DRAMSRAM每个存储单位的资源要高。照此推理,可以断定在给定的牢固地区内DRAM的密度比SRAM 的密度要大。

 

SRAM通常用于高速缓冲存储器,由于它有更高的速率;而DRAM通常用于PC中的主存储器,由于其拥有更高的密度。

在嵌入式体系中利用DRAM内存的筹划比较广泛。

 

地点资助阐发:

先阐发一下内存地点数字环境,紧张是为了方便影象。

可以访问的内存为4G

0x400000001GB处;0x00040000256K处,0x00020000128K处,0x900000002GB多的地方。

1M->0x00100000,

2M->0x00200000,

8M->0x00800000

16M->0x01000000,

32M->0x02000000

256M->0x10000000

64K->0x00010000

4K->0x00001000

这个是个快速影象的要领,你可以根据地点中1的位置和其后0的个数来快速知道换算后的地点是在多少兆的地方。比如,1的反面50,代表1M的大小,60,代表16M,以此类推。

 

ROMFS found at 0x46040000, Volume name = rom 43f291aa

romfs,只读文件体系地点的地点为:0x46040000 (flash映射后的第3分区)

卷名为rom

romfsrootfs见解上有所区别。

 

flash在内存中的的肇始地点为0x46000000,ROMFSflash分区上的肇始位置为0x00040000,以是ROMFS在内存地点中的位置就为0x46040000。这个细节的部分可以参考flash分区时的地方,Creating 3 MTD partitions

 

romfs中包括kernelapp应用,不包括bootloaderfirmware信息头。romfs只读文件体系里的内容有很多种分类要领,我们可以将kernelapp同时放内里,作为根文件体系下的一个文件,也可以在flash上别的分别地区来分别存放。

 

VFS假造文件体系互换器

linux体系中,如今已经开辟出多种文件体系,那么怎样让这些文件体系能共存在一个别系中呢,从linux 2.0开始,引入了假造文件体系办理器 VFS的见解。

Linux 下的文件体系紧张可分为三大块:

     一是上层的文件体系的体系调用,

     二是假造文件体系互换器 VFS(Virtual Filesystem Switch)

     三是挂载到 VFS 中的各实际文件体系,比喻 ext2jffs 等。

VFS的确切叫法是Virtual Filesystem Switch假造文件体系互换器,这里的VFS中的“S”是指的switch,这个须要夸大一下的,它很容易被殽杂成“system”,要是明白成“system”将是非法的,请多加过细。

VFS是细致文件体系filesystem的一个办理器。

VFSLinux内核中的一个软件层,一种软件机制,它也提供了内核中的一个抽象结果,容许差别的文件体系共存,可以称它为 Linux 的文件体系办理者,与它干系的数据布局只存在于物理内存当中。以是在每次体系初始化时期,Linux 都起紧张在内存当中布局一棵 VFS 的目次树。VFS 中的各目次其紧张用途是用来提供实际文件体系的挂载点。而rootfs将是这个目次树的根结点的(root),即 "/"目次,VFS的布局便是从这个rootfs开始的。有了VFS,那么对文件的利用将利用同一的接口,将来通过文件体系调用对 VFS 提倡的文件利用等指令将被 rootfs 文件体系中相应的函数接口所承继。

 

过细: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 = 0xcbd73adb

Computed CRC = 0xcbd73adb

做开释后的CRC查抄

Boot kernel at 0x90090000 with ROMFS at 0x46040000

kernel已经被从romfs中开释到内存地点0x90090000处,可以跳转到此处启动kernel了,这里是指定的kernel的肇始地点

Press 'enter' to boot

体系等待启动,反面将看到linux kernel的启动进程了。

 

第二部分 : linux内核初始化以及启动

第一节:start_kernel

Linux的源代码可以从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.cstart_kernel启动函数.

嵌入式linux利用的是linux内核版本为2.4.22

linux source code代码中start_kernel中输出的linux_banner信息。这个信息是每个linux kernel都市打印一下的信息,要是你没有把这句去失的话。

 

Found bootloader memory map at 0x10000fc0.

bootloader颠末内存映射后的地点为:0x10000fc0, 按上面的地点换算要领,1反面有70,那么假造地点256M左右处。

Processor: ARM pt110 revision 0

pT110ARM微处理惩罚处罚器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.

预留内存大小,在节点0上统共20, zone(0) 设置最小内存为12MB, zone(1)zone(2)0页。告诫:对齐非法

Kernel command line: root=/dev/mtdblock3

Kernel 启动下令设为:/dev/mtdblock3(在反面的阐发中会看到mtdblock3是指的flash上的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: setup_console @ 115

串口设置值为115200,此为波特率输出信息。对串口设置的信息做一个打印的办法,在调试时会非常有效。

Calibrating delay loop... 82.94 BogoMIPS

Calibrate:校准, 进入时延校准循环。查抄CPUMIPS(每秒百万条指令)BogoBogus()的意思。这里是对CPU举行一个及时测试,来得到一个大概的MIPS数值

Bogomips,是由linus Torvalds写的, Linux利用体系中衡量谋略机处理惩罚处罚器运行速率的一种标准。提供这种度量的步调被称为BogoMips,当启动谋略机时,BogoMips能表现体系选项是否处于最佳性能。

linux内核中有一个函数calibrate_delay(),它可以谋略出cpu在一秒钟内实行了多少次一个极短的循环,谋略出来的值颠末处理惩罚处罚后得到BogoMIPS

你可以将谋略机的bogomips与谋略机处理惩罚处罚器的bogomips举行比较。Torvalds称这个步调为BogoMips来表现两台谋略机间的性能度量是错误的,由于并非全部起作用因素都能被表现出来或被承认。只管谋略机基准中通常用到MIPS,但环境的变革容易导致度量的错误。Bogomips能测出一秒钟内某步调运行了多少次。

观察/proc/cpuinfo文件中的着末一行也能得到这个数值。

上面这个输出,在全部的linux体系启动中都市打印出来。

 

进入内存初始化

mem_init(void), [arch/i386/mm/init.c]

Memory: 80MB = 80MB total

Memory: 76592KB available (1724K code, 2565K data, 72K init)

当前内存利用环境,将列出总的内存大小, 及分派给内核的内存大小:包括代码部分,数据部分,初始化部分,统共恰好4M。请当心此处的内核的内存大小的各个值。

 

进入假造文件体系VFS初始化

vfs_caches_init()

Dentry cache hash 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)

名词:

     Dentry:目次数据布局

     Inodei节点

     Mount cache:文件体系加载缓冲

     buffer cache:内存缓冲区

     Page Cache:页缓冲区

Dentry目次数据布局(目次入口缓存),提供了一个将路径名转化为特定的dentry的一个快的查找机制,Dentry只存在于RAM中;

i节点(inode)数据布局存放磁盘上的一个文件或目次的信息,i节点存在于磁盘驱动器上;存在于RAM中的i节点便是VFSi节点,dentry所包括的指针指向的便是它;

buffer cache内存缓冲区,雷同kupdated,用来在内存与磁盘间做缓冲处理惩罚处罚;

Page Cache 用来加快对磁盘上映像和数据的访问。

在内存中创建各个缓冲hash表,为kernel对文件体系的访问做准备。

VFSvirtual 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

英国威尔士,斯旺西大学的NET3.039, TCP/IP 协议栈

此信息,在linux启动进程中都市出现。

Initializing RT netlink socket

Socket的初始化,socket_init()Netlink 一种路由器办理协议(linux-2.4.22\net\core\Rtnetlink.cRouting netlink socket interface: protocol independent part 此中RTroute路由的意思。这句输出是在create孕育孕育产生rtnetlinksocket套接字时的一个调试输出。)

此信息,在linux启动进程中都市出现。

Starting kswapd

启动互换保卫进程kswapd,进程IO利用例程kpiod

kswapd可以共同kpiod运行。进程偶然偶尔间无事可做,当它运行时也不肯定须要把其全部的代码和数据都放在内存中。这就意味着我们可以通过把运行中步调不消的内容切换到互换分区来更好的是利用内存。约莫每隔1秒,kswapd醒来并查抄内存环境。要是在硬盘的东西要读入内存,大概内存可用空间不敷,kpiod就会被调用来做移入/移出利用。kswapd认真查抄,kpiod认真移动。

Journalled Block Device driver loaded

加载日记块配置驱动。

日记块配置是用来对文件体系举行日记记录的一个块配置。日记文件体系是在传统文件体系的底子上,参加文件体系变动的日记记录。

它的筹划头脑是:跟踪记录文件体系的变革,并将变革内容记录入日记。日记文件体系在磁盘分区中生存有日记记录,写利用起首是对记录文件举行利用,若整个写利用由于某种缘故因由(如体系失电)而克制,体系重启时,会根据日记记录来光复克制前的写利用。在日记文件体系中,全部的文件体系的变革都被记录到日记,每隔肯定时间,文件体系会将更新后的元数据及文件内容写入磁盘。在对元数据做恣意变革已往,文件体系驱动步调会向日记中写入一个条款,这个条款形貌了它将要做些什么,然后它修改元数据。

devfs: v1.12c (20020818) Richard Gooch (rgooch@atnf.csiro.au)

devfs: boot_options: 0x1

Devfs模块的输出信息。

配置文件体系devfs,版本1.12c

pty: 256 Unix98 ptys configured

Pty模块的输出信息,与控制表面利用有关的设置。

将通过 devpts 文件体系利用 Unix98 PTYs,(Pseudo-ttys (telnet etc) device是伪ttys配置的缩写。

              TTY(/dev/tty)TeleTYpe的一个老缩写,为用户输入提供差别控制表面的配置驱动步调。它的名字源头于实际挂接到 UNIX体系的、被称为电传打字机(teletype)的终端。在Linux下,这些文件提供对假造控制表面的支持,可以通过按<Alt-F1>到<Alt-F6>键来访问这些假造控制表面。这些假造控制表面提供独立的、同时举行的本地登录对话进程

              ttys(/dev/ttys)是谋略机终真个串行接口。/dev/ttyS0映射MS-DOS下的 COM1

利用 make dev脚本MAKEDEV来创建pty文件。如许体系内核就支持Unix98风格派头风格派头的pty了。在举行Telnet登录时将要用到/dev/pty配置。 pty是伪终端配置,在长途登录等须要以终端正式举行连接,但又并非真实终真个应用步调中必须利用这种配置,如telnetxterm等步调。Linux 2.2以后添加了UNIX98风格派头风格派头的Pty配置,它利用一个新的文件体系(devpts针对伪终真个文件体系)和一个克隆的配置cloning device来实现其结果。

linux-2.4.22\drivers\char\Pty.c, devfs_mk_dir (NULL, "pts", NULL);时会输出上面的信息。

 

loop: loaded (max 8 devices)

加载返还块配置驱动,最多支持8个配置

 

8139too Fast Ethernet driver 0.9.27

eth0: RealTek RTL8139 at 0x60112000, 00:10:0d:42:a0:03, IRQ 14

eth0: Identified 8139 chip type 'RTL-8100B/8139D'

网卡驱动,基地点为:0x60112000 MAC地点:00:10:0d:42:a0:03, 克制号:14

RTL8139 的汲取路径筹划成一个环形缓冲区(一段线性的内存,映射成一个环形内存)。当配置汲取到数据时,数据的内容就生存在这个环形缓冲区内并更新下个存储数据的地点(第一个数据包的开始地点+第一个数据包的长度)。配置会不绝生存缓冲区内的数据直到整个缓冲区耗尽。如许,配置会再次重写缓冲区内肇始位置的内容,就像一个环那样。

2.2 版内核升级到 2.4 版时, RTL-8139 支持模块已不再叫 rtl8139,而叫它 8139too,如今你再看到8139too就不会不明白它的来由了吧。

SCSI subsystem driver Revision: 1.00

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供货商SpansionAMD因赢利不佳,已经退出Flash市场,后续由Spansion合股公司策划.紧张生产NOR典范的flash,特点是容量小,速率快。Spansion牌号的flash,在我们开辟中会通常看到。以后大家看到Spansion的芯片,就能相识到它和AMD另有富士通的来龙去脉了。

Common flash Interface (CFI)是指一个同一的flash访问接口,表现这种flash是这种接口典范的。

Using buffer write method

利用flash写缓冲要领

flash提供了写BUFFER的下令来加快对flash上块的利用。对Flash擦除和写数据是很慢的。要是用写BUFFER的下令会快一点。据手册上说,会快20倍。Buffer Size 5 bytesbuffer缓冲不是每个块都有,是整个flash只有一个5 bytesbuffer,用写BUFFER下令对全部的块举行写利用,都要用同一个buffer,Buffer是紧张查抄buffer是否available,着实buffer起缓冲作用,来进步变乱屈从。

比如某flash128128K字节块。容许用户对恣意块举行字节编程和写缓冲器字节编程利用,每字节编程时间为210μs;若采取写缓冲器字节编程要领,32字节编程共需218μs,每字节编程时间仅为6.8μs。芯片的块擦除时间为1s,容许在编程或块擦除利用的同时举行悬挂克制去举行读利用,待读利用完成后,写入悬挂光复下令,再连续编程或块擦除。

 

Creating 3 MTD partitions on "XX mapped flash":

0x00000000-0x00020000 : "BootLoader"

0x00020000-0x00040000 : "Config"

0x00040000-0x01000000 : "Romfs"

此处为告急信息部分,须要分外当心。

在内存中映射过的flash,创建三个MTD分区:

flash上的内容将被映射到内存中的映射地点

128KBootLoader--->0x00000000-0x00020000

接着的128K为体系配置信息Config存放的位置--->0x00020000-0x00040000

再反面的 16M - 2X128K romfs的存放处.--->0x00040000-0x01000000

上面的内容,大家可以根据前面的换算公式得到。

 

A> 编译的bootloader一样通常大小约50K左右;

B> 在此处就知道了配置信息config是放在第2分区中的;

C> 制作的romfs的大小,一样通常为8M10M左右,以是能放得下;

 

嵌入式Linux内核的块配置驱动:

敷衍linux 的根文件体系,如今有三种块配置的驱动可以选择,它们分别是:

a Blkmem 驱动

b MTD 驱动

c) RAM disk 驱动

Blkmem 驱动是专门为嵌入式linux 开辟的一种块配置驱动,它是嵌入式linux体系中最为陈腐和通用的块配置驱动。它原理相对大抵但是配置比较巨大,须要根据你即的Flash的分区利用环境来修改代码。固然修改的结果是它可以对一些NOR型的Flash举行读写利用。不过如今支持的Flash典范不敷多。要是新参加对一种Flash的支持须要作的变乱量比较大。

LinuxMTD驱动是标准LinuxFlash驱动。它支持大量的配置,有富裕的结果来定义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

调用inet_init [ linux-2.4.22\net\ipv4\Af_inet.c ]时的输出信息, 在启动进程中被socket.c调用到。

IP Protocols: ICMP, UDP, TCP, IGMP

列出可以支持的IP协议,此处为kernel源代码inet_add_protocol(p);的输出。

linux启动进程中,都市看到这句的输出。

IP: routing cache hash table of 512 buckets, 4Kbytes

IP路由代码的输出信息。

ip_rt_init [ linux-2.4.22\net\ipv4Route.c ]Set the IP module up,路由缓冲hash

TCP: Hash tables configured (established 8192 bind 8192)

TCP协议初始化输出信息。tcp_init [ linux-2.4.22\net\ipv4\Tcp.c ],

NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.

UNIX网络协议信息。

af_unix_init[ linux-2.4.22\net\unix\Af_unix.c ], 多种连接的一种(IPv4, UNIX domain sockets, IPv6IrDA). SMP 对称多处理惩罚处罚器—Symmetrical Multi Processing,这里紧张是指UNIX的一些网络协议.

 

上面的关于网络的输出信息是在linux启动信息中都市出现的。

加载种种文件体系

cramfs: wrong magic

会出现“cramfs: wrong magic”,别担心这没有什么害处,这个是kernel的誊录bug,在2.6中有修改之,它是一个告诫信息,用来查抄cramfssuperblock超等块的。superblock也是VFS要用到的数据布局。

代码linux-2.4.22\fs\cramfs\Inode.c

2.4

cramfs_read_super(。。。)

/* Do sanity checks on the superblock */

       if (super.magic != CRAMFS_MAGIC) {

              /* check at 512 byte offset */

              memcpy(&super, cramfs_read(sb, 512, sizeof(super)), sizeof(super));

              if (super.magic != CRAMFS_MAGIC) {

                     printk(KERN_ERR "cramfs: wrong magic\n");

                     goto out;

              }

       }

 

2.6

if (super.magic != CRAMFS_MAGIC) {

                         if (!silent)

                                 printk(KERN_ERR "cramfs: wrong magic\n");

                         goto out;

                 }

超等块是文件体系的“头部”。它包括文件体系的状态、尺寸和空闲磁盘块等信息。要是粉碎了一个文件体系的超等块(比喻不鉴戒直接将数据写到了文件体系的超等块分区中),那么体系大概会完全不辨认该文件体系,如许也就不克不及摆设它了,纵然采取e2fsck 下令也不克不及处理惩罚处罚这个标题。

 

Cramfs文件体系:

cramfs Linus Torvalds 本人开辟的一个实用于嵌入式体系的小文件体系。由于它是只读的,以是,固然它采取了 zlib 做压缩,但是它还是可以做到高效的随机读取。 cramfs 不会影响体系读取文件的速率,又是一个高度压缩的文件体系。

我们制作image文件之后,我们还要思量怎样才华在体系运行的时间,把这个 image 文件 mount 上来,成为一个可用的文件体系。由于这个 image 文件不是一个通常意义上的 block 配置,我们必须采取 loopback 配置来完成这一任务,如:

mount -o loop -t cramfs /usr.img /usr

如许,就可以颠末 loopback 配置,把 usr.img 这个 cramfs image 文件 mount /usr 目次上去了。内核中须要对loopback这个配置的支持。

cramfs 的压缩屈从一样通常都能到达将近 50%

Cramfs通过优化索引节点表的尺寸和撤除传统文件体系中文件之间的空间浪费来到达节流空间的目标。它还利用了zlib压缩,实现优于2:1的压缩比例。解压缩进程的体系开销并不是很大,由于Cramfs支持指定单块的解压,而并不必解压缩整个文件。

Cramfs不但能节流空间,还能克制非正常关机导致的等待fsck或手工举行fsck的贫苦。它通过只读的要领到达这一目标。

RamDisk有三种实现要领:

Linux中可以将一部分内存mount为分区来利用,通常称之为RamDisk,分为:

Ramdisk, ramfs, tmpfs.

第一种便是传统意义上的,可以格局化,然后加载。

这在Linux内核2.0/2.2就已经支持,其不敷之处是大小牢固,之后不克不及变革。

为了可以大概利用Ramdisk,我们在编译内核时须将block device中的Ramdisk支持选上,它下面另有两个选项,一个是设置Ramdisk的大小,默认是4096k;另一个是initrd的支持。

要是对Ramdisk的支持已经编译进内核,我们就可以利用它了:

起首查察一下可用的RamDisk,利用ls /dev/ram*

起首创建一个目次,比如test,运行mkdir /mnt/test

然后对/dev/ram0 创建文件体系,运行mke2fs /dev/ram0

着末挂载 /dev/ram0,运行mount /dev/ram /mnt/test,就可以象对平常硬盘一样对它举行利用了。

另两种则是内核2.4才支持的,通过Ramfs大概Tmpfs来实现:

它们不需颠末格局化,用起来机动,其大小随所须要的空间而增长或淘汰。

Ramfs顾名思义是内存文件体系,它处于假造文件体系(VFS)层,而不像ramdisk那样基于假造在内存中的其他文件体系(ex2fs)

因而,它无需格局化,可以创建多个,只要内存富裕,在创建时可以指定其最大能利用的内存大小。

要是你的Linux已经将Ramfs编译进内核,你就可以很容易地利用Ramfs了。创建一个目次,加载Ramfs到该目次即可:

# mkdir /testRam

# mount -t ramfs none /testRAM

缺省环境下,Ramfs被限定最多可利用内存大小的一半。可以通过maxsize(以kbyte为单位)选项来变革。

# mount -t ramfs none /testRAM -o maxsize=2000 (创建了一个限定最大利用内存为2Mramdisk)

Tmpfs是一个假造内存文件体系,它差别于传统的用块配置情势来实现的Ramdisk,也差别于针对物理内存的Ramfs

Tmpfs可以利用物理内存,也可以利用互换分区。在Linux内核中,假造内存资源由物理内存(RAM)和互换分区构成,这些资源是由内核中的假造内存子体系来认真分派和办理。

Tmpfs向假造内存子体系恳求页来存储文件,它同Linux的别的恳求页的部分一样,不知道分派给本身的页是在内存中还是在互换分区中。同Ramfs一样,其大小也不是牢固的,而是随着所须要的空间而动态的增减。

利用tmpfs,起首你编译内核时得选择"假造内存文件体系支持(Virtual memory filesystem support"

然后就可以加载tmpfs文件体系了:

# mkdir -p /mnt/tmpfs

# mount tmpfs /mnt/tmpfs -t tmpfs

同样可以在加载时指定tmpfs文件体系大小的最大限定:

# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m

FAT: bogus logical sector size 21072

细致的文件体系FAT格局。

假造逻辑扇区大小为20Klinux-2.4.22\fs\fat\Inode.c

在初始化MS-DOS文件体系时,读MS-DOS文件体系的superblock,函数fat_read_super中输出的上面的信息。

UMSDOS: msdos_read_super failed, mount aborted.

UMSDOS:一种文件体系,特点容量大但相对而言不大稳固。是Linux 利用的扩展了的DOS文件体系。它在 DOS 文件体系下增长了长文件名、 UID/GIDPOSIX 权限和分外文件 (配置、定名管道等)结果,而不断送对 DOS 的兼容性。容许一个平常的msdos文件体系用于Linux,并且无须为它创建单独的分区,分外得当早期的硬盘空间不敷的硬件条件。

VFS: Mounted root (romfs filesystem) readonly

假造文件体系VFS(Virtual Filesystem Switch)的输出信息。

再次夸大一下一个见解。VFS 是一种软件机制,也可称它为 Linux 的文件体系办理者,它是用来办理实际文件体系的挂载点,目标是为了能支持多种文件体系。kernel会先在内存中创建一颗 VFS 目次树,是内存中的一个数据东西,然后在其下挂载rootfs文件体系,还可以挂载其他典范的文件体系到某个子目次上。

Mounted devfs on /dev

加载devfs配置办理文件体系到dev摆设点上。

/dev是我们通常会用到的一个目次。

2.4kernel中才有利用到。每次启动时内核会主动挂载devfs

devfs提供了访问内核配置的定名空间。它并不是创建或变动配置节点,devfs只是为你的分外文件体系举行维护。一样通常我们可以手工mknod创件配置节点。/dev目次最初是空的,内里特定的文件是在体系启动时、或是加载模块后驱动步调加载时创建的。当模块和驱动步调卸载时,文件就消散了。

Freeing init memory: 72K

开释1号用户进程init所占用的内存。

 

第三节:加载linux内核完毕,转入cpu_idle进程

 

体系启动进程中进程环境:

init进程

一样通常来说, 体系在跑完 kernel bootstrapping 内核引导自举后(被装入内存、已经开始运行、已经初始化了全部的配置驱动步调和数据布局等等) 就去运行 init『万process之父』, 有了它, 才华开始跑其他的进程,因此,init进程,它是内核启动的第一个用户级进程,它的进程号总是1

你可以用进程查察下令来验证

# ps aux

PID Uid VmSize Stat Command

1 0 SW init

2 0 SW [keventd]

3 0 SWN [ksoftirqd_CPU0]

4 0 SW [kswapd]

5 0 SW [bdflush]

6 0 SW [kupdated]

7 0 SW [rbwdg]

9 0 SW [mtdblockd]

10 0 SW [khubd]

80 0 SW [loop0]

别的 Linux 有两个 kernel 类的 process 也开始跑了起来,一个是 kflushd/bdflush,另一个是 kswapd

只有这个 init 是完全属于 user 类的进程, 后两者是 kernel假借 process 进程之名挂在进程上。

init有很多很告急的任务,比如象启动getty(用于用户登录)、实现运行级别、以及处理惩罚处罚孤单进程。

init 一开始就去读 /etc/inittab (init初始化表),初始化表是按肯定格局分列的关于进程运行时的有关信息的。init步调须要读取/etc/inittab文件作为其活动指针。这个 inittab 中敷衍各个runlevel运行级别要跑哪些 rc spawn 生出什么有很明白的设置。

一样通常, Linux中初始化脚本在/etc/inittab 文件(或称初始化表)中可以找到关于差别运行级别的形貌。inittab因此活动单位的形貌性(非实行性)文本,每一个指令行都是牢固格局

inittab中有respawn项,但要是一个下令运行时失败了,为了克制重运行的频率太高,init将追踪一个下令重运行了多少次,并且要是重运行的频率太高,它将被延时五分钟后再运行。

kernel进程

A> 请过细init1号进程,其他进程id分别是kflushd/ bdflush, kupdate, kpiod and kswapd。这里有一个要指出的:你会过细到假造占用(SIZE)和实际占用(RSS)列都是0,进程怎么会倒霉用内存呢?

这些进程便是内核保卫进程。大部分内核并不表如今进程列表里。保卫进程在init之后启动,以是他们和其他进程一样有进程ID,但是他们的代码和数据都存放在内核占据的内存中。在列表中利用中括号来区别与其他进程。

B> 输入和输出是通过内存中的缓冲来完成的,这让变乱变得更快,步调的写入会存放在内存缓冲中,然后再一起写入硬盘。保卫进程kflushdkupdate 办理这些变乱。kupdate克制的变乱(每5秒)来查抄是否有写过的缓冲,如过有,就让kflushd把它们写入磁盘。

C> 进程偶然偶尔间无事可做,当它运行时也不肯定须要把其全部的代码和数据都放在内存中。这就意味着我们可以通过把运行中步调不消的内容切换到互换分区来更好的是利用内存。把这些进程数据移入/移出内存通过进程IO办理保卫进程kpiod和互换保卫进程kswapd,约莫每隔1秒,kswapd醒来并查抄内存环境。要是在硬盘的东西要读入内存,大概内存可用空间不敷,kpiod就会被调用来做移入/移出利用。

D> bdflush - BUF_DIRTY, dirty缓存写回到磁盘的内核保卫进程。 敷衍有很多脏的缓冲区(包括必须同时写到磁盘的数据的缓冲区)的体系提供了动态的相应。它在体系启动的时间作为一个内核线程启动,它叫本身为“kflushd”,而这是你用ps表现体系中的进程的时间你会看得的名字。即定期(5秒)将脏(dirty)缓冲区的内容写入磁盘,以腾出内存;

E> ksoftirqd_CPUx 是一个去世循环, 认真处理惩罚处罚软克制的。它是用来对软克制行列步队举行缓冲处理惩罚处罚的进程。当孕育产生软克制时,体系并不急于处理惩罚处罚,只是将相应的cpu的克制状态布局中的active 的相应的位,置位,并将相应的处理惩罚处罚函数挂到相应的行列步队,然后等待调理机会到临,再来处理惩罚处罚.

ksoftirqd_CPUx是由cpu_raise_softirq()cpu触发克制,唤醒的内核线程,这涉及到软克制,ksoftirqd的代码拜见 [kernel/softirq.c]

F> keventd,它的任务便是实行 scheduler 调理器行列步队中的任务,keventd 为它运行的任务提供了可预期的进程上下文。

G> khubd, 是用来检测USB hub配置的,当usb有动态插拔时,将交由此内核进程来处理惩罚处罚。在检测到有hub变乱时会有相应的办法(usb_hub_events()

H> mtdblockd是用来对flash块配置举行写利用的保卫进程。

NAND典范的Flash须要MTD(Memory Technology Devices 内存技能驱动步调)驱动的支持才华被linux所利用。

NAND的特点是不克不及在芯片内实行(XIPeXecute In Place),须要把代码读到体系RAM中再实行,传输屈从不是最高,最大擦写次数量为一百万次,但写入和擦除的速率很快,擦除单位小,是高数据存储密度的最佳选择。

NAND须要I/O接口,因此利用时须要驱动步调。

I> loop0 是认真处理惩罚处罚loop块配置的(回环配置)loopback device指的便是拿文件来仿照块配置, 在我们这里,loop配置紧张用来处理惩罚处罚须要mount到板上的文件体系,雷同mount /tmp/rootfs /mnt -o loop.我们的实例有:mount -o loop -t cramfs /xxx.bin /xxx 也便是将xxx.bin这个文件mount到板上来仿照cramfs压缩ram文件体系。loop0进程认真对loop配置举行利用。

loopback配置和其他的块配置的利用要领雷同。分外的是,可以在该配置上创建一个文件体系,然后利用mount下令把该体系映射到某个目次下以便访问。这种整个创建在一个平常磁盘文件上的文件体系,便是假造文件体系 (virtual file system)

 

总结:

上面的内容是本人为了在实际开辟中越发明白地相识嵌入式linux的启动进程而做的一个总结性的文章。

在对嵌入式linux的启动进程做了一个过细表明后,大家会对涉及到嵌入体系的各个见解有了一个越发明白的相识,并能对嵌入体系的软硬件环境的有关设置越发明白。当你本身动手连合linux源代码来阐发时,将会有一个明白的全局观。

如今,你要是再转头去看文章前面所列出的启动信息例子中的内容,此中80%的内容,你如今应该能看懂它的来龙去脉了。