页 页表 页表项

最近在学习基本分页存储管理方式,看书的时候有很难理解,看完理解多了,所以转载出去,希望能帮助更多正在学习这个知识点的人。

一、首先明确几个概念 

逻辑地址:是程序编译后,生成的目标模块进行编址时都是从0号单元开始编址,称之为目标模块的相对地址,即为逻辑地址。

页:将进程划分的块,对应的大小就叫页面大小。

页框:将内存划分的块。

页和页框二者一一对应,一个页放入一个页框,(理论上)页的大小和页框的大小相等。

页表:就是一个页和页框一一对应的关系表。【存放在内存中】 关系表只是起到一个索引的作用,说白了就是能根据关系表能查到某一个页面和哪一个页框所对应。

 

 

二、用例子说话【例子出现在:《王道考研操作系统》的内存管理部分】

已知条件:逻辑地址32位、页面大小4KB、页表项大小4B,按字节编址。

分析:        

 

1.

        

     首先32位的虚拟地址可表示的进程大小应该是2^32B = 4GB(暂时别去想页号P占多少位,W占多少位)            

2.(根据页的定义和页面大小的定义)将进程进行分页:

3.我们已经知道了页面的数目为:2^20页。现在的迷茫点就在于页表项的问题上。

   上图在页表上已经给出了几个数据:20位,12位,32位,2^20项。一一解释如下【请结合上图一个一个数据分析】:

 

    2^20项:因为页表的作用是要将页面的页框一一对应起来,所以,每一个页面在页表中都应该有一个页表项:用来表示一个页号对应一页页框号(内存中的块号),故应     

                    该有2^20项。【不应该有问题吧,就好像一个班有50个同学,每个人都应该有一个地址一样】

   20位:已经很显然了,需要表示出2^20个页表项,就至少需要20位的地址。为什么只取20位而不是21位,22位呢,本人现在还没想这个问题,就暂时定为恰好取20位即可。

   32位:已知条件里告诉了页表项大小为4B,那么自然就应该是32位了。

   12位:32位-20位 = 12位。为什么页框号地址为12位,只能表示2^12个页框,要小于2^20个页面呢,因为并不是进程的每一个页面都要调入内存。其实32位、12位、20位这三个数据还是有一定依据的,在二级分页的时候就会发现“哦,原来刚刚好”。此处暂不讨论二级分页。

 

4.通过上面的分析我们得出了哪些数据:

   逻辑地址32位,进程大小:4GB。

   页面:大小4KB,数量:2^20页。

   页表项:4B,数量:2^20项。所以页表就需要4B*2^20 = 4MB的空间存储(这就是书中说:页表项大小为4MB的由来)进一步,主存的页框大小和页面大小是相等的,也为4KB,所以将页表存在主存就需要占用4MB/4KB = 1024页(因为页表也是存在主存中的,而主存也是按页框划分的。这的确是一种资源浪费,所以就需要建立二级页面,将其大小控制在1页之内,将二级页面存入主存即可)

### 页表之间的对应关系及作用 在操作系统中,**页表**是**页表**中的基本组成单元,每个页表对应一个****,用于记录该在物理内存中是否已加载,以及如果已加载,则指向其所占用的**号**。通过页表,操作系统可以实现从虚拟地址到物理地址的转换。 页表通常包含以下信息: - **有效位(Present Bit)**:表示该是否当前存在于物理内存中。如果有效位为 1,则表示该在内存中;如果为 0,则表示该在磁盘上,需要通过缺中断调入内存[^3]。 - **号(Frame Number)**:如果有效位为 1,则页表中存储该所对应的物理号。号与内偏移量结合,可以计算出最终的物理地址[^4]。 - **访问位(Accessed Bit)**:用于记录该是否被访问过,用于面置换算法。 - **修改位(Dirty Bit)**:表示该在内存中是否被修改过,用于决定是否在换出时写回磁盘。 - **其他控制位**:如读写权限、缓存控制等。 因此,**页表之间存在一对一的映射关系**,即每个页表对应一个,而该若已加载到内存中,则对应一个唯一的号。这种映射关系确保了虚拟地址空间可以被正确地映射到物理地址空间[^2]。 ### 虚拟地址到物理地址的转换过程 在分机制下,虚拟地址由**号**和**内偏移量**组成。操作系统通过以下步骤完成地址转换: 1. 使用号作为索引,查找页表中对应的页表。 2. 如果页表中的有效位为 1,则取出其中的号。 3. 将号与内偏移量拼接,得到物理地址。 4. 如果有效位为 0,则触发缺中断,由操作系统将该从磁盘调入内存,并更新页表[^4]。 例如,若面大小为 4KB(即 $2^{12}$ 字节),则内偏移量占 12 位,其余高位为号。假设虚拟地址为 `0x00403000`,则: - 号为 `0x00403000 >> 12 = 0x403` - 内偏移量为 `0x00403000 & 0xFFF = 0x000` 通过号查找页表,若有效位为 1,则获取对应的号 `frame_num`,最终物理地址为 `(frame_num << 12) | offset`。 ### 页表的管理 页表本身也存储在物理内存中,每个页表通常占用 4 字节或 8 字节。例如,若虚拟地址空间为 32 位,面大小为 4KB,则虚拟地址空间可以划分为 $2^{20}$ 个(因为 32 - 12 = 20),每个页表占 4 字节,则整个页表大小为 $2^{20} \times 4 = 4\text{MB}$。为了减少页表所占用的内存空间,通常采用多级页表结构(如二级页表、四级页表)来优化存储效率。 在页表中,号的位数取决于物理内存的大小。例如,若物理内存为 4GB(即 $2^{32}$ 字节),面大小为 4KB,则物理内存中可容纳 $2^{32} / 2^{12} = 2^{20}$ 个,因此号需要 20 位表示。 ### 示例代码:页表结构模拟 以下是一个简化的页表结构体定义,用于演示页表的基本组成: ```c typedef struct { unsigned int present : 1; // 有效位 unsigned int read_write : 1; // 读写权限 unsigned int user : 1; // 用户/内核权限 unsigned int accessed : 1; // 是否被访问过 unsigned int dirty : 1; // 是否被修改 unsigned int frame_number : 20; // 号(假设物理内存为4GB) } PageTableEntry; ``` 该结构体模拟了一个页表的基本字段,其中 `frame_number` 表示该所对应的号,其他字段用于控制访问权限和状态。 ###
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值