有效逻辑地址所对应的物理地址

本文详细阐述了分页存储管理机制的基本原理,包括物理地址的计算方法、分页机制的作用及具体应用实例。通过两个典型例题,帮助读者深入理解逻辑地址到物理地址的转换过程。

一、有效逻辑地址所对应的物理地址的计算方法

1.逻辑地址/页面大小=页号

2.逻辑地址 mod 页面大小=页内偏移
3.通过页号查找页表得到对应的物理区块
4.物理地址=物理区块x页大小+页内偏移



二、分页机制的作用 
  分页机制是在段机制之后进行的,它进一步将线性地址转换为物理地址。 
  80386使用4K字节大小的页,且每页的起始地址都被4K整除。因此,80386把4GB字节线性地址空间划分为1M个页面,采用了两级表结构。 
两级页表 
  两级表的第一级表称为页目录,存储在一个4K字节的页中,页目录表共有1K个表项,每个表项为4个字节,线性地址最高的10位(22-31)用来产生第一级表索引,由该索引得到的表项中的内容定位了二级表中的一个表的地址,即下级页表所在的内存块号。 

第二级表称为页表,存储在一个4K字节页中,它包含了1K字节的表项,每个表项包含了一个页的物理地址。二级页表由线性地址的中间10位(12-21)位进行索引,定位页表表项,获得页的物理地址。页物理地址的高20位与线性地址的低12位形成最后的物理地址。


三、应用计算例子

1. 在一分页存储管理系统中,逻辑地址长度为16,页面大小为4096字节,现有一逻辑地址为2F6AH,且第0, 1, 2页依次存放在物理块5, 10 ,11,问相应的物理地址为多少?

:由题目所给给条件可知,本页式系统的逻辑地址结构为:

页号P,页内位移W

逻辑地址2F6AH的二进制表示如下:

P                           W

0010              111101101010

由此可知逻辑地址2F6AH的页号为2,该页存放在第11号物理块中,用十六进制表示志号为B,所以物理地址为BF6AH.

2.(南开大学1994年试题)在采用页式存储管理的系统中,默作业J的逻辑地址空间为4页(每页2048字节),且已知该作业的页面映象表(即页表)如下:

页号       块号

0            2

1           4

2           6

3           8

试借助地址变换图(即要求画出地址变换图)求出有效逻辑地址4865所对应的物理地址。

解:在本题中,一页大小为2048字节,则逻辑得志4865的页号机页内位移:为:

页号:        4865/2048=2

页内位移      4865-2048x2=769

然后,通过页表查知物理块号为6,将物理块号与逻辑地址中的页内位移拼接,形成物理地址,即:

        6*2048+769=13057



在分页存储管理中,逻辑地址转换为物理地址的过程涉及到页表内存管理单元(MMU)的协作。具体步骤如下: 1. **逻辑地址结构** 逻辑地址通常由两部分组成:页号(Page Number)页内偏移量(Offset)。例如,在一个32位系统中,如果页面大小为4KB(即 $2^{12}$ 字节),则逻辑地址的低12位表示页内偏移量,而高20位表示页号。 2. **页表检索** 通过页号作为索引,在页表中查找对应的物理块号(Frame Number)。页表是一个数据结构,记录了每个页号对应的物理块号[^1]。 3. **物理地址构造** 物理地址由物理块号页内偏移量拼接而成。物理块号占据高位,而页内偏移量占据低位。例如,若物理块号为20位,页内偏移量为12位,则最终的物理地址为32位,格式如下: - 高20位:物理块号 - 低12位:页内偏移量 4. **地址转换示例** 假设逻辑地址为 `0x0000F000`,页面大小为4KB(即偏移量占12位),且页表中该页号对应的物理块号为 `0x0000A`。逻辑地址的页号部分为 `0x0000F`,偏移量为 `0x000`。将物理块号 `0x0000A` 偏移量 `0x000` 拼接后,得到物理地址 `0x0000A000`。 5. **硬件支持** 现代处理器中的内存管理单元(MMU)负责自动完成逻辑地址物理地址的转换。操作系统需要维护页表,并确保其正确加载到MMU中。 ### 示例代码 以下是一个简单的模拟程序,用于演示如何将逻辑地址转换为物理地址: ```c #include <stdio.h> // 定义页面大小页表大小 #define PAGE_SIZE 4096 // 4KB #define PAGE_TABLE_SIZE 1024 // 页表结构 int page_table[PAGE_TABLE_SIZE]; // 假设物理块号为整数类型 // 初始化页表 void init_page_table() { for (int i = 0; i < PAGE_TABLE_SIZE; i++) { page_table[i] = -1; // 初始状态为无效 } // 假设前几个页号映射到连续的物理块号 for (int i = 0; i < 10; i++) { page_table[i] = i + 100; // 页号i映射到物理块号i+100 } } // 转换逻辑地址物理地址 unsigned int logical_to_physical(unsigned int logical_address) { unsigned int page_number = logical_address / PAGE_SIZE; unsigned int offset = logical_address % PAGE_SIZE; if (page_number >= PAGE_TABLE_SIZE || page_table[page_number] == -1) { printf("Invalid page number: %u\n", page_number); return -1; } return (page_table[page_number] * PAGE_SIZE) + offset; } int main() { init_page_table(); unsigned int logical_address = 0x0000F000; // 示例逻辑地址 unsigned int physical_address = logical_to_physical(logical_address); if (physical_address != -1) { printf("Logical Address: 0x%08X -> Physical Address: 0x%08X\n", logical_address, physical_address); } return 0; } ``` ###
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值