《一个操作系统的实现》读书笔记--第三章--分页机制

来源:互联网 发布:linux基础试题选择题 编辑:程序博客网 时间:2024/05/20 21:47

1、逻辑地址、线性地址和物理地址
2、分页管理机制
3、PDE、PTE、cr3
4、如何初始化页目录表与页表

一、逻辑地址、线性地址和物理地址

1、在未开启分页机制情况下


2、在开启分页机制情况下


二、分页管理机制

下图向大家展示,如何通过分页管理机制,将线性地址转换为物理地址的。


转换使用两级页表,第一级叫做页目录,大小为4KB,存储在一个物理页中,每个表项4字节长,共有1024 
个表项。每个表项对应第二级的一个页表,第二级的每一个页表也有1024个表项,每一个表项对应一个物 
理页。页目录表的表项简称PDE(Page Directory Entry),页表的表项简称PTE(Page Table Entry)。

线性地址转换物理地址的具体步骤是:
(1)先是从寄存器cr3指定的页目录中根据线性地址的高10位得到页表。
(2)在页表中,根据线性地址的第12—21位得到物理页首地址。
(3)将这个首地址,加上线性地址的低12位便得到了物理地址。

三、cr3、PDE和PTE

1、cr3的结构图如下:


2、PDE的结构图如下:


其中特别需要注意的几个属性:
(1)P存在位,表示当前条目所指向的页或页表是否在物理内存中。当P=0表示页不在内存中,如果此时处理器试图访问此页,将会产生页异常(Page-fault exception, #PF);P=1表示页在内存中。
(2)A指示页或页表是否被访问。此位往往在页或页表刚刚被加载到物理内存中时被内存管理程序清零,处理器会在第一次访问此页或也表时设置该位。而且,处理器并不会自动清除此位,只有软件能清除它。在时钟页面置换算法中,需要通过该位来标识此页面是否已经被访问。
(3)D指示页或页表是否被写入,此位往往在页或页表刚刚被加载到物理内存中时被内存管理程序清零,处理器会在第一次写入此页或页面时设置此位。而且,处理器并不会自动清除此位,只有软件能清除它。由于该位的存在,当往某页写入内容时,并不需要将其同步到磁盘上,只有当该页被置换出时,判断该位D=0,则表示该页没有被写入,则不需要将其写入磁盘;D=1,则表示该页已被写入,则需要将其写入到磁盘。

3、PTE的结构图如下:


其中各属性位与PDE中具有相同的含义。

4、页对其方式

cr3中的高20位将是页目录表首地址的高20位,PDE的高20位是页表首地址,PTE的高20位是物理页的首地址。保护模式下,寻址的范围是0-4GB,为什么却用20位来存储这些首地址呢?
cr3中的高20位是页目录表首地址的高20位,页目录表首地址的低12位将会是0,这样就保证了页目录表会是4KB对齐的。同理,PDE中的页表基址(Page-Table Base Address),以及PTE中的物理页基址(Page Base Address)也是用高20位来表示4KB对齐的页表和页。

四、如何初始化页目录表与页表

pmtest6.asm中初始化页目录表与页表

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. PageDirBase equ 200000h ;页目录开始地址: 2M  
  2. PageTblBase equ 201000h ;页表开始地址: 2M + 4K  
  3.   
  4. ;启动分页机制===============================================  
  5. SetupPaging:  
  6.     ;为简化处理,所有线性地址对应相等的物理地址  
  7.     ;首先初始化页目录  
  8.     mov ax, SelectorPageDir  
  9.     mov es, ax  
  10.     mov ecx, 1024  
  11.     xor edi, edi  
  12.     xor eax, eax  
  13.     mov eax, PageTblBase|PG_P|PG_USU|PG_RWW  
  14. .1:  
  15.     stosd  
  16.     add eax, 4096  
  17.     loop .1  
  18.   
  19.     ;再初始化所有页表  
  20.     mov ax, SelectorPageTbl  
  21.     mov es, ax  
  22.     mov ecx, 1024*1024  
  23.     xor edi, edi  
  24.     xor eax, eax  
  25.     mov eax, PG_P|PG_USU|PG_RWW  
  26. .2:   
  27.     stosd  
  28.     add eax, 4096  
  29.     loop .2  
  30.   
  31.     mov eax, PageDirBase  
  32.     mov cr3, eax  
  33.   
  34.     mov eax, cr0  
  35.     or eax, 80000000h  
  36.     mov cr0, eax  
  37.       
  38.     jmp short .3  
  39. .3:  
  40.     nop  
  41.     ret  
  42. ;分页机制启动完毕==========================================  


初始化页目录表和页表之后,要让cr3指向页目录表,然后设置cr0的PG位。

 

0 0
原创粉丝点击