实地址模式与保护模式、虚拟地址映射

一、三种地址

逻辑地址:在有地址变换功能的计算机中,访内指令给出的地址 (操作数) 叫逻辑地址,也叫相对地址。要经过寻址方式的计算或变换才得到内存储器中的实际有效地址,即物理地址。

线性地址:线性地址是逻辑地址到物理地址变换之间的中间层。在分段部件中逻辑地址是段中的偏移地址,然后加上基地址就是线性地址。如果不启用分页,那么此线性地址即物理地址。

物理地址:线性地址经分页转换后就成了物理地址。

 

二、Intel X86 CPU 系列的寻址方式

X86系列,是指Intel从16位微处理器8086开始的整个CPU芯片系列,系列中的每种型号都保持与以前的各种型号兼容。

在X86系列中,8086和8088是16位处理器,而从80386开始为32位处理器。

当我们说一个CPU是16位/32位时,指的是处理器中“算术逻辑单元(ALU)”宽度。数据总线通常与ALU具有相同的宽度(但有例外),

最自然的地址总线宽度是与数据总线一致的。

1、8086  实地址模式

8086中采用的是16位CPU,但地址总线是20位(采用和1M字节的内存地址空间),所以有些地址CPU访问不到,为了解决这个问题,在8086CPU中设置了四个“段寄存器”:CS、DS、SS、ES,分别用于指令、数据、堆栈和其他。每一个段寄存器都是16位的,对应于地址总线的高16位。

它有1MB寻址能力,那怎么用16位的段寄存器表示呢?

    这就引出了分段的概念,8086CPU将1MB存储空间分成许多逻辑段,每个段最大限长为64KB(但不一定就是64KB)。这样每个存储单元就可以用“段基地址+段内偏移地址”表示。这样就实现了从16位内部地址到20位实际地址的转换(映射)。段基地址由16位段寄存器值左移4位表达,段内偏移表示相对于某个段起始位置的偏移量。

段寄存器<<4 + 逻辑地址(16位)= 线性地址 = 物理地址

但是这种操作是没有地址空间保护机制的,对于每一个由段寄存器的内容确定的基地址,一个进程总能访问从此开始的64K字节的联系地址空间,而无法加以限制。

实地址模式:是相对于之后的保护模式而言的,通过改变段寄存器的值再加上逻辑地址偏移量就可以对内存空间任何地方都可以访问。(对内存空间的访问无任何限制)

 

2、80386  保护模式

现代操作系统在刚加电时首先运行在实模式下,然后再切换到保护模式下运行。

80386 采用32位CPU,那么他的ALU数据总线是32位的。最自然的地址总线宽度是与数据总线一致。当地址总线宽度达到32位时,其寻址能力达到了4G。因为之后的版本要兼容之前的,所以80386保留了之前的段寄存器,还必须支持实地址模式,与此同时还要能支持保护模式。

80386的段式内存管理机制

保护模式通过“段选择符+段内偏移”寻址最终的线性地址或物理地址的。

段选择符为16位,它不直接指向段,而是通过指向的段描述符,段描述符再定义段的信息。

每个段描述表项的大小是8个字节,每个描述表项含有段的基地址和段的大小和其他信息。GDTR里存放GDT的信息。例如GDT大小8字节,即64位,其中32位放基地址,通过下标找到是哪一项。

 

三、线性地址到物理地址的转换

task_struct中的pgd就是用代码实现了上述过程

写的好的博客:https://blog.csdn.net/LeeHannahSylvia/article/details/76239098

进程地址空间

 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值