linux内核源码分析--内核启动命令行的传递过程(linux-3.0 armv7)

linux内核源码分析--内核启动命令行的传递过程(linux-3.0 armv7)

ID:18887398

大小:355.93 KB

页数:43页

时间:2018-09-26

linux内核源码分析--内核启动命令行的传递过程(linux-3.0 armv7)_第1页
linux内核源码分析--内核启动命令行的传递过程(linux-3.0 armv7)_第2页
linux内核源码分析--内核启动命令行的传递过程(linux-3.0 armv7)_第3页
linux内核源码分析--内核启动命令行的传递过程(linux-3.0 armv7)_第4页
linux内核源码分析--内核启动命令行的传递过程(linux-3.0 armv7)_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。