Dannysd 发表于 2015-12-23 00:18

[已解决]页目录项和页表项的结构中Field有点不明白

本帖最后由 Dannysd 于 2015-12-23 01:16 编辑

Field containing the 20 most significant bits of a page frame physical address

Because each page frame has a 4-KB capacity, its physical address must be a multiple
of 4096, so the 12 least significant bits of the physical address are always
equal to 0. If the field refers to a Page Directory, the page frame contains a Page
Table; if it refers to a Page Table, the page frame contains a page of data.这段没看懂
页目录项或页表项在线性地址中不是只有10位么?再加上偏移的12位正好32位

这段说,Field包含页框物理地址最高20位的字段???

另外,最低12位为什么要置0?看不出来和物理地址4096有什么倍数关系。。。

请大牛讲解一下,万分感谢

Dannysd 发表于 2015-12-23 01:16

谢特
那10位代表页目录的位置和页表的位置
而实际上页目录(表)项的格式是32位的
不好意思,理解错了

Buddy_Zhang1 发表于 2015-12-23 19:18

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 上进行数据同步.




Dannysd 发表于 2015-12-23 22:44

回复 3# Buddy_Zhang1


    谢谢回复,还没看到具体代码的部分,入个门都困难   {:yct12:}

Buddy_Zhang1 发表于 2015-12-24 09:52

回复 4# Dannysd

这部分代码在内核属于虚拟内存管理部分,你可以在内核中查看 do_mmap() 这个函数,里面基本就是整个虚拟内存的实现.


   
页: [1]
查看完整版本: [已解决]页目录项和页表项的结构中Field有点不明白