一、逻辑地址和物理地址
- 物理地址:加载到内存地址寄存器中的地址,内存单元真正的地址
- 逻辑地址:CPU生成的地址。相当于当前进程数据段的地址(是偏移地址)
二、什么是实地址模式
1、分段
在程序装入内存时并不是整块装入。因为一个程序包含了很多数据结构,不能一概而论。例如代码是只读的,相对固定的;而数据则会随着程序的变化不断发生变化。因此在程序装入的时候是采用分段的方式,将不同的程序装入不同的区域。那么定位指令或数据就使用
<段号 : 偏移量>的方式。
8086处理器中设置了CS(可执行代码)、DS(数据)、SS(堆栈)和ES(其他)这四个段寄存器。每个段寄存器都是16位的,对应地址总线中的高16位。
2、实模式的寻址方式
处理器8086有20根地址线,可以寻址1MB内存。但是,它内部的寄存器是16位的,如果按照原来的方式,把段寄存器的内容和偏移地址直接相加来形成物理地址的话,也智能得到16位的物理地址。因此如何用16位的CPU来访问20位的物理地址成为最大的问题。
为什么要提供20位的地址线?
你可能会想,让16位的CPU对应16位的地址线不就可以解决问题了吗?但是,16位的物理地址只能访问64k的内存,地址范围是0000H~FFFFH,共65536个字节,很显然这个容量肯定是不能满足需求的。而20位的物理地址就可以访问1MB的内存,地址范围是0000H~FFFFFH。
如何通过16位的段地址和16位的偏移地址来的到20位的物理地址呢?
8086处理器在形成物理地址时,先将段寄存器的内容左移4位(相当于乘以2^4),形成20位的段地址,然后再同16位的偏移地址相加,得到20位的物理地址。
举例:
对于逻辑地址:F000H : 052DH,处理器在形成物理地址时,先将段地址左移4位得到:F0000H,再加上偏移地址052DH,就可以得到20位的物理地址:F052DH。
3、实地址模式的缺陷
在实模式中,将这个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向实在的物理地址。这样以来用户程序的一个指针如果指向了系统程序区域或其他用户进程区域,并改变了值,那么对于这个被修改的系统程序或用户进程,容易造成软件甚至系统崩溃。
三、什么是保护模式
1、为什么会出现保护模式
采用"段 :偏移"模式,这样的好处是所见即所得,程序员指定的地址就是物理地址,物理地址对程序员是可见的。但是这样以来也会带来以下问题:
- 无法支持多任务
- 程序的安全性无法得到保证
2、保护模式的技术支撑
在保护模式下,全部32条地址线有效,即32位处理器配32位地址线,可寻址高达4G的物理地址空间。扩充的存储器分段管理机制和可选的分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持,支持多任务,能够进行快速地进行任务切换和保护任务环境。
3、保护模式的寻址方式和工作原理
其实在保护模式下地址的表示方式与实模式是一样的,都是 段 :偏移,不过保护模式下的“段”和实模式显得“段”作用完全不同。
- 在实模式下:段值可以看作是地址的一部分,通过将段值左移4位就可以表示一块实际物理内存。
- 在保护模式下:段值还有由cs、ds等寄存器表示,但此时它仅仅变成了一个索引,这个索引指向了一个数据结构的表项GDT(或者LDT)这个表项中详细定义了段的起始地址、界限、属性等内容
4、GDT
GDT的表项是描述段类型属性的数据结构——段描述符。它的作用是用来提供段式存储机制(这种机制由段寄存器和GDT中的描述符共同提供),GDT中的每一个段描述符都描述了一个内存段的基本属性,如段基址、段界限、类型、DPL等等。每个段描述符在GDT中占8个字节。
- 在实地址模式下,段地址并非真正的物理地址,在计算物理地址时还要左移4位。
- 在32位的保护模式下,段地址是32位的线性地址,如果未开启分页功能,该线性地址就是物理地址。

段描述符