如何将虚拟地址转化成pfn,即页帧号

本文介绍了如何将虚拟地址转化为页帧号(PFN),详细解释了内核虚拟地址与用户程序虚拟地址的区别,并提供了获取PFN的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

如何将虚拟地址转化成pfn,即页帧号(就是mem_map数组下标,就是所有的物理页描述结构的数组,通过这个数组就可以找到struct page)

内核中虚拟地址,只是在物理地址上加了个PAGE_OFFSET,这个东西在x86上是3G,只要拿内核中的虚拟地址直接减3G就行

用户程序中的虚拟地址,静态的是编译时就定好的,动态的(如malloc),是通过内核的页式内存管理在vma中定的,需要找到进程的task_struct中的页表然后一级级的翻译得到物理地址。

 

 

实际编译时定的地址叫做逻辑地址,这个逻辑地址是需要段式管理来翻译的,即段基址加段内偏移,由于linux中的这个段基址就是0,所以逻辑地址就直接对应了虚拟地址了。

 

 

这样得到物理地址以后,首先将十六进制的低三位与成0,这样做是得到页的物理地址,这里指4K页的情况,然后通过页的物理地址减去mem_map的第一个元素的地址就得到了此页在mem_map数组中的下标(此处注意指针相减不是指针表示的地址相减,而是两者之间指针所表示元素类型的个数),此下标即为pfn,知道了在数组中的下标就可以得到struct page结构体了,就可以知道page的所有情况了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值