保护模式及其编程——分页机制

摘要:分页机制是实现虚拟存储的关键,但是它的实现比较简单。传统的页都是4K大小,当然,在最近的内核中,分页机制因为一些原因而比较繁琐。在这里,我们仅仅浅谈最简单的分页机制,在其他的文章中,我们将讲解现代新linux内核中的分页机制。

我们通过设置cr0PG位来开启分页机制。页大小是4K,并且是4K对齐的。线性地址到物理地址的转换中,可能某些线性地址是无效的。如果某个线性地址对应的页不存在,那么访问的时候将产生一个异常。分页和分段最大的不同就是分页是固定大小的。为了减少地址转化需要的总线周期数量,我们使用TLB缓存最近使用的页表。

1.页表结构

1.1两级页表结构

页表中,每项的大小是32b,其中20b用来存放页面的物理地址,12b用于存放属性信息。 页表含有1M个表项,每项4B.第一级表是页目录,存放在14k页面中,含有1K个表项。第二级是页表,也是1K个表项。二级页表的查找过程如下图 保护模式及其编程——分页机制_第1张图片

1.2.不存在的页表

页目录表的每个表项都有一个present属性,这个属性可以节省存放页表所需要的空间。另外,这个属性还可以用于在虚拟内存中存放二级页表。这意味着,任何时候只有部分二级页表在物理内存中,其余可以保存在磁盘上。

2.页表项格式

页表项格式如下图: 保护模式及其编程——分页机制_第2张图片 其中属性位包含如下信息: P——b0,存在位标志 R/W——b1,读写位标志 U/S——b2,用户/超级用户标志 A——b5,已经访问标志 D——b6,脏位标志 AVL——保留字段
G:第8b,表示全局页
保护模式是否开启,取决于cr0的第0位PG。

有关数据结构;一个页表或者页目录项大小是4B;而开启分页机制以后,存储单元变成了页(不存在说,一部分存储开启了分页机制,另外一部分没有开启分页机制(除非这部分不能通过操作系统访问到))。所以,一个页上含有1024个页表项;一个页目录,对应1K*4K=4M的空间;一个程序有4G的线性地址空间,正好需要1K个页目录来存储,它占用的页表是4M.

另外,页表和页目录表都表项都是32b的,其中地址对应的是20b(第12b清零)。

当页目录或者页表项被修改的时候,对应TLB中的项目也就失效了;当cr3重新加载的时候,所有的TLB都失效了(G标志为1的除外)
因为页目录基地址是4K对齐的,所以CR3中仅用20b来存储它的基地址。

你可能感兴趣的:(自己动手写操作系统)