浅谈80X86内存寻址问题
一、基础知识
本文主要浅谈80x86系列处理器的内存地址的寻址问题,当然这种问题在我学习单片机的时候是没有遇到过的。当今的操作系统不需要自己来跟踪管理物理地址,而这个工作全部由处理器的内存管理单元来完成。这样的先进电路设计使得操作系统的使用更加的高效。本文中我们主要涉及80x86的硬件内存管理电路原理与linux中的使用方式。
在早期的单片机程序设计中,在我读取某个内存单元的数据时候,我会直接对这个地址进行读写。而如今,在我们学习linux时候,我们就不能这么简单的操作,首先需要了解一下简单的知识,其中包括三种地址的含义。
逻辑地址:在80X86处理器系列中,程序员所使用的地址包括两个部分,段地址+基址,这根intel的设计思路是分不开的,早期的intel芯片如8086只是简单的16位,但是为了满足不增加系统位数而扩展物理内存寻址能力的的要求,所以intel的设计师采用段机制来扩展物理内存,当时程序员使用的就是CS:IP来寻址代码,用来实现逻辑地址到线性地址的映射,其逻辑地址到物理地址的转换方式为CS*16+IP,正好是16位的线性地址,如此便得来8086总共拥有位地址总线的原因。
线性地址:首先必须有一个清楚的概念,线性地址也就是虚拟地址,linux用户进程使用的地址就是这个虚拟地址,32位的整数可以寻址2^32=4Gb的线性空间。其地址范围用HEX进制来表示就是0x00000000~0xFFFFFFFF
物理地址:物理地址就是用来寻址物理存储芯片的地址,通常也就是处理器的物理地址总线所寻址的地址空间。常常有32位等。
逻辑地址,线性地址,物理地址的转换关系如下图所示:
二、、分段机制
原始的8086系列处理器,分段采用的是段左移四位加段内偏移地址的这种模式,这也就是传统的实地址模式。但是从80286开始,Intel系列处理器增加了另一种模式,这种模式叫做保护模式(protected mode)。我们把主要的精力放在保护模式的研究上,实地址模式主要用于处理器的向前兼容,但是有一点需要提起的是,即使现在拥有保护模式的处理器,其在开机时仍然是处在实地址模式下,用于系统的启动和操作系统的早期处理。分段基址主要涉及到两点一线,两点即逻辑地址与线性地址(虚拟地址),一线即为分段管理单元。这里主要讲解的是段选择符(CS,SS,DS),段描述符,段描述符表(GDT),以及从逻辑地址到线性地址的转移过程。这里首先说明CS等逻辑段寄存器与早期逻辑段寄存器的区别。实地址模式下的段寄存器表示的是段的起始地址。而在保护模式,段寄存器的高13位(15-13bit)保存着段描述符表的索引,后面三位保存着该段的属性,如访问等级等;其结构如下图所示。
段描述符索引:用于在段描述符表中需找相应的描述符。
TI: 用于指定是在GPT还是LPT。
RPL:用于设定访问权限等级。
其中最后一项RPL用于指定访问等级,0代表最该等级,3代表最低等级。至于其中什么叫段描述符,什么叫做段描述符表在后文会有介绍。
版权声明:本文为博主原创文章,未经博主允许不得转载。