天天看点

【存储管理】Linux分页机制(i386)

虽然x386是支持分段和分页(基于前面分段实现的)两个机制的,而Linux系统变项只支持分页机制。

(1)i386段式管理:逻辑地址(如8086分段机制,CS,SS,DS,ES),线性地址(linux中虚拟地址一样),物理地址(芯片级寻址单元);i386在实地址模式,对地址,没有保护和检查,无法构建真正的OS;保护模式下,增加FS,GS。段寄存器存放段选择符,根据段寄存器的低3位判别级别和取GDTR,LDTR,高13位找到段描述符(8字节,含有段基址,段大小,描述符类型code or data)。

(2)i386页式管理(页大小固定,换出换入便于管理):其实由于i386使用段式管理,地址映射就要经历段式和页式两级管理,逻辑地址经段式管理成为线性地址,线性地址经页式管理成为物理地址;i386页式管理采用两级分页机制(页面目录,页目录)。如果dir和page合并时,我们有1K*1K和表项,就有4G个内存寻址范围;如果只用一级表项即只有页面表,则有2^20个页表项,若进程访问不到4G内存,大多数页表项是空的,浪费空间,需占用4B*1M需1K个页面;如果用两级,但是可映射小地址时dir为空,则相应的页目录表项我就可以不使用,如有4M地址,我们只需要使用一个页目录项,4B*1K只存放到一个页面。

(3)i386扩展页式管理:页框指向4MB的物理地址,则Linux不使用中间页表,此时目录项中高20位只有高10位是有用的指向一页数据,4MB为边界。

(4)i386物理地址扩展页式管理(PAE):4KB映射时,页表中物理地址字段变为24位,则结构体变为36位,所以一个4KB的页面只能有512个页表项了,同理页目录项(8位)只能有512个页目录表项了。cr3和4个pdpt先进行选择页目录项。

(5)linux页式管理,由于要考虑64位CPU的实现,增加中间目录选项PMD,但只有一个表项,做过度作用。由于i386的段式管理,linux姿势将段式管理走走场,预先定义好__USER_DS,__USER_CS,__KERNEL_DS,__KERNEL_CS(linux统一堆栈段和数据段)。所有进程都共用一个GDT,不使用LDT。但每一个进程都有页面目录PGD,根据高10位找到页目录项的索引(含有一个页表),目录项中高20位指向一个页面表(其余位可表示访问权限和状态),在后面添加12个0即可得到页面表指针(页面表也是以4KB为基址);根据中间10位找到页表中的索引(含有一页数据),页面表中高20位指向物理地址的页面,添加低12位即可得内存页面中的起始地址。

【存储管理】Linux分页机制(i386)
【存储管理】Linux分页机制(i386)