- 论坛徽章:
- 9
|
HI:
你好,我用下面一个例子给你做解释.
假设一个 page 的虚拟地址为 0xC000FFFF
unsigned long addr = 0xC000FFFF;
pgd_t *pgd;
pmd_t *pmd;
pte_t *pte;
struct page *page;
pgd = pgd_offset(current->mm,addr); // 获得 page 的 pgd 全局页表,该页表通过 addr 的高 20 位的值 加上进程 current->mm 的成员 pgd 来合成二级页表.
pmd = pmd_offset(pgd,addr); // 通过 pgd 入口 获得 二级页表的入口 .
page = pmd_page(pmd); // 可以通过 pmd 获得对应的 page 地址.
pte = pte_offset(pmd,addr); // 通过 二级页表和 addr 的低 12 位合成三级页表,与此找到相应的 page 的物理地址.
Linux 的物理页分配策略大致可以这么解释,使用 malloc 在用户空间分配空间的时候,如果不对分配的内存空间进行写操作的,内核是不实际分配物理地址物理页帧的.
如果用户空间对分配的内存空间进行写操作,那么 Linux 内核就会产生缺页处理,分配物理页帧.
对物理页写操作之后就将物理页标记为脏页,Linux 内核会对合适的时候 swap 到 disk 上进行数据同步.
|
|