- 浏览: 543528 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
三、关于保护模式和实模式的跳转和段描述符高速缓冲寄存器(转载)
其实从实模式跳转到保护模式还是很好懂得,主要注意就是跳转指令
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正好合适。
发表评论
-
(第三章 8 )特权级——保护模式的特权级检查(DPL,RPL,CPL, 一致代码段,非一致代码段)
2013-03-20 11:14 2365特权级是保护模式下一个重要的概念,CPL,RPL和 ... -
(第6章 1)最简单的进程
2012-10-11 10:56 1035第一步——ring0 --> ring1 ... -
(第4章 2)突破512字节的限制
2012-09-15 11:40 2792一、代码 ... -
(第4章 1)软盘结构及其数据读取
2012-09-14 21:59 1939参考资料: http://blog.cs ... -
(第三章 12)中断
2012-09-11 20:20 1033一、中断和8259A中断控制器 1. ... -
(第三章 8 )特权级——CPL、DPL、RPL
2012-07-11 10:02 2408很久以后,等我大量翻阅关于“保护模式的特权级检 ... -
(第三章 0)保护模式如何“保护”
2012-03-14 07:59 1082IA32中“保护模式”的“保护”二字理解:(P48) ... -
(第一、二章)nasm的汇编和反汇编
2012-02-27 13:36 4974nasm的汇编和反汇编 步骤: 1. 汇编(bo ... -
(第三章 14)克勤克俭用内存——初始化页目录表、页表,开启分页机制
2011-07-22 11:30 249在启动分页机制SetupPaging之前,先调用了Di ... -
(第三章 13)克勤克俭用内存——查看内存块
2011-07-22 09:25 143[SECTION .data1] ALIGN 32 ... -
(第三章 12)克勤克俭用内存——显示字符串
2011-07-21 16:25 116DispStr调用方法: [SECTION . ... -
(第三章 11)根据自己内存情况 使用分页机制
2011-06-11 15:51 1475一、查看内存分布情况 设置“页目录表”和“页 ... -
参考博客-还有哪些人也在看这本书
2011-06-10 22:46 1365这位很详细: http://www.cnblogs.com/ ... -
(第三章 10)“代码段间跳转” 和 “访问数据段”
2011-06-10 15:40 1380下面说明代码段和数据段的访问: 一、代码段间跳转 ... -
(第三章 9)通过调用门进行有特权级变换的转移(二)
2011-06-08 11:29 191本文展示《(第三章 9)通过调用门进行有特权级变换的转移(一) ... -
(第三章 9)“调用门” 和 “利用调用门在高低特权级的转移”
2011-06-08 10:34 2685在此之前,先要熟悉汇编指令“长/短jmp”、“长/短c ... -
(第三章 7)LDT
2011-06-06 09:49 1511先展示一下效果图: 直接看代码: ... -
(第三章 5)保护模式下,读写大地址内存 & 从32位保护模式跳回16位实模式(一)
2011-06-05 13:53 2072一、主要功能 ... -
(第三章 3)数据段/代码段描述符
2011-06-05 11:53 2254一、宏定义和属性常量 (代码段/数据段描述符见P32;门描述 ... -
(第三章 4)A20地址线
2011-06-03 20:43 2067A20地址线困惑我了很久,这篇文章终于揭开了这个谜 ...
相关推荐
在实模式下,CPU使用16位寄存器,而在保护模式下,它可以使用32位寄存器,提供更大的地址空间。为了进入保护模式,需要设置控制寄存器(如CR0),启用保护模式标志,并设置段描述符表(GDT)以定义内存段的属性。段...
《x86汇编语言:从实模式到保护模式》是一部深入探讨x86架构处理器在不同模式下工作原理的教程。在这个完整版中,它包含通常被其他资源遗漏的后三章,提供了全面的学习材料。由于文件体积较大,作者选择了通过网盘...
在实地址模式下,内存被看作一个连续的线性空间,而保护模式则将内存分为多个段,每个段都有自己的基地址和长度。这样,即使多个程序同时运行,它们也可以拥有独立的内存空间,减少了数据冲突的可能性。 分段机制是...
在实模式下,逻辑地址等于段地址乘以16加上偏移地址;而在保护模式下,逻辑地址通过段描述符在全局描述符表或局部描述符表中查找得到段地址,然后与偏移地址相加得到线性地址。 - 线性地址空间:这是处理器理解和...
同时,setup程序会开始将系统从实模式转换到32位的保护模式。保护模式允许更高级别的内存管理和访问,是现代操作系统的基础。 进入保护模式的过程包括多个步骤: 1. 关闭中断(cli)以防止在转换期间被打断。 2. 将...
第三,内存管理单元(Memory Management Unit, MMU)的作用至关重要。MMU负责将虚拟地址转换成物理地址,并且通常具备地址映射、权限检查和内存隔离等重要功能。在多核异构系统中,MMU的设计需要能够灵活地适应不同...
- **参数**:`ulUser0` 和 `ulUser1` 分别表示第一个和第二个用户自定义的 32 位值。 - **返回值**:操作状态,成功返回 0。 9. **`long FlashUserSave(void)`** - **功能**:保存用户自定义值。 - **返回值**...
3. **从16位到32位的过渡**:书中分析了从16位汇编向32位汇编过渡的过程,指出了其中的关键差异和注意事项,这对于理解和掌握32位汇编语言的使用非常有帮助。 4. **实战案例**:通过一系列具体的案例(如“Hello ...
6.新的NTFS分区读写程序,更稳定,且支持LINUX的ext2/ext3和隐藏分区读写,支持长文件名. 7.加入HDDREG 1.51版,MHDD 4.6版,以及SPFDISK中文版. 8.更新GHOST为 8.3版,不过这里要说一下喜欢玩新的朋友,GHOST 8.2版不支持 ...
接着,BIOS加载操作系统内核程序,为进入保护模式做准备,这是一个从16位实模式向32位保护模式的转变,为后续的高级功能如内存保护和多任务提供了基础。 第二章涉及设备环境初始化和激活进程0。在这个阶段,操作...
- **保护性读写操作**:对设置了保护位的数据块进行读写操作时,需先解锁才能进行。 #### 六、总结 T5557读写软件为用户提供了一个方便快捷的方式来管理和操作T5557射频卡。通过精心设计的硬件平台和软件功能,该...
### IA-32架构软件开发人员手册第3卷:系统编程指南知识点概览 #### 一、手册概览 **标题:** IA-32架构软件开发人员手册第3卷:系统编程指南(中文版) **描述:** 本手册为Intel官方发布的第三版系统编程指南,...
- 独立的用户模式地址空间和内核模式地址空间:用户模式和内核模式下有不同的内存访问权限,以保证操作系统的安全性。 - 灵活的程序闪存存储器分区:存储器可以根据需要灵活地划分,以优化存储空间的使用。 - 数据...
4. **保护模式**:在某些情况下,目标内存可能被保护,不允许直接写入。使用 `VirtualProtect` 可以临时更改内存保护属性,使其可写,完成修改后再恢复原状。 5. **动态地址处理**:由于动态链接库(DLLs)和ASLR...