- 论坛徽章:
- 20
|
1. MMU 中的 page table 是存放在物理內存嘛?
“mmu的page table”这个说法有点别扭。Page table放在内存里,但它不属于MMU硬件单元。
MMU通过访问内存里的page table来完成地址映射,当然,为了加快速度,MMU内部有各种cache,最有名的就是TLB。
2. 內核空間只有一個page table , 用戶空間每個進程都各自擁有自己的page table ?
后半句是的。从CPU的角度看,page table的入口是cr3,任何时刻只有一份页面在生效。
但是每个进程都有自己的页表,同样的虚地址映射不同的物理地址;当任务切换的时候,一个重要的操作就是更新cr3的内容。
举个极为简化的例子,假设系统中有两个进程A,B。A的页目录占用页框#1,B的页目录占用页框#2(页目录是第一级索引),两者占用不同的物理地址。
当A运行的时候,cr3指向页框#1,当B运行的时候,cr3切换到页框#2。
在10-10-12的两级分页模式下,页目录由va的最高10位索引,共2^10=1k个条目,每个条目4byte(映射2^22=4M的地址空间),正好占用1k*4=4kbyte=1page。
linux按照3G/1G的方式划分,也就是说,页目录的前3/4的条目,索引3G的用户空间,后面1/4的条目,索引1G的内核空间。
"所有进程共享内核空间"的含义,是指对进程A/B的页目录(即页框#1/#2),它们后1/4的条目内容是几乎相同的,指向同样的1G/4k/1k=256个page table(排除高端映射的部分)。
3.
应该是的。就像前面的例子,页框#1和#2的虚地址都在3G以上。
问题不明确?内核创建子进程的时候,会继承父进程的地址空间及页表。利用COW、缺页中断等技术,对子进程的页面进行延迟修改。
慢慢的,子进程的页表就变得跟父进程不一样了。但是,3G以上的部分,几乎还是不变的。
如前所述,硬件里面应该只有映射关系的cache。其它架构是不是这样就不知道了。 |
|