80386的内存寻址机制复习
来源:互联网 发布:ppt简约排版 知乎 编辑:程序博客网 时间:2024/05/22 01:55
题外话:
“不试试怎么知道不行。”金句啊金句。
80x86的内存寻址机制复习2011.06.03
80386处理器的工作模式:
80386处理器有三种工作模式:实模式、保护模式 和 虚拟86模式。
模式的切换:实模式和保护模式之间可以相互转换,保护模式和虚拟86模式之间可以相互转换,而实模式和虚拟86模式之间不可以相互转换。
DOS系统运行于实模式下,Windows系统运行与保护模式下。
实模式:
80386处理器被复位或加电的时候以实模式启动。
实模式下的寻址方式是和8086一样的,(段寄存器内容-段地址)SA(16bit)*16+EA(16bit)(偏移地址),其中32位的地址线只是用了低20位(16+4=20)寻址空间为2^20B = 1MB。
实模式下80386不能对内存进行分页管理,指令寻址的地址就是内存中的实际的物理地址,所以在实模式下,所有的段都是可读、可写和可执行的。
实模式下80386的中断方式和8086相同,利用中断向量表定位中断服务程序的地址,其中中断向量结构为4个字节,其中2个字节为SA,2个字节为EA。
实模式到保护模式的转换:初始化控制寄存器、GDTR、LDTR、IDTR与TR等管理寄存器以及页表,然后通过加载CR0的PE位(第0位)为1 转换成保护模式。
保护模式:
保护模式下32位地址线全部使用到,寻址空间高达4GB。
保护模式支持4个优先级,分别是ring0~ring3。
保护模式到实模式的转换:建立全局描述符表GDT、中断描述符表IDT等,通过设置CR0 的PE 位(第0位)为 0 转换成保护模式。
虚拟86模式:
是为了可以在保护模式下执行8086程序而设置的。例如:CMD命令运行的“MS-DOS应用程序”在Windows操作系统中运行。
虚拟86模式是以保护模式为基础的一个运行模式。其中采用8086的寻址方式,寻址空间为1M。
80386的内存寻址机制:
80386 在实模式下寻址跟8086一样。
重点在保护模式下:
段描述表(Segment Table):分为全局描述表(GDT Global ...) 和 局部描述表 (LDT local ...),其中段描述表里存放 段描述符。
段描述符(Segment Descriptor):优先级,是否可读写可执行,等描述段的参数,共64位。
段选择器(Segment Selector):16位的段寄存器,存放段选择器,存放段描述表的“索引”。
GDT:GDT全局描述表只有一个,包含系统中所有任务都可用的段描述符,包含操作系统中代码段、数据段、堆栈段以及各个任务的LDT段等,由GDTR指向。
LDT:每个任务都有各一个独立的LDT,包含每个任务私有的代码段、数据段、堆栈段 以及 该任务所使用的一些门描述符,例如任务门和调用门描述符等,由LDTR指向。
GDTR 直接指向内存地址, LDTR、CS、DS、SS、ES、FS 和GS 存放索引值,指向局部描述表中内存段对应的描述符在全局描述表中的位置,则只要该表LDTR,系统当前的LDT就会切换,方便了各个任务切换和任务之间数据的隔离,GDT不会随着任务的切换而切换。
具体的寻址过程:
在16位段选择器(段寄存器)中,高13位表示索引值,第0,1位表示程序当前优先级RPL (Requirement Privilege['privilid3] Level),第2位TI位表示在DT中的位置,TI=0 在 GDT中,TI=1 在 LDT中。
虚拟地址为:SA(16bit):EA(32bit) 的计算
(段寄存器内容-段地址)SA(16bit)*16+EA(32bit)(偏移地址)注意偏移为32bit
分两种情况:
一、TI = 0
① 从GDTR寄存器中获取GDT的基址
② 在GDT中应用SA的索引值(高13位),找到SD(段描述符)
③ SD 中包含了段的基址、限制长、优先级等各种属性,得到段的起始地址
④ 在③中得到的起始地址加上偏移,得到物理地址
二、TI = 1
① 从GDTR寄存器中获取GDT的基址
② 从LDTR寄存器中获取LDT描述符 在 GDT中的索引
③ 根据②中得到的索引,找到 LDT的描述符
④ 通过LDT的段描述符,得到LDT段的起始地址
⑤ 在LDT中应用 SA 的索引值(高13位),找到SD(段描述符)
⑥ SD 中包含了段的基址、限制长、优先级等各种属性,得到段的起始地址
⑦ 在⑥中得到的起始地址加上偏移,得到物理地址
补充知识:
控制寄存器是一些特殊的寄存器,它们可以控制CPU的一些重要特性。
CR0:
0位是保护允许位PE(Protedted Enable),用于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。
31位是分页允许位(Paging Enable),它表示芯片上的分页部件是否允许工作。
16位是写保护未即WP位(486系列之后),只要将这一位置0就可以禁用写保护,置1则可将其恢复。(NT5.x系列,SSDT hook的一种改写SSDT的方法)
- 80386的内存寻址机制复习
- 80386的内存寻址机制
- 8086的内存分段机制 内存寻址
- 80x86的内存寻址机制
- 80386内存寻址机制(个人见解)
- 80386内存寻址机制(个人见解)
- 内存寻址之分页机制
- 深入理解Linux内存寻址的分段机制
- Linux内存寻址之分段机制
- Linux 内存寻址之分段机制
- Linux 内存寻址之分页机制
- 内存寻址(一)硬件寻址的基本原理:硬件中的分段和分页机制,控制寄存器CR0与CR3
- 内存寻址(一)硬件寻址的基本原理:硬件中的分段和分页机制,控制寄存器CR0与CR3
- x86处理器的寻址机制
- 一个内存寻址的例子
- 深入x86的内存寻址
- 深入理解计算机系统-之-内存寻址(四)--linux中分段机制的实现方式
- Linux内存寻址之分段机制及分页机制
- MTK程序编译环境及命令
- MTK之添加资源与菜单心得
- 求IDL8.1license文件
- mtk modis 菜单功能紊乱
- 如果你想将vector中的项指定为struct,那么要注意作用域了
- 80386的内存寻址机制复习
- Oracle errorstack 工具 说明
- 利用Theme自定义Activity进入退出动画
- Java 泛型简明教程(转贴)
- linux中文
- 不知所谓
- 两台笔记本如何通过无线共享上网
- zoj 2772 python
- MSC Pool 技术详析