用户程序中的虚拟地址,静态的是编译时就定好的,动态的(如malloc),是通过内核的页式内存管理在vma中定的,需要找到进程的task_struct中的页表然后一级级的翻译得到物理地址。
实际编译时定的地址叫做逻辑地址,这个逻辑地址是需要段式管理来翻译的,即段基址加段内偏移,由于linux中的这个段基址就是0,所以逻辑地址就直接对应了虚拟地址了。
这样得到物理地址以后,首先将十六进制的低三位与成0,这样做是得到页的物理地址,这里指4K页的情况,然后通过页的物理地址减去mem_map的第一个元素的地址就得到了此页在mem_map数组中的下标(此处注意指针相减不是指针表示的地址相减,而是两者之间指针所表示元素类型的个数),此下标即为pfn,知道了在数组中的下标就可以得到struct page结构体了,就可以知道page的所有情况了。