• day9-操作系统初始化函数init-2


    1.内核如何进行多平台的适配,在内核中是如何认识这些板子的?结构体 machine_desc

    2.内核启动的整体流程

    3.认识一种高效的编程结构

    链接脚本:vmlinux.lds.S

        .init.arch.info : {
            __arch_info_begin = .;
            *(.arch.info.init)         //代码段
            __arch_info_end = .;
        }

    ARCH.H 宏定义

    #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             \

    };

    各种板子的BSP文件中出现的宏定义调用

    MACHINE_START(SMDK4212, "SMDK4212")

        /* Maintainer: Kukjin Kim */

        .atag_offset    = 0x100,

        .init_irq   = exynos4_init_irq,

        .map_io     = smdk4x12_map_io,

        .handle_irq = gic_handle_irq,

        .init_machine   = smdk4x12_machine_init,

        .timer      = &exynos4_timer,

        .restart    = exynos4_restart,

    MACHINE_END

      宏展开: 

    1. #define MACHINE_START(SMDK4212, "SMDK4212")
    2. static const struct machine_desc __mach_desc_SMDK4212    \
    3.  __used                         \
    4.  __attribute__((__section__(".arch.info.init"))) = {    \
    5.     .nr     = MACH_TYPE_SMDK4212,        \
    6.     .name       = "SMDK4212",
    7. .atag_offset    = 0x100,
    8.     .init_irq   = exynos4_init_irq,
    9.     .map_io     = smdk4x12_map_io,
    10.     .handle_irq = gic_handle_irq,
    11.     .init_machine   = smdk4x12_machine_init,
    12.     .timer      = &exynos4_timer,
    13.     .restart    = exynos4_restart,
    14. };

    总结 machine_desc结构体,用于Linux做设备的识别结构体,这些结构体被限定在了内存的某一片区域

    并且通过UBOOT传过来的参数进行该结构体的配置(通过检索taglist的方式来设置)

    并且在移植Linux的时候 也要对结构体的变量进行赋值

    并且在之后的启动或其他函数中 对该结构体的变量进行调用

        mrc    p15, 0, r9, c0, c0        @ get processor id
        bl    __lookup_processor_type        @ r5=procinfo r9=cpuid

    __lookup_processor_type:
        adr    r3, __lookup_processor_type_data

    __lookup_processor_type_data:
        .long    .
        .long    __proc_info_begin
        .long    __proc_info_end

        .size    __lookup_processor_type_data, . - __lookup_processor_type_data

        VMLINUX_SYMBOL(__proc_info_begin) = .;                \
        *(.proc.info.init)                        \
        VMLINUX_SYMBOL(__proc_info_end) = .;

    __mmap_switched       将旧的地址转化为虚拟地址 代码重定义

    start_kernel:

    setup_arch(&command_line)

            setup_processor()

                    struct proc_info_list *list;//创建一个CPU指令集描述结构体

                    list = lookup_processor_type(read_cpuid_id());//从指定的内存中获取到该描述结构体

                    cpu_name = list->cpu_name;//将获取到的CPU名字赋值给一个全局变量

            setup_machine_fdt(__atags_pointer);//找到一个移植Linux时写的最合适的machine_desc结构体 并且返回

                        for_each_machine_desc(mdesc) {

                            score = of_flat_dt_match(dt_root, mdesc->dt_compat);

                            if (score > 0 && score < mdesc_score) {

                                mdesc_best = mdesc;

                                mdesc_score = score;

                            }

                        }

                    

                    

  • 相关阅读:
    angular升级后用Cesium等编译出现Can‘t resolve (fs, http, https, url, path, stream, zlib)等问题
    ROS2与turtlebot4仿真入门教程-安装ROS2
    视频质量评价 FISM 算法详细介绍
    CountDownLatch
    numpy中计算相关系数的np.corrcoef
    Java面试题
    uni-app 之 tabBar 底部切换按钮
    [计算机提升] 命令、批处理介绍
    Mocha + Chai 测试环境配置,支持 ES6 语法
    SCSS的嵌套规则可以减少重复代码,那么如何在嵌套规则中使用父选择器?
  • 原文地址:https://blog.csdn.net/weixin_66218530/article/details/134250008