欢迎来到天天文库
浏览记录
ID:18887398
大小:355.93 KB
页数:43页
时间:2018-09-26
《linux内核源码分析--内核启动命令行的传递过程(linux-3.0 armv7)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux内核源码分析--内核启动命令行的传递过程(Linux-3.0ARMv7)Linux内核在启动的时候需要一些参数,以获得当前硬件的信息或者启动所需资源在内存中的位置等等。这些信息可以通过bootloader传递给内核,比较常见的就是cmdline。以前我在启动内核的时候习惯性的通过uboot传递一个cmdline给内核,没有具体的分析这个过程。最近在分析内核启动过程的时候,重新看了一下内核启动参数的传递过程,彻底解决一下在这方面的疑惑。一、bootloader与内核的通讯协议内核的启动参
2、数其实不仅仅包含在了cmdline中,cmdline不过是bootloader传递给内核的信息中的一部分。bootloader和内核的通信方式根据构架的不同而异。对于ARM构架来说,启动相关的信息可以通过内核文档(Documentation/arm/Booting)获得。其中介绍了bootloader与内核的通信协议,我简单总结如下:(1)数据格式:可以是标签列表(taggedlist)或设备树(devicetree)。(2)存放地址:r2寄存器中存放的数据所指向的内存地址。在我所做过的开发中,
3、都是使用taggedlist的,所以下面以标签列表为例来介绍信息从bootloader(U-boot)到内核(Linux-3.0)的传递过程。内核文档对此的说明,翻译摘要如下:14a.设置内核标签列表2--------------------------------3bootloader必须创建和初始化内核标签列表。一个有效的标签列表以ATAG_CORE标签开始,且以ATAG_NONE标签结束。ATAG_CORE标签可以是空的,也可以是非空。一个空ATAG_CORE标签其size域设置为'2'(
4、0x00000002)。ATAG_NONE标签的size域必须设置为'0'。4在列表中可以保存任意数量的标签。对于一个重复的标签是追加到之前标签所携带的信息之后,还是覆盖原来整个信息,是未定义的。某些标签的行为是前者,其他是后者。5bootloader必须传递一个系统内存的位置和最小值,以及根文件系统位置。因此,最小的标签列表如下所示:6基地址->+-----------+7
5、ATAG_CORE
6、
7、8+-----------+
8、9
9、ATAG_MEM
10、
11、地址增长方向1+-----------+
12、2
13、
14、ATAG_NONE
15、
16、3+-----------+v4标签列表应该保存在系统的RAM中。5标签列表必须置于内核自解压和initrd'bootp'程序都不会覆盖的内存区。建议放在RAM的头16KiB中。(内核中关于ARM启动的标准文档为:Documentation/arm/Booting,我翻译的版本:《Linux内核文档翻译:Documentation/arm/Booting》)关于taggedlist的数据结构和定义在内核与uboot中都存在,连路径都相同:arch/arm/include/
17、asm/setup.h。uboot的定义是从内核中拷贝过来的,要和内核一致的,以内核为主。要了解标签列表的具体结构认真阅读这个头文件是必须的。一个独立的标签的结构大致如下:6structtag7+------------------------+8
18、structtag_headerhdr;
19、
20、1
21、标签头信息
22、
23、2+------------------------+
24、3
25、union{
26、
27、4
28、structtag_corecore;
29、
30、5
31、structtag_mem32mem;
32、
33、6
34、......
35、
36、
37、7
38、}u;
39、
40、8
41、标签具体内容
42、
43、9
44、此为联合体
45、
46、地址增长方向10
47、根据标签类型确定
48、
49、11+------------------------+v点击(此处)折叠或打开12structtag_header{13__u32size;//标签总大小(包括tag_header)14__u32tag;//标签标识15};比如一个ATAG_CORE在内存中的数据为:16+----------+1
50、00000005
51、
52、2
53、54410001
54、
55、3+----------+
56、4
57、00000000
58、
59、5
60、0000
61、0000
62、
63、地址增长方向6
64、00000000
65、
66、7+----------+v8当前在内核中接受的标签有:9ATAG_CORE:标签列表开始标志10ATAG_NONE:标签列表结束标志11ATAG_MEM:内存信息标签(可以有多个标签,以标识多个内存区块)12ATAG_VIDEOTEXT:VGA文本显示参数标签13ATAG_RAMDISK:ramdisk参数标签(位置、大小等)14ATAG_INITRD:压缩的ramdisk参数标签(位置为虚拟地址)15ATAG_INITRD2:压缩的ramdis
此文档下载收益归作者所有