80x86逻辑地址到线性地址的转换

本文详细介绍了80x86处理器中逻辑地址转换为线性地址的过程,包括段选择符、段描述符的作用及存储位置,并解释了不同进程间逻辑地址的区分方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先梳理一下概念:

逻辑地址是由16位的段选择符和32位的偏移量组成;

段选择符是有13为的index,1位TI,2位RPL组成;

段选择符存在CPU的段寄存器中;

段描述符放在全局描述符标GDT或者局部描述符LDT中;

段描述符是8字节64位,里面有Base字段是该段的首字节的线性地址;

(notice)段描述符原始是存在GDT 或者 LDT中的,但是80x86处理器提供了一组非编程的CPU寄存器来存储该对应的段描述符。(这样就能每次不用访问主存中的GDT,只要CPU中的段寄存器的内容没有发生改变,可以直接从CPU的寄存器中直接获取段描述符,达到快速访问)

GDT的在主存中的首地址放在gdtr控制寄存器中;

LDT的在主存中的首地址放在ldtr控制寄存器中;

逻辑地址到线性地址的转换过程:
逻辑地址中的段选择符的13为index*8(因为是段描述符是8字节,现在是计算他的地址所以*8)+gdtr寄存器(或者ldtr寄存器)中的GDT(或者LDT)【由段选择符的TI位决定】的首地址,得到在GDT(LDT)中的段描述符;
段描述符的Base+逻辑地址的32位偏移量得到该逻辑地址对应的线性地址。

每个进程的逻辑地址的区别:

分段给每个进程分配其能访问的线性地址的范围,而这个会记录在给进程的GDT中的段描述符中的Base字段跟Limit字段

进程间的逻辑地址的区别是前面16位的段选择符不一样,这个是由操作系统分配给他们的,后面的32位偏移量是没有进程的区别概念的,它就是一个简单的偏移量而已,最终觉得如何将逻辑地址转换为线性地址还是主要靠段选择符的13为index跟1位TI以及段描述符中的Base字段决定,当然肯定是会加上没有进程意义的32位偏移量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值