- 页:就是一块内存,在80386中,页的大小是固定的4096字节
- 逻辑地址、线性地址、物理地址:在未打开分页机制时,线性地址等同于物理地址(逻辑地址通过分段机制直接转换成物理地址);当分页开启时,情况发生变化,分段机制将逻辑地址转换成线性地址,线性地址再通过分页机制转换成物理地址(分页机制类似于一个函数)。
- 为什么分页:分段管理机制已经提供了很好的保护机制,分页主要目的在于实现虚拟存储器,线性地址中任意一个页都能映射到物理地址中的任何一个页,这无疑使得内存管理变得相当灵活
编写代码启动分页机制
克勤克俭用内存
- 我们必须知道内存的大小,根据内存的大小确定多少页表
- 可以利用中断15来确定内存的大小
ax=0E820h
时调用int 15h
得到的不仅仅是内存的大小,还包括对不同内存段的一些描述,这些描述都被保存在一个缓冲区中。在我们调用int 15h之前,必须先有缓冲区。我们可以在每得到一次内存描述时都使用同一个缓冲区,然后对缓冲区里的数据进行处理,也可以将每次得到的数据放进不同的位置,比如一块连续的内存,然后在想要处理它们时再读取- 在这里,我们使用了后一种方法,定义了一块256字节的缓冲区,最多可以用来存放12个20字节大小的结构体。我们将把每次得到的内存信息连续写入这块缓冲区,形成一个结构体数组。然后在保护模式下把它们读出来,显示在屏幕上,并且凭借它们得到内存的容量。
- 现在我们来到保护模式下的32位代码,添加显示内存信息的过程
- 根据内存大小计算应初始化多少PDE以及多少页表
所以在GDT中,这样初始化页表
进一步体会分页机制
- 先执行某个线性地址处的模块,然后通过改变cr3来转换地址映射关系,再执行同一个线性地址处的模块,由于地址映射已经改变,所以两次得到的应该是不同的输出