linux内核启动流程及busybox分析

本文详细探讨了Linux内核启动的过程,包括机器ID的比较、U-Boot传递参数的解析以及根文件系统的挂载。启动过程中,内核通过比较U-Boot传入的ID与自身支持的ID来确定是否兼容。接着,内核解析启动参数,执行由head.S编译的初始程序。在挂载根文件系统后,运行init进程,通常为Busybox。Busybox作为轻量级的程序集合,其init程序会读取配置文件并启动相应服务。通过对busybox源码的分析,可以了解最小根文件系统的需求和配置文件的格式。
摘要由CSDN通过智能技术生成

内核版本:linux-3.4


启动流程:
1、比较机器ID
2、解析u-boot传入的启动参数
3、挂接根文件系统、执行第一个应用程序


1、比较机器ID
打开 vmlinux.lds.S 里面可以找到内核把初始化参数的段定义为了”.arch.info.init”

.init.arch.info : {
    __arch_info_begin = .;
    *(.arch.info.init)
    __arch_info_end = .;
}

在内核源码的目录下可以输入指令查找一下谁调用了这个段:grep “.arch.info.init” * -nR
搜索到如下内容:

#define MACHINE_START(_type,_name)          \
    static const struct machine_desc __mach_desc_##_type    \    /* ##是连词符号 */  
     __used                         \
     __attribute__((__section__(".arch.info.init"))) = {    \
        .nr     = MACH_TYPE_##_type,        \
        .name       = _name,

    #define MACHINE_END             \
    };

定义了一个宏来指定,可以接着在 sourceinsight 工程里面去搜索 MACHINE_START 和 MACHINE_END 这两个宏,看下具体谁使用了它,搜索结果如下 :

MACHINE_START(SUNXI, "sun8i")

    .atag_offset    = 0x100,
    .init_machine   = sunxi_dev_init,
    .init_early     = sunxi_init_early,
    .map_io     = sunxi_map_io,
#ifndef CONFIG_OF
    .init_irq   = sun8i_gic_init,
#endif
    .handle_irq = gic_handle_irq,
    .restart    = sun8i_restart,
    .timer      = &sunxi_timer,
    .dt_compat  = NULL,
    .reserve    = sun8i_reserve,
    .fixup      = sun8i_fixup,
    .nr_irqs    = NR_IRQS,
#ifdef CONFIG_SMP
    .smp        = smp_ops(sunxi_smp_ops),
#ifdef CONFIG_ARCH_SUN8IW6
    .smp_init   = smp_init_ops(sun8i_smp_init_ops),
#endif
#endif

MACHINE_END

MACHINE_START 和 MACHINE_END 这两个就是定义一个结构体,这个结构体被强制的设置为一个属性,把它的段设置为 “.arch.info.init”,那么如果哪个文件下面有这些结构体的话,这些结构体就会被 vmlinux.lds.S 这个链接脚本组合在一起,我们可以把这段定义带入到刚才搜索到的那段 MA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值