关于“物理地址=段基址x16+段内偏移地址”

以8086为例。
1、段基址和段内偏移地址都是16位(8086仅有16位数据总线);物理地址是20位(8086有20位地址总线)。
2、由于段内偏移地址是16位,所以每个段最大2^16,即0xFFFF。
3、段基址也是16位的,它放在一个20位的数据中,则低4位一定为0。

4、公式中以十进制的眼光看,确实不好理解,然则以十六进制看,再结合下图,就易懂了

00000  |---------|
              |           |
0FFFF  |_____|
10000  |            |
              |            |
1FFFF  |---------|

以10000-1FFFF为例,段基址是1000,左移4位即成了10000,加上16位的偏移地址,正好形成10000-1FFFF间的某个物理地址。


注意:实模式下,段寄存器存的是段基址,以上公式直接得到物理地址,但是在保护模式下,段寄存器内存放的是段选择子,

用段选择子到段描述符表中取得段基址,再加上偏移地址,得到的是线性地址(段式内存管理),还不是物理地址,线性地址被划分为4k的页,

页面再映射到物理地址(页式内存管理),注意连续的页面映射在物理地址上可以是不连续的,具体可参考《Linux内核源代码情景分析》第31页和33页。

### 逻辑地址到物理地址转换过程 在现代操作系统中,为了实现更灵活和安全的内存管理,通常会采用分段机制来处理逻辑地址向物理地址的转换。具体来说,在涉及到段表的情况下,整个转换流程可以分为以下几个部分: #### 分段机制概述 分段是一种将程序分割成若干独立片段的技术,每个片段称为一段(segment),每一段都有自己的起始位置(基址)和长度(limit)[^1]。 #### 段表的作用 当CPU接收到一个由应用程序产生的逻辑地址时,这个地址实际上是由两部分组成的:段选择符(selector)以及偏移量(offset)。其中,段选择符用于索引全局描述符表(GDT)或局部描述符表(LDT),从中获取对应段的具体信息——即段基址(Base Address)与界限(Limit);而偏移量则表示相对于该段起点的实际位移距离[^2]。 一旦获得了正确的段描述符之后,就可以计算出线性地址=段基址+偏移量。如果此时系统启用了分页功能,则还需要进一步利用多级页表完成从线性地址至最终物理地址的映射工作[^3]。 对于给定的例子而言,假设存在如下条件: - 页面大小为4KB (0x1000字节) - 进程P1具有特定页面变换表 - 需要解析逻辑地址`1B1A H` 根据以上设定,先依据段表找到相应的段描述符,再按照公式计算得出目标线性地址。最后参照页面变换表定位具体的帧号(Frame Number),从而获得完整的物理地址表达形式。 ```python # 假设已知参数 page_size = 0x1000 # 即4KB,以十六进制表示 logical_address_hex = "1B1A" def convert_logical_to_physical(logical_addr_str): logical_addr_int = int(logical_addr_str, 16) segment_selector = ... # 获取段选择子的方法取决于具体环境配置 # 此处省略具体实现细节 gdt_entry = get_gdt_entry(segment_selector) # 同样简化了GDT查找过程 # 实际应用需考虑特权级别等因素 base_address = gdt_entry['base'] linear_address = base_address + logical_addr_int page_table_entries = load_page_tables() # 加载并遍历各级页表直至匹配成功 # 返回包含有效PFN(Page Frame Number)在内的记录 pfn = find_matching_pfn(linear_address, page_table_entries) physical_address = (pfn << 12) | (linear_address & 0xFFF) return hex(physical_address) print(convert_logical_to_physical(logical_address_hex)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值