Linux内核启动流程head.S文件中ENTRY(_start)/END(_start)指令

见Linux5.4/arch/riscv/kernel/head.S,"…"表示省略部分代码。

...
__HEAD
ENTRY(_start)
         /*
          * Image header expected by Linux boot-loaders. The image header data
          * structure is described in asm/image.h.
          * Do not modify it without modifying the structure and all bootloaders
          * that expects this header format!!
          */
         /* jump to start kernel */
         j _start_kernel
         /* reserved */
         .word 0
         .balign 8
  #ifdef CONFIG_RISCV_M_MODE
         /* Image load offset (0MB) from start of RAM for M-mode */
         .dword 0
  #else
  #if __riscv_xlen == 64
          /* Image load offset(2MB) from start of RAM */
         .dword 0x200000
  #else
          /* Image load offset(4MB) from start of RAM */
         .dword 0x400000
...
END(_start)
...

查看arch/riscv/kernel/vmlinux.lds链接脚本,第二行就是ENTRY(_start),故_start本是Linux内核入口函数,ENTRY(_start)常见于链接脚本文件,何故出现在此.S文件中,查找以后发现,本质一样只是在封了一层。见include/linux/linkage.h文件:

...
11 #ifndef ASM_NL
12 #define ASM_NL           ;
13 #endif

...
97 /* SYM_L_* -- linkage of symbols */
98 #define SYM_L_GLOBAL(name)                      .globl name
...

115 #ifndef ENTRY
116 /* deprecated, use SYM_FUNC_START */
117 #define ENTRY(name) \
118         SYM_FUNC_START(name)
119 #endif
...

146 /* SYM_ENTRY -- use only if you have to for non-paired symbols */
147 #ifndef SYM_ENTRY
148 #define SYM_ENTRY(name, linkage, align...)              \
149         linkage(name) ASM_NL                            \
150         align ASM_NL                                    \
151         name:
152 #endif
...

154 /* SYM_START -- use only if you have to */
155 #ifndef SYM_START
156 #define SYM_START(name, linkage, align...)              \
157         SYM_ENTRY(name, linkage, align)
158 #endif
...

218 #define SYM_FUNC_START(name)                            \
219         SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
220 #endif
...

分析上述代码可知,一环套一环,ENTRY(_start)最终展开就是:

.globl _start;
align;
_start:

END(_start)分析和上面一样,可在include/linux/linkage.h文件中找到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁头小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值