在arm64上的线性映射区还是可以通过__virt_to_phys 来将虚拟地址转成物理地址,我们来看看其在arm64上的实现
#define __virt_to_phys(x) __virt_to_phys_nodebug(x)
#define __is_lm_address(addr) (!(((u64)addr) & BIT(vabits_actual - 1)))
#low memory的虚拟地址到物理转换
#define __lm_to_phys(addr) (((addr) & ~PAGE_OFFSET) + PHYS_OFFSET)
#kernel image(包含text段等)映射在vmalloc 区域的虚拟地址到物理地址的转换
#define __kimg_to_phys(addr) ((addr) - kimage_voffset)
#从这里可以看出在arm64上,线性映射段一共有两块,一块是大家熟悉的low memory
一块是kernel image 映射所在的vmalloc。也就是说vmalloc 在arm64 中针对kernel image 是
线性映射的。
#define __virt_to_phys_nodebug(x) ({ \
phys_addr_t __x = (phys_addr_t)(__tag_reset(x)); \
__is_lm_address(__x) ? __lm_to_phys(__x) : __kimg_to_phys(__x); \
})
那这个kimage_voffset是在head.s 中赋值的
SYM_FUNC_START_LOCAL(__primary_switched)
adrp x4, init_thread_union
add sp, x4, #THREAD_SIZE
adr_l x5, init_task
msr sp_el0, x5 // Save thread_info
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
arm64 中的__virt_to_phys
猜你喜欢
转载自blog.csdn.net/tiantao2012/article/details/109988690
今日推荐
周排行