内存地址分为三种不同的地址:逻辑地址、线性地址、物理地址。
逻辑地址:就是我们普遍应用使用的地址。每个逻辑地址都有一个段(段标识符)和偏移量(指定内存相对地址)表示,偏移量表示段开始的地方到实际地址之间的距离。段标识符也叫段选择符,是一个16位长的字段。偏移量是一个32位长的字段。
线性地址:就是虚拟地址。
物理地址:内存真正的地址,用于内存芯片级内训单元寻址。
内存控制单元 通过
分段单元的硬件电路把逻辑地址转换为线性地址, 然后通过
分页单元的硬件电路将线性地址转换为物理地址。
在多处理器的系统中,多个CPU共享一个内存,但是在RAM芯片上的读写操作必须串行的进行,因此有一种 内存仲裁器(memory arbiter) 的硬件电路插在总线和每个RAM芯片之间,来控制CPU使用内存。这是个硬件电路,编程方面不必考虑。
为方便快速查找到段选择符 ,从而找到地址,处理器提供 “段寄存器”来存放段选择符。
段寄存器只存放段选择符
段寄存器只有6个,但是程序可以使用一个段寄存器用于不同的目的,方法是现将其保存在内存中,使用时再恢复。
段寄存器分为 SS 、CS 、DS 、FS 、 ES 、GS 其中三个是特殊使用,另外三个作为普通使用,可以指向任意的数据段
特殊使用:SS(栈段寄存器) 指向包含当前程序栈的段
CS(代码段寄存器)指向包含当前程序指令的段。特殊功能:包含一个两位的字段,指明cpu的当前特权级,分为0(00)和3,0为
内核态,3(11)为用户态
DS(数据段寄存器)指向包含静态数据或者全局数据的段
段描述符:(8字节)不是段选择符。段描述符描述了段的特征,就像进程描述符与描述了进程的所有特征一样。放在全局描述符表(GDT)或者局部描述符表(LDT)。通常只有一个GDT,每个进程除了有自己的 GDT外一般都有附加的LDT。描述符包含段的字节线性地址,描述符特权级等等,内容不做赘述。
80x86提供一种非编程的寄存器(一个程序员不能设计的寄存器),提供给六个可编程的段寄存器使用,非编程的寄存器存放8字节的段描述符,由相应的段寄存器中的段选择符来指定。每当一个段选择符被装入段寄存器时,相应的段描述符就被装入非编程的CPU寄存器中。此时针对那个段的逻辑地址转换就可以不访问主存中的GDT或者LDT,CPU只需直接引用存放段描述符寄存器即可获得对应的线性地址。当寄存器内的段改变时才会再去访问GDT或者LDT。大致流程是这样的,段选择符被载入段寄存器,根据GDT或者LDT找到相应的段描述符放入非编程的寄存器中,访问非编程的寄存器中的段描述符,获得逻辑地址对应的线性地址。
linux广泛采用的不用类型的段和对应的描述符:
代码段描述符:表示是一个代码段,可以放在GDT和LDT中。
数据段描述符:表示是一个数据段,可以放在GDT和LDT中。
任务状态段描述符:代表一个任务状态段,例如处理器寄存器内容,只能出现在GDT中。
局部描述符表描述符:表示一个包含LDT的段,只能出现在GDT中。
阅读(3116) | 评论(0) | 转发(0) |