kernel启动流程汇编部分

  1. 从上一篇kernel 启动的入口函数查找可以得出kernel启动是从如下_head开始,然后跳转到了stext

  1. stext(head.S (kernel4.14\arch\arm64\kernel)) 如下:

ENTRY(stext)

bl preserve_boot_args

bl el2_setup // Drop to EL1, w0=cpu_boot_mode

adrp x23, __PHYS_OFFSET

and x23, x23, MIN_KIMG_ALIGN - 1// KASLR offset, defaults to 0

bl set_cpu_boot_mode_flag

bl __create_page_tables

/*

* The following calls CPU setup code, see arch/arm64/mm/proc.S for

* details.

* On return, the CPU will be ready for the MMU to be turned on and

* the TCR will have been set.

*/

bl __cpu_setup// initialise processor

b __primary_switch

ENDPROC(stext)

  1. preserve_boot_args 是保存boot传过来的参数

  1. el2_setup 如果是el2启动做相关的处理工作

  1. set_cpu_boot_mode_flag 设置cpu 启动模式标志

  1. __create_page_tables 创建页表

  1. __cpu_setup 初始化cpu

  1. __primary_switch打开mmu ,跳到__primary_switched

  1. __primary_switched 如下最终跳到C语言代码start_kernel

__primary_switched:

adrp x4, init_thread_union

add sp, x4, #THREAD_SIZE

adr_l x5, init_task

msr sp_el0, x5// Save thread_info

adr_l x8, vectors// load VBAR_EL1 with virtual

msr vbar_el1, x8// vector table address

isb

stp xzr, x30, [sp, #-16]!

mov x29, sp

str_l x21, __fdt_pointer, x5// Save FDT pointer

ldr_l x4, kimage_vaddr// Save the offset between

sub x4, x4, x0// the kernel virtual and

str_l x4, kimage_voffset, x5// physical mappings

// Clear BSS

adr_l x0, __bss_start

mov x1, xzr

adr_l x2, __bss_stop

sub x2, x2, x0

bl __pi_memset

dsb ishst// Make zero page visible to PTW

#ifdef CONFIG_KASAN

bl kasan_early_init

#endif

#ifdef CONFIG_RANDOMIZE_BASE

tst x23, ~(MIN_KIMG_ALIGN - 1)// already running randomized?

b.ne 0f

mov x0, x21// pass FDT address in x0

bl kaslr_early_init// parse FDT for KASLR options

cbz x0, 0f// KASLR disabled? just proceed

orr x23, x23, x0// record KASLR offset

ldp x29, x30, [sp], #16// we must enable KASLR, return

ret // to __primary_switch()

0:

#endif

add sp, sp, #16

mov x29, #0

mov x30, #0

b start_kernel

ENDPROC(__primary_switched)

  1. start_kernel下一篇将详细介绍

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值