天天看点

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

如何将虚拟地址转化成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的所有情况了。

继续阅读