第二章 内存寻址 《Linux操作系统原理和 与应用》电子教案.ppt
第二章 内存寻址
Linux系统地址映射示例
内存寻址-操作系统设计的硬件基础之一
操作系统-横跨软件和硬件的桥梁
内存寻址-操作系统设计的硬件基础之一
操作系统的设计者必须在硬件相关的代码与硬件无关的代码之间划出清楚的界限,以便于一个操作系统很容易地移植到不同的平台。
在这众多的平台中,大家最熟悉的就是i386,即Intel80386体系结构。因此,我们所介绍的内存寻址也是以此为背景。
内存寻址的不同时期
石器时期-8位寻址
在微处理器的历史上,第一款微处理器芯片4004是由Intel推出的,4位。
在4004之后,intel推出了一款8位处理器叫8080,它有1个主累加器(寄存器A)和6个次累加器(寄存器B,C,D,E,H和L)
那时没有段的概念,访问内存都要通过绝对地址,因此程序中的地址必须进行硬编码(给出具体地址),而且也难以重定位
青铜时期-“段”的引入
intel开发出的16位的处理器叫8086,标志着Intel X86王朝的开始,同时引入了“段 ”概念。
段描述了一块有限的内存区域,区域的起始位置存在专门的寄存器(段寄存器)中。
8086处理器地址线扩展到了20位,寻址空间到了1M
也就是把1M大的空间分成数个64k的段来管理(化整为零了)。
把16位的段地址左移动4位后,再与16位的偏移量相加便可获得一个20位的内存地址,
IA32寄存器简介
· 把16位的通用寄存器、标志寄存器以及指令指针寄存器扩充为32位的寄存器
· 段寄存器仍然为16位。
· 增加4个32位的控制寄存器
· 增加4个系统地址寄存器
· 增加8个调式寄存器
· 增加2个测试寄存器
常用寄存器简介
通用寄存器
8个通用寄存器是8086寄存器的超集,它们分别为:EAX ,EBX ,ECX ,EDX ,EBP ,EBP, ESI及 EDI
段寄存器
8086中有4个16位的段寄存器:CS、DS、SS、ES,分别用于存放可执行代码的代码段、数据段、堆栈段和其他段的基地址。
这些段寄存器中存放的不再是某个段的基地址,而是某个段的选择符(Selector)
段基地址存放在段描述符表(Descriptor )中,表的索引就是选择符
常用寄存器简介
指令指针寄存器
指令指针寄存器EIP中存放下一条将要执行指令的偏移量(offset ),这个偏移量是相对于目前正在运行的代码段寄存器CS而言的。偏移量加上当前代码段的基地址,就形成了下一条指令的地址。
EIP中的低16位可以被单独访问,给它起名叫指令指针IP寄存器,用于16位寻址。
标志寄存器
标志寄存器EFLAGS存放有关处理器的控制标志,很多标志与16位FLAGS中的标志含义一样。
用于分页机制的控制寄存器
物理地址、虚拟地址及线性地址
将主板上的物理内存条所提供的内存空间定义为物理内存空间,其中每个内存单元的实际地址就是物理地址
将应用程序员看到的内存空间定义为虚拟地址空间(或地址空间),其中的地址就叫虚拟地址(或虚地址), 一般用“段:偏移量”的形式来描述
线性地址空间是指一段连续的,不分段的,范围为0到4GB的地址空间,一个线性地址就是线性地址空间的一个绝对地址。
地址之间的转换-保护模式下的寻址
CPU
MMU
内存
磁盘
控制器
总线
CPU把虚地址送给MMU
MMU把物理地址送给存储器
地址之间的转换-MMU机制
段机制
段是虚拟地址空间的基本单位,段机制必须把虚拟地址空间的一个地址转换为线性地址空间的一个线性地址。
用三个方面来描述段
段的基地址(Base Address):在线性地址空间中段的起始地址。
段的界限(Limit):在虚拟地址空间中,段内可以使用的最大偏移量。
段的保护属性(Attribute): 表示段的特性。例如,该段是否可被读出或写入,或者该段是否作为一个程序来执行,以及段的特权级等等。
虚拟-线性地址的转换
段描述符表-段表
如图所示的段描述符表(或叫段表)来描述转换关系。段号描述的是虚拟地址空间段的编号,基地址是线性地址空间段的起始地址。
段描述符表中的每一个表项叫做段描述符
0
1
2
索引
(段号)
保护模式下的其他描述符表简介
全局描述符表GDT(Gloabal Descriptor Table)
中断描述符表IDT(Interrupt Descriptor Table)
局部描述符表LDT(Local Descriptor Table)
为了加快对这些表的访问,Intel设计了专门的寄存器,以存放这些表的基地址及表的长度界限 。这些寄存器只供操作系统使用。
有关这些表的详细内容请参看有关保护模式的参考书。
保护模式下段寄存器中存放什么
存放索引或叫段号,因此,这里的段寄存器也叫选择