恒等映射IDMAP空间
由于后面kernel会自己重新再建立页表,所以这里采用的映射比较粗糙,在level2里使用的是Block descriptor(称之为section mapping),每个block descriptor可以映射2MB物理地址,所以最多只要3级页表就ok了,即Level0~level2。这3级页表用3个4KB页面存放。恒等映射和kernel空间映射都是这种方式。
恒等映射的这段空间并不大(如下只要1.6KB),一个映射页面(2MB)足够了。
下面是这段空间的位置:
_idmap_text定义的位置
VMLINUX_SYMBOL(__idmap_text_start) = .; \
*(.idmap.text) \
VMLINUX_SYMBOL(__idmap_text_end) = .;
下面的函数和其它符号在这个区间内,他们在系统启动后会重新映射到”ffffff8”(有效位为39)开头的虚拟地址上,空间大小为0x630 = 1584 Bytes 为什么是这些函数?
ffffff800893e000 T __idmap_text_start
ffffff800893e000 T kimage_vaddr
ffffff800893e008 T el2_setup
ffffff800893e05c t set_hcr
ffffff800893e108 t install_el2_stub
ffffff800893e13c t set_cpu_boot_mode_flag
ffffff800893e160 T secondary_holding_pen
ffffff800893e184 t pen
ffffff800893e198 T secondary_entry
ffffff800893e1a4 t secondary_startup
ffffff800893e1b4 t __secondary_switched
ffffff800893e1e8 T __enable_mmu
ffffff800893e23c t __no_granule_support
ffffff800893e260 t __relocate_kernel
ffffff800893e2a8 t __primary_switch
ffffff800893e318 T cpu_resume
ffffff800893e338 T cpu_do_resume
ffffff800893e3ac T idmap_cpu_replace_ttbr1
ffffff800893e3dc t __idmap_kpti_flag
ffffff800893e3e0 T idmap_kpti_install_ng_mappings
ffffff800893e418 t do_pgd
ffffff800893e430 t next_pgd
ffffff800893e440 t skip_pgd
ffffff800893e474 t walk_puds
ffffff800893e47c t next_pud
ffffff800893e480 t walk_pmds
ffffff800893e488 t do_pmd
ffffff800893e4a0 t next_pmd
ffffff800893e4b0 t skip_pmd
ffffff800893e4c0 t walk_ptes
ffffff800893e4c8 t do_pte
ffffff800893e4ec t skip_pte
ffffff800893e4fc t __idmap_kpti_secondary
ffffff800893e540 T __cpu_setup
ffffff800893e618 t crval
ffffff800893e630 T __idmap_text_e