aarch64_boot

入口

## arch/arm64/kernel/vmlinux.lds.S

ENTRY(_text)

.head.text : {
	_text = .;
	HEAD_TEXT
}

## include/asm-generic/vmlinux.lds.h

#define HEAD_TEXT  KEEP(*(.head.text))

## include/linux/init.h

#define __HEAD          .section ".head.text","ax"

## arch/arm64/kernel/head.S

__HEAD

如上,可知第一条指令为 arch/arm64/kernel/head.S文件中 __HEAD 后的指令

__create_page_tables函数

对恒等页表 idmap_pg_dir 进行初始化,虚拟地址空间为 [__idmap_text_start, __idmap_text_end], 标志为 SWAPPER_MM_MMUFLAGS 类型,pgds个数为 idmap_ptrs_per_pgd,对应的开始物理地址为 __idmap_text_start

对线性页表 init_pg_dir 进行初始化,虚拟地址空间为 [__va(_text), __va(_end)], 标志为 SWAPPER_MM_MMUFLAGS 类型,pgds个数为 PTRS_PER_PGD,对应的开始物理地址为 __pa(_text)

__enable_mmu函数

idmap_pg_dir 存储在 ttbr0_el1 寄存器,init_pg_dir 存储在 ttbr1_el1 寄存器,最后调用 set_sctlr_el1 x0 使能MMU

Last updated

Was this helpful?