`

(第三章 6)保护模式下,读写大地址内存 & 从32位保护模式跳回16位实模式(二)

阅读更多

三、关于保护模式和实模式的跳转和段描述符高速缓冲寄存器(转载)

 

     其实从实模式跳转到保护模式还是很好懂得,主要注意就是跳转指令

 

jmp dword SelectorCode32:0  
//而不能是  
jmp SelectorCode32:0  

     因为这时编译出来的是16位代码。如果目标地址的偏移不是0,而是一个较大的值,比如

 

jmp SelectorCode32:0x12345678  

     则编译后偏移会被截断,只剩下0x5678。

 

     所以,这个特殊的跳转需要特殊的处理。在Linux内核中(Linux使用的是AT&T汇编,不是一般常见的IBMPC汇编),这个跳转是用DB指令直接写二进制代码的方法实现的,而NASM显然提供了更好的解决方法,就是加一dword,本来dword应该加在偏移之前,但NASM允许加在整个地址之前,就像我们之前做的那样,这也是NASM的优点吧。

     总之,一个程序中可以包含多个不同位的段,32位或者16位,他们之间也可以互相跳转,只是32位段用的是32位寄存器,16位代码段用的是16位寄存器,如果要在16位段下使用32位寄存器,必须象高级语言中强制类型转换一样,显式的定义 dword。

     而从保护模式跳转回实模式则不是那么好理解了,因为在准备结束保护模式,回到实模式之前,需要加载一个合适的描述符选择子到有关的段寄存器,以使对应段描述符高速缓冲寄存器 (见后面的解释)中含有合适的段界限和属性(这里正确的段界限显然是64K,即0ffffh,属性应该是DA_DRW,即92h在内存中存在的可读写/数据段),而且,不能从32位代码段返回实模式,只能从16位代码段中返回。这是因为无法实现从32位代码段返回时cs高速缓冲寄存器中的属性符合实模式的要求(实模式不能改变段属性)

 

**********************************************************************************************************************************

DA_DRW——在内存中存在的可读写代码段/数据段

 

DA_DRW      EQU 92h ; 存在的可读写数据段属性值 

 

    92h=0000,0000,1001,0010,也就是将

     TYPE设置为0010,表示可读写。见P36

     S设置为1,表示是数据段/代码段描述符(如果S=0,表示是系统段/门描述符)。见P36

     P设置为1,表示在内存中存在。见P35

 

**********************************************************************************************************************************

 

     在实模式下,段寄存器含有段值,为访问存储器形成物理地址时,处理器引用相应的某个段寄存器并将其值乘以16,形成20位的段基地址。在保护模式下,段寄 存器含有段选择子,如上所述,为了访问存储器形成线性地址时,处理器要使用选择子所指定的描述符中的基地址等信息。为了避免在每次存储器访问时,都要访问描述符表而获得对应的段描述符,从80286开始每个段寄存器都配有一个高速缓冲寄存器,称之为段描述符高速缓冲寄存器描述符投影寄存器,对程序员而言它是不可见的。每当把一个选择子装入到某个段寄存器时,处理器自动从描述符表中取出相应的描述符,把描述符中的信息保存到对应的高速缓冲寄存器中。此后访问该段时,处理器都使用对应高速缓冲寄存器中的描述符信息,而不用再从描述符表中取描述符。

     新增的Normal描述符,段界限64K,属性DA_DRW,在返回实模式之前把对应选择子SelectorNormal加载到ds、es和ss正好合适。

分享到:
评论

相关推荐

    第2章 从实模式到保护模式1

    在实模式下,CPU使用16位寄存器,而在保护模式下,它可以使用32位寄存器,提供更大的地址空间。为了进入保护模式,需要设置控制寄存器(如CR0),启用保护模式标志,并设置段描述符表(GDT)以定义内存段的属性。段...

    x86汇编语言从实模式到保护模式(完整版)更新过

    《x86汇编语言:从实模式到保护模式》是一部深入探讨x86架构处理器在不同模式下工作原理的教程。在这个完整版中,它包含通常被其他资源遗漏的后三章,提供了全面的学习材料。由于文件体积较大,作者选择了通过网盘...

    第4章80x86保护模式及其编程.rar_80x86保护模式及其编程

    在实地址模式下,内存被看作一个连续的线性空间,而保护模式则将内存分为多个段,每个段都有自己的基地址和长度。这样,即使多个程序同时运行,它们也可以拥有独立的内存空间,减少了数据冲突的可能性。 分段机制是...

    第9章 L1虚拟内存-概念 new1

    在实模式下,逻辑地址等于段地址乘以16加上偏移地址;而在保护模式下,逻辑地址通过段描述符在全局描述符表或局部描述符表中查找得到段地址,然后与偏移地址相加得到线性地址。 - 线性地址空间:这是处理器理解和...

    第一章从开机加电到Main函数执行前 《linux内核设计的艺术》的笔记内容

    同时,setup程序会开始将系统从实模式转换到32位的保护模式。保护模式允许更高级别的内存管理和访问,是现代操作系统的基础。 进入保护模式的过程包括多个步骤: 1. 关闭中断(cli)以防止在转换期间被打断。 2. 将...

    多核异构模式下有管理的共享内存设计方法-论文

    第三,内存管理单元(Memory Management Unit, MMU)的作用至关重要。MMU负责将虚拟地址转换成物理地址,并且通常具备地址映射、权限检查和内存隔离等重要功能。在多核异构系统中,MMU的设计需要能够灵活地适应不同...

    flash 闪存 读写时序 C 语言例子

    - **参数**:`ulUser0` 和 `ulUser1` 分别表示第一个和第二个用户自定义的 32 位值。 - **返回值**:操作状态,成功返回 0。 9. **`long FlashUserSave(void)`** - **功能**:保存用户自定义值。 - **返回值**...

    Windows环境下32位汇编语言程序设计(第2版)

    3. **从16位到32位的过渡**:书中分析了从16位汇编向32位汇编过渡的过程,指出了其中的关键差异和注意事项,这对于理解和掌握32位汇编语言的使用非常有帮助。 4. **实战案例**:通过一系列具体的案例(如“Hello ...

    MaxDOS 5.6s U盘版

    6.新的NTFS分区读写程序,更稳定,且支持LINUX的ext2/ext3和隐藏分区读写,支持长文件名. 7.加入HDDREG 1.51版,MHDD 4.6版,以及SPFDISK中文版. 8.更新GHOST为 8.3版,不过这里要说一下喜欢玩新的朋友,GHOST 8.2版不支持 ...

    操作系统高级教程21-22秋季1

    接着,BIOS加载操作系统内核程序,为进入保护模式做准备,这是一个从16位实模式向32位保护模式的转变,为后续的高级功能如内存保护和多任务提供了基础。 第二章涉及设备环境初始化和激活进程0。在这个阶段,操作...

    t5557读写软件

    - **保护性读写操作**:对设置了保护位的数据块进行读写操作时,需先解锁才能进行。 #### 六、总结 T5557读写软件为用户提供了一个方便快捷的方式来管理和操作T5557射频卡。通过精心设计的硬件平台和软件功能,该...

    IA-32架构软件开发人员手册第3卷 系统编程指南 中文版

    ### IA-32架构软件开发人员手册第3卷:系统编程指南知识点概览 #### 一、手册概览 **标题:** IA-32架构软件开发人员手册第3卷:系统编程指南(中文版) **描述:** 本手册为Intel官方发布的第三版系统编程指南,...

    PIC32系列参考手册 第3章 存储器构成.pdf

    - 独立的用户模式地址空间和内核模式地址空间:用户模式和内核模式下有不同的内存访问权限,以保证操作系统的安全性。 - 灵活的程序闪存存储器分区:存储器可以根据需要灵活地划分,以优化存储空间的使用。 - 数据...

    delphi制作内存补丁.rar

    4. **保护模式**:在某些情况下,目标内存可能被保护,不允许直接写入。使用 `VirtualProtect` 可以临时更改内存保护属性,使其可写,完成修改后再恢复原状。 5. **动态地址处理**:由于动态链接库(DLLs)和ASLR...

Global site tag (gtag.js) - Google Analytics