二级页表如何节省内存

来源:互联网 发布:web数据挖掘 编辑:程序博客网 时间:2024/06/15 20:51

<深入理解linux内核>:如果使用简单的一级页表,如果进程使用全部4G线性地址空间,那么将需要高达2^20表项(总共地址线是32位,每页大小为4kb,则页偏移量需要低12位,高20位当作页表地址)来保存表示每个进程的页表,若每项4B,则需要4MB的ram来存储页表。即使一个进程并不使用内的所有地址。

         书上提出:使用这种二级模式能够减少每个进程页表所需RAM数量。开始一直没想通,为什么节省了呢?从你最终要存储的表项来看,无论如何你存储的表项是不会少的,而且多级页表还会增加存储开销。

          其实是这样的,二级表只是从进程的角度来看,为进程节省了页表项(其实所有的页表存储空间增大了)。二级模式通过只为进程实际使用的那些虚拟内存区请求页表来减少页表,就是进程未使用的页暂时可以不用为其建立页表,因为如果使用一级页表的话,你就必须为所有的4G范围内分配页表,不能细分。每个活动进程必须有一个分配给它的页目录,不过没必要马上为进程的所有页表都分配ram,只有在进程实际需要一个页表时才给该页表分配ram,这样就提高了效率。

注:正在使用的页目录物理地址存放在控制寄存器cr3中。

注:linux进程的线性地址空间分成两部分:

            (1)0x00000000~0xbfffffff的线性地址,无论用户态和内核态的进程都可以寻址;

            (2)0xc0000000~0xffffffff的线性地址,只有内核态的进程可以寻址。

栗子: 

比如对于4G的空间,4K页
那需要2^20 == 1M个页标项(无论用不用都需要,系统不知道哪个地址是否会被访问)
1M * 4B== 4MB
每个进程都需要4MB的页表

而如果2级
只需要一个页目录 + 1个页表(比如只使用4MB的情况)就足够了

0 0
原创粉丝点击