arm64 中的__virt_to_phys

在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

猜你喜欢

转载自blog.csdn.net/tiantao2012/article/details/109988690