zoukankan      html  css  js  c++  java
  • vmlinux.lds.S

    vmlinux.lds.S

    语法

    1. 定义一个section,如下是define一个.init.data section

    *(.init.rodata.* .init.bss)最前面的*是通配符,表示所有.o文件的(.init.rodata.*、.init.bss section)

        .init.data : {
            INIT_DATA
            INIT_SETUP(16)
            INIT_CALLS
            CON_INITCALL
            SECURITY_INITCALL
            INIT_RAM_FS
            *(.init.rodata.* .init.bss)    /* from the EFI stub */
        }

    2. define变量

    如下是定义一个__initdata_begin的变量,点表示当前地址,这个变量在c文件里extern后就可以使用了:

        __initdata_begin = .;

     

    INIT_CALLS

    arch/arm64/kernel/vmlinux.lds.S

        __inittext_end = .;
        __initdata_begin = .;
    
        .init.data : {
            INIT_DATA
            INIT_SETUP(16)
            INIT_CALLS
            CON_INITCALL
            SECURITY_INITCALL
            INIT_RAM_FS
            *(.init.rodata.* .init.bss)    /* from the EFI stub */
        }
        .exit.data : {
            ARM_EXIT_KEEP(EXIT_DATA)
        }
    
        PERCPU_SECTION(L1_CACHE_BYTES)
    
        .rela.dyn : ALIGN(8) {
            *(.rela .rela*)
        }
    
        rela_offset    = __ABSOLUTE(ADDR(.rela.dyn) - KIMAGE_VADDR);
        __rela_size    = SIZEOF(.rela.dyn);
    
        . = ALIGN(SEGMENT_ALIGN);
        __initdata_end = .;
        __init_end = .;

    include/asm-generic/vmlinux.lds.h

    #define INIT_CALLS_LEVEL(level)                        
            __initcall##level##_start = .;                
            KEEP(*(.initcall##level##.init))            
            KEEP(*(.initcall##level##s.init))            
    
    #define INIT_CALLS                            
            __initcall_start = .;                    
            KEEP(*(.initcallearly.init))                
            INIT_CALLS_LEVEL(0)                    
            INIT_CALLS_LEVEL(1)                    
            INIT_CALLS_LEVEL(2)                    
            INIT_CALLS_LEVEL(3)                    
            INIT_CALLS_LEVEL(4)                    
            INIT_CALLS_LEVEL(5)                    
            INIT_CALLS_LEVEL(rootfs)                
            INIT_CALLS_LEVEL(6)                    
            INIT_CALLS_LEVEL(7)                    
            __initcall_end = .;

    从上面的code可以看出各个level的initcall是连续存放的,0在最前,7在最后,这个顺序会决定它们在开机过程时的执行先后,数字越小的越先执行,数字越大越后执行。

    而且这些initcall都是存放在.init.data section的。

    上述macro展开可以得知各个等级的initcall有如下这些,这些initcall所在的区间为[__initcall_start, __initcall_end]

    .initcall0.init
    .initcall1.init
    .initcall2.init
    .initcall3.init
    .initcall4.init
    .initcall5.init
    .initcallrootfs.init
    .initcall6.init
    .initcall7.init
    
    .initcall0s.init
    .initcall1s.init
    .initcall2s.init
    .initcall3s.init
    .initcall4s.init
    .initcall5s.init
    .initcallrootfss.init
    .initcall6s.init
    .initcall7s.init
  • 相关阅读:
    冒泡排序
    获取某年某月有多少天 & 常用日期转换
    left join,right join ,inner join
    Left join加上where条件的困惑
    ORACLE查询练习
    Ch25 文件和注册表操作(2)-- 读写文件
    Ch25 文件和注册表操作(1)--文件系统
    C#入门经典札记_Ch05变量的更多内容
    C#入门经典札记_Ch04流程控制
    C#入门经典札记_Ch03变量和表达式
  • 原文地址:https://www.cnblogs.com/aspirs/p/15521637.html
Copyright © 2011-2022 走看看