日期:2014-05-16 浏览次数:20698 次
最近公司要求调试一个内核,启动时有问题,所以就花了一点时间看看内核启动。
看的过程中总结了一点东西,希望可以帮助大家调试内核。
当我开始看的时候,第一件事是从网上搜集资料,不看不知道,一看吓一跳!牛人太多了,像这种内核启动的上古代码早就被人分析的彻彻底底。这注定我写的只能是烂微博了。
为了此微博有存在的必要,我会显示内核启动打印的代码位置(用绿色表示)及出现错误打印的原因(用红色表示),同时我会尽力用添加打印(用蓝色字,同时给出对应于本人平台的打印结果)或实例来说明一些细节。
注意我的是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
/*