日期:2014-05-16  浏览次数:20735 次

linux内核启动1-启动参数(启动参数的获取和处理,分析setup_arch)

最近公司要求调试一个内核,启动时有问题,所以就花了一点时间看看内核启动。

看的过程中总结了一点东西,希望可以帮助大家调试内核。

当我开始看的时候,第一件事是从网上搜集资料,不看不知道,一看吓一跳!牛人太多了,像这种内核启动的上古代码早就被人分析的彻彻底底。这注定我写的只能是烂微博了。

为了此微博有存在的必要,我会显示内核启动打印的代码位置(用绿色表示)及出现错误打印的原因(用红色表示),同时我会尽力用添加打印(用蓝色字,同时给出对应于本人平台的打印结果)或实例来说明一些细节


注意我的是linux-3.2.36,有的老版本machine的判断位置不一样。

首先看启动参数

http://blog.chinaunix.net/uid-20543672-id-3151113.html

有两种启动参数

标签列表(taggedlist)或设备树(devicetree)。

引导程序和内核约定r2寄存器中存放的数据所指向的内存地址。

说设备树的微博,可以看看下面这个

http://blog.csdn.net/21cnbao/article/details/8457546

这两个注意:

标签列表必须置于内核自解压和initrd'bootp'程序都不会覆盖的内存区。建议放在RAM的头16KiB中。

设备树必须置于内核自解压不会覆盖的内存区。建议将其放置于RAM的头16KiB中

我简单介绍标签列表格式

·  基地址 -> +-----------+

·           | ATAG_CORE | |

·          +-----------+  |

·           | ATAG_MEM |  | 地址增长方向

·          +-----------+  |

·           | ATAG_NONE | |

·          +-----------+  v

viarch/arm/include/asm/setup.h

struct tag_header {

      __u32size; //标签总大小(包括tag_header)

      __u32tag; //标签标识

};

上面的图就是要linux获取的第一个tag的头的__u32 tag要是ATAG_CORE

最后一个是ATAG_NONE。

struct tag {

        structtag_header hdr;

        union {

                struct tag_core         core;// 标签列表开始                struct tag_mem32        mem;// 内存信息标签(可以有多个标签,以标识多个内存区块)

               struct tag_videotext    videotext;// VGA文本显示参数标签

               struct tag_ramdisk      ramdisk;// ramdisk参数标签(位置、大小等)

               struct tag_initrd       initrd;// 压缩的ramdisk参数标签

               struct tag_serialnr     serialnr;// 板子串号标签

               struct tag_revision     revision;// 板子版本号标签

               struct tag_videolfb     videolfb;// 帧缓冲初始化参数标签

               struct tag_cmdline      cmdline;//就是uboot的bootargs

 

                /*