• 设备树和uboot启动,kernel启动


    dts->dtb->内核解析dtb->device_node->platform_device

    uboot还是通过bootm(do_bootm_linux)去启动内核,通过bootargs,过兼容tag传参与dtb传参数,kernel启动通过r0-r2传参数,ro=0,r1=machid,r2就是tag或者dtb,kernel_entry->自解压代码

    自解压部分arch/arm/boot/compressed/head.S

    CONFIG_ARM_APPEND_DTB(把zImage变成zImage-dtb)

    CONFIG_ARM_ATAG_DTB_COMPAT(uboot通过tag传参了,内核要能接受tag传参并转成dtb来追加到原来的dtb)

    atags_to_fdt(tag转换成fdt,即生成/chosen节点)

    bl decompress_kernle 真正执行解压kernel转换成可执行的elf格式

    bne __enter_kernel(mov pc r4 ) 跳转到内核

    kernel第一阶段arch/arm/kernel/head.S

    在__mmap_switched函数

    str r2, [r6] @save atags pointer

    .long __atags_pointer @r6

    b start_kernel1

    kernel第二阶段init/main.c start_kernel函数

    set_arch(&command_line)

    struct machine_desc定义在arch/arm/include/asm/mach目录下,kernle启动时会解析dtb中的模块信息,然后动态生成machine_desc

    mdesc = setup_machine_fdt(__atags_pointer);

    arm_memblock_init(mdesc)

    request_standard_resources

            unflatten_device_tree /*解包dtb操作*/

    arm_dt_init_cpu_maps //提取了cpu有关的节点,然后操作硬件设置cpu

    of_flat_dt_match_machine

    段属性:.arch.info.init __arch_info_begin __arch_info_end 

    early_init_dt_scan_nodes  

    of_scan_falt_dt

    deadbeef(asan)

    dtb解开后,of_root成为了解开后的dtb数据结结构的根结点指针,就是很多个device_node结构体变量形成的树状指针链接。

    of_find_node_by_path

  • 相关阅读:
    图解-虚拟机使用NAT方式连网
    easyexcel的使用
    0036力扣507题---完美数
    8种超简单的Golang生成随机字符串方式
    List 获取前N条数据
    linux环境下进程相关概念解释
    Springboot毕设项目动漫论坛5it8x(java+VUE+Mybatis+Maven+Mysql)
    同花顺_知识_庄家技法_1打压股价
    DC进阶-多周期约束详解
    【Linux】线程同步
  • 原文地址:https://blog.csdn.net/aa541850383/article/details/125117505