ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux kernel中的virt_to_phys代码解读

2021-06-21 15:07:26  阅读:385  来源: 互联网

标签:__ kernel 0000 virt ffff OFFSET phys


假设VA_BITS = 48 (虚拟地址有效位), 那么kernel space的虚拟地址是:0xffff_0000_0000_0000 - 0xffff_ffff_ffff_ffff, userspace的虚拟地址是 0x0000_0000_0000_0000 - 0x0000_ffff_ffff_ffff

然后我们再看一张kernel space memory layout图 ,这张图说明了:
0xffff_8000_0000_0000 - 0xffff_8008_0000_0000 是个memory使用的,就是有映射SDRM的,也是线性一射
而0xffff_8000_0000_0000向下的kernel space virtual addr是给 kernel image使用的
在这里插入图片描述

在kernel中PAGE_OFFSET = 0x8000_0000_0000

#define PAGE_OFFSET		(UL(0xffffffffffffffff) - \
	(UL(1) << (VA_BITS - 1)) + 1)

当virt_to_phys调用时候,先判断bit47(最高有效位),如果为1,则表示是(memory)DRAM的地址。那么直接使用X[46:0]和PHYS_OFFSET相加即可

#define __virt_to_phys(x) ({						\
	phys_addr_t __x = (phys_addr_t)(x);				\
	__x & BIT(VA_BITS - 1) ? (__x & ~PAGE_OFFSET) + PHYS_OFFSET :	\
				 (__x - kimage_voffset); })

PHYS_OFFSET是DRAM的真实物理地址

memstart_addr = round_down(memblock_start_of_DRAM(),
				   ARM64_MEMSTART_ALIGN);

当virt_to_phys调用时候,先判断bit47(最高有效位),如果为0,则表示是kernel image的地址, 那么直接使用X[46:0]和kimage_voffset相减即可

kimage_voffset来自汇编中的__mmap_switched函数

str_l	x21, __fdt_pointer, x5		// Save FDT pointer

ldr_l	x4, kimage_vaddr		// Save the offset between
sub	x4, x4, x24			// the kernel virtual and
str_l	x4, kimage_voffset, x5		// physical mappings

标签:__,kernel,0000,virt,ffff,OFFSET,phys
来源: https://blog.51cto.com/u_15278218/2931148

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有