我们在这里讨论的是对嵌入式linux系统的启动过程的输出信息的注释,通过我们的讨论,大家会对嵌入式linux启动过程中出现的、以前感觉熟悉的、但却又似是而非的东西有一个确切的了解,并且能了解到这些输出信息的来龙去脉。

咱们在管中窥豹评论的是对嵌入式Linux体系的发动进程的输出信息的注释,经过咱们的评论,咱们会对嵌入式linux发动进程中呈现的、曾经感觉了解的、但却又貌同实异的东西有一个切当的了解,并且能了解到这些输出信息的来龙去脉。

嵌入式linux发动信息彻底注释(linux添加注释)  嵌入式Linux 启动信息 注释 第1张

嵌入式linux的发动信息是一个很值得咱们去好好研讨的东西,它能将一幅缩影图呈现在咱们面前,来辅导咱们愈加深化地了解linux内核。

关键字:linux,嵌入式,发动,bootloader
正文
作为一名嵌入体系开发者,你必定遇到过下面的情形:
在某论坛上看到一篇帖子,上面贴着嵌入式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)
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体系的发动进程为例,来剖析这些输出信息。发动信息的原始内容将用符号标出,以差异与注释。

#P#

嵌入式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
将bootloader加载到内存ram中的0x90060000处,行将bootloader加载到内存的高端地址处。
Linux内核将被bootloader加载到0x90090000处。

Found boot configuration
查找到了发动boot的装备信息

Booted from parallel flash
从flash中发动代码,此处的flash为并行闪存。Flash的分类罗列如下:
闪存分三类:并行,串行,不行擦除。
①并行Parallel flash
 NOR Flash,Intel于1988年创造.随机读取的速度比较快,随机按字节写,每次能够传输8Bit。一般合适运用于数据/程序的存贮运用中.NOR还能够片内履行(execute-in-place)XIP.写入和擦除速度很低。
 NAND Flash,1989年,东芝公司创造.是以块和页为单位来读写的,不能随机拜访某个指定的点.因此相对来说读取速度较慢,而擦除和写入的速度则比较快,每次能够传输16Bit,一般适用在大容量的多媒体运用中,容量大。如:CF,SM.
②串行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。管中窥豹咱们罗列一下内存的类型及作业原理。
依据内存的作业原理能够区分出两种内存:DRAM和SRAM
①DRAM表明动态随机存取存储器。这是一种以电荷方法进行存储的半导体存储器。DRAM中的每个存储单元由一个晶体管和一个电容器组成。数据存储在电容器中。电容器会由于漏电而导致电荷丢掉,因此DRAM器材是不安稳的。为了将数据保存在存储器中,DRAM器材有必要有规则地进行改写。
②SRAM是静态的,因此只需供电它就会坚持一个值。一般来说,SRAM 比DRAM要快,这是由于SRAM没有改写周期。每个SRAM存储单元由6个晶体管组成,而DRAM存储单元由一个晶体管和一个电容器组成。比较而言,DRAM比SRAM每个存储单元的本钱要高。照此推理,能够判定在给定的固定区域内DRAM的密度比SRAM 的密度要大。

SRAM常常用于高速缓冲存储器,由于它有更高的速率;而DRAM常常用于PC中的主存储器,由于其具有更高的密度。
在嵌入式体系中运用DRAM内存的规划比较广泛。

地址辅佐阐明:
先阐明一下内存地址数字状况,首要是为了便利回忆。
能够拜访的内存为4G。
0x40000000是1GB处;0x00040000是256K处,0x00020000是128K处,0x90000000是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 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上别的区分区域来别离寄存。

VFS虚拟文件体系交流器
在linux体系中,现在现已开宣布多种文件体系,那么怎么让这些文件体系能共存在一个体系中呢,从linux 2.0开端,引入了虚拟文件体系办理器 VFS的概念。
Linux 下的文件体系首要可分为三大块:
① 一是上层的文件体系的体系调用,
② 二是虚拟文件体系交流器 VFS(Virtual Filesystem Switch),
③ 三是挂载到 VFS 中的各实践文件体系,例如 ext2,jffs 等。
VFS的切当叫法是Virtual Filesystem Switch虚拟文件体系交流器,管中窥豹的VFS中的“S”是指的switch,这个需求着重一下的,它很简略被混杂成“system”,假如了解成“system”将是不正确的,请多加留心。
VFS是详细文件体系filesystem的一个办理器。
VFS是Linux内核中的一个软件层,一种软件机制,它也供给了内核中的一个笼统功用,答应不同的文件体系共存,能够称它为 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的发动进程了。

#P#

第二部分 : 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.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.
预留内存巨细,在节点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:校准, 进入时延校准循环。检查CPU的MIPS(每秒百万条指令),Bogo是Bogus(伪)的意思。管中窥豹是对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:目录数据结构
② 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的内核中就将上面的这句输出给拿掉了。

#P#

第二节:用户方法( 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.c,Routing netlink socket interface: protocol independent part。 其间RT是route路由的意思。这句输出是在create发生rtnetlink的socket套接字时的一个调试输出。)
此信息,在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是伪终端设备,在长途登录等需求以终端方法进行衔接,但又并非实在终端的运用程序中有必要运用这种设备,如telnet或xterm等程序。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供货商Spansion。AMD因获利欠安,现已退出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 bytes的buffer缓冲不是每个块都有,是整个flash只需一个5 bytes的buffer,用写BUFFER指令对避实就虚的块进行写操作,都要用同一个buffer,写Buffer是首要检查buffer是否available,其实buffer起缓冲作用,来进步作业功率。
比方某flash有128个128K字节块。答应用户对恣意块进行字节编程和写缓冲器字节编程操作,每字节编程时刻为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上的内容将被映射到内存中的对应地址
前128K为BootLoader--->0x00000000-0x00020000
接着的128K为体系装备信息Config寄存的方位--->0x00020000-0x00040000
再后边的 16M - 2X128K 为romfs的寄存处.--->0x00040000-0x01000000
上面的内容,咱们能够依据前面的换算公式得到。

A> 编译的bootloader一般巨细约50K左右;
B> 在此处就知道了装备信息config是放在第2分区中的;
C> 制造的romfs的巨细,一般为8M或10M左右,所以能放得下;

嵌入式Linux内核的块设备驱动:
关于linux 的根文件体系,现在有三种块设备的驱动能够挑选,它们别离是:
a) Blkmem 驱动
b) MTD 驱动
c) RAM disk 驱动
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
调用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\ipv4\Route.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, IPv6和IrDA). SMP 对称多处理器—Symmetrical Multi Processing,管中窥豹首要是指UNIX的一些网络协议.

上面的关于网络的输出信息是在linux发动信息中都会呈现的。
加载各种文件体系
cramfs: wrong magic
会呈现“cramfs: wrong magic”,别忧虑这没有什么坏处,这个是kernel的书写bug,在2.6中有修正之,它是一个正告信息,用来检查cramfs的superblock超级块的。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 指令也不能处理这个问题。

#P#

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 (创立了一个约束最大运用内存为2M的ramdisk)
③ 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格局。
虚拟逻辑扇区巨细为20K,linux-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/GID、POSIX 权限和特别文件 (设备、命名管道等)功用,而不献身对 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.4的kernel中才有运用到。每次发动时内核会主动挂载devfs。
devfs供给了拜访内核设备的命名空间。它并不是树立或更改设备节点,devfs仅仅为你的特别文件体系进行保护。一般咱们能够手艺mknod创件设备节点。/dev目录开始是空的,里边特定的文件是在体系发动时、或是加载模组后驱动程序载入时树立的。当模组和驱动程序卸载时,文件就消失了。
Freeing init memory: 72K
开释1号用户进程in

转载请说明出处
知优网 » 嵌入式linux发动信息彻底注释(linux添加注释)

发表评论

您需要后才能发表评论