从保护模式返回实模式

【我所認知的BIOS】—>實模式&保護模式切换实例 【我所認知的BIOS】—>實模式&保護模式切换实例LightSeed      2009-6-23      上一章從基礎概念上我談了談我的理解。素不知“紙上得來終覺淺,絕知此事要躬行”呀!不多說二話,我們來詳細剖析實模式和保護模式的相互切換。(我儘量解釋清楚每一句話,以下舉的例子是楊季文老師書里一個最簡單的例子)Let us go!1、這個例子中code做的事下麵我們看到 阅读详情

杂记:1 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):堆栈段寄存器;
ES(Extra Segment):附加段寄存器。

杂记2: jmp段内跳转和段间跳转


函数调用必须要有栈空间的存在,除了栈空间之外,还要一个栈顶指针,也就是 esp 寄存器,它必须指向栈空间最顶上的位置。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先从 32位保护模式的代码段 跳转到 16位保护模式的代码段
然后再从 16位保护模式的代码段 跳转到16位实模式的代码段
注意;中间有一个 16位保护模式代码段的 作为中转站

注意,保护模式下也有16位的代码段,很好理解,保护模式就体现在保护这两个字上面,就是对内存进行保护,即内存有各自的属性,如这段内存 是否只读 只写等等,那么也完全可以定义16位的 受保护的代码段,即有各自属性的16位代码段。

而这个作为中转的16位保护模式代码段 只做一件事,就是 用合适的选择子对目标段寄存器进行赋值。
可以理解为 此时从16位保护模式 切换到 16位实模式,各个段寄存器的属性需要被修改为16位实模式下应有的属性,所以跳转前设置好,将各个段寄存器设置为16位实模式下应有的属性,最后跳转回16位实模式。

问题:为什么要 用合适的选择子对段寄存器进行赋值 ??

在这里插入图片描述
绝大多数时候。处理器运行于保护模式下,而处理器运行在保护模式的时候,性能的瓶颈在于 段描述符是定义在内存中的,所以如果处理需要得到 段基址 段界限 或者 段属性的时候,就必须去读内存,从内存中拿到想要的值。那么这时候问题来了,众所周知,处理器的速度要比内存的速度快的多得多,如果要反复频发的去读内存里面的值,显然会拖慢速度,效率当然会限制。

所以需要解决的一个首要问题就是,如何快速高效的访问内存中的段描述符 ??

在这里插入图片描述在处理器内存,职能是将 相应的段描述符的值 缓存下来,这样的话,需要得到 段基址 段界限 或者 段属性的时候,就不用不停的读内存了,直接到处理器内部的 高速缓冲存储器中取数据就可以了,而这个高速缓冲存储器 特点就是高速!! 这样就解决了性能问题。

问题:高速缓冲存储器 会在什么时候 缓存 内存段描述符的值呢?
答案:就在我们使用选择子对段寄存器赋值的时候,就会触发处理器的一个内部操作,即 将段描述符 从 内存中 加载进对应的高速缓冲存储器。

注意:每一个段寄存器都有一个与之对应的高速缓冲存储器。

在这里插入图片描述
在这里插入图片描述所以说我们在进入实模式的时候,必须要保证高速缓冲存储器里面的值是合适的,但是不能够直接访问设置高速缓冲存储器的值,可以用段描述符。

注意此处的 : 在实模式下,段属性的值不可设置!!!,只能沿用保护模式下所设置的值!! 所以这里就需要在 保护模式跳转到实模式的最后一步
,在保护模式中 通过段描述符 提前设定好 需要跳转到的实模式的段属性!!!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实验

%include "inc.asm"

org 0x9000

jmp ENTRY_SEGMENT

[section .gdt]
; GDT definition
;                                 段基址,       段界限,       段属性
GDT_ENTRY       :     Descriptor    0,            0,           0
CODE32_DESC     :     Descriptor    0,    Code32SegLen - 1,    DA_C + DA_32
VIDEO_DESC      :     Descriptor 0xB8000,     0x07FFF,         DA_DRWA + DA_32
DATA32_DESC     :     Descriptor    0,    Data32SegLen - 1,    DA_DR + DA_32

;32位保护模式下专用栈  段描述符
;32位保护模式下专用栈属性 :32位保护模式下 可读可写段   范围 0 - 0x7c00 定义为32位保护模式下全局栈空间
STACK32_DESC    :     Descriptor    0,     TopOfStack32,       DA_DRW + DA_32

;保护模式下的 16位代码段 段描述符
;保护模式下的 16位代码段属性 :可执行
;注意段界限一定要指定为 0xFFFF 64k, 否则跳不回实模式
CODE16_DESC     :     Descriptor    0,        0xFFFF,          DA_C 

;特殊的 段描述符
;属性 段基址是0,因为最后是跳转到16位的实模式下,所以这里的段基址其实是用不到的,主要用到的是段界限和段属性
;界限是64K(16位实模式下 每个段最多就是64K 即每个段寻址最大界限) , 属性可读可写
UPDATE_DESC     :     Descriptor    0,        0xFFFF,          DA_DRW
; GDT end

GdtLen    equ   $ - GDT_ENTRY

GdtPtr:
          dw   GdtLen - 1
          dd   0
          
          
; GDT Selector

Code32Selector    equ (0x0001 << 3) + SA_TIG + SA_RPL0
VideoSelector     equ (0x0002 << 3) + SA_TIG + SA_RPL0
Data32Selector    equ (0x0003 << 3) + SA_TIG + SA_RPL0

;定义 32位保护模式下专用栈空间 段描述符STACK32_DESC的 选择子,在全局段描述符表中的下标是4  所以段描述符索引值是 4
Stack32Selector   equ (0x0004 << 3) + SA_TIG + SA_RPL0

;定义 保护模式下的 16位代码段 段描述符CODE16_DESC的选择子,在全局段描述符表中的下标是5  所以段描述符索引值是 5
Code16Selector    equ (0x0005 << 3) + SA_TIG + SA_RPL0

;定义 特殊的段描述符 段描述符UPDATE_DESC的 选择子 在全局段描述符表中的下标是6  所以段描述符索引值是 6
UpdateSelector    equ (0x0006 << 3) + SA_TIG + SA_RPL0
; end of [section .gdt]

;16位实模式 栈顶
TopOfStack16    equ 0x7c00

[section .dat]
[bits 32]
DATA32_SEGMENT:
    DTOS               db  "D.T.OS!", 0
    DTOS_OFFSET        equ DTOS - $$
    HELLO_WORLD        db  "Hello World!", 0
    HELLO_WORLD_OFFSET equ HELLO_WORLD - $$

Data32SegLen equ $ - DATA32_SEGMENT

[section .s16]
[bits 16]
ENTRY_SEGMENT:
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, TopOfStack16
    
	;向 BACK_TO_REAL_MODE标签所代表的内存单元地址偏移+3个字节 的位置 写入 cs寄存器的值,即设置jmp段间跳转的 段基址(cd代码段基址)
    mov [BACK_TO_REAL_MODE + 3], ax
    
    ; initialize GDT for 32 bits code segment
    mov esi, CODE32_SEGMENT
    mov edi, CODE32_DESC
    
    call InitDescItem
    
    mov esi, DATA32_SEGMENT
    mov edi, DATA32_DESC
    
    call InitDescItem
    
    mov esi, STACK32_SEGMENT
    mov edi, STACK32_DESC
    
    call InitDescItem
    
	;初始化 保护模式16位代码段 的段描述符的段基址信息
    mov esi, CODE16_SEGMENT
    mov edi, CODE16_DESC
    
    call InitDescItem
    
    ; initialize GDT pointer struct
    mov eax, 0
    mov ax, ds
    shl eax, 4
    add eax, GDT_ENTRY
    mov dword [GdtPtr + 2], eax

    ; 1. load GDT
    lgdt [GdtPtr]
    
    ; 2. close interrupt
    cli 
    
    ; 3. open A20
    in al, 0x92
    or al, 00000010b
    out 0x92, al
    
    ; 4. enter protect mode
    mov eax, cr0
    or eax, 0x01
    mov cr0, eax
    
    ; 5. jump to 32 bits code
    jmp dword Code32Selector : 0

;从保护模式回到此处
;当代码执行到此处时,处理器已经成功返回实模式,对段寄存器的赋值只会改变相应高速缓冲存储器中的段基址,而段界限和
;段属性仍沿用 UPDATE_DESC中定义的值
BACK_ENTRY_SEGMENT: 
;对这些段寄存器重新赋值 ds(数据段寄存器)  es(附加段寄存器) ss(堆栈段寄存器),即刷新对应的高速缓冲存储器
;赋的值就是段基地址左移四位之前的值,cs(代码段寄存器),获取代码段 段继地址
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov ss, ax
	;改变栈顶指针 16位实模式 栈顶0x7c00
    mov sp, TopOfStack16
    
	;关闭A20地址线
    in al, 0x92
    and al, 11111101b
    out 0x92, al
    
	;打开中断
    sti
    
	;此处已经从保护模式 返回到 实模式,在实模式下打印 hello world
    mov bp, HELLO_WORLD
    mov cx, 12
    mov dx, 0
    mov ax, 0x1301
    mov bx, 0x0007
    int 0x10
    
    jmp $

; esi    --> code segment label
; edi    --> descriptor label
InitDescItem:
    push eax

    mov eax, 0
    mov ax, cs
    shl eax, 4
    add eax, esi
    mov word [edi + 2], ax
    shr eax, 16
    mov byte [edi + 4], al
    mov byte [edi + 7], ah
    
    pop eax
    
    ret
    
;保护模式下的 16位代码段,用于做中转,只做一件事,就是 用合适的选择子对段寄存器进行赋值
; 32位保护模式的代码段 -->(16位保护模式的代码段)--> 16位实模式的代码段
[section .s16]
[bits 16]
CODE16_SEGMENT:
;这里是关键!! 因为在我们使用选择子对段寄存器赋值的时候,会触发处理器的一个内部操作,即 将段描述符 从 内存中 加载进对应的高速缓冲存储器
;所以这里是将 特殊的 段描述符UPDATE_DESC信息 刷新到 目标段寄存器对应的高速缓冲存储器
;用 特殊的 段描述符UPDATE_DESC的 选择子  为段寄存器进行赋值,是为了刷新目标段寄存器对应的高速缓冲存储器
; 该段描述符 没有段基址(0),段界限64K,段属性可读可写

;将 该段描述符信息 复制到 ax寄存器,并同步到如下寄存器 ds(数据段寄存器),es(附加段寄存器),fs,gs(用于显存段),ss(堆栈段寄存器)
;即同时刷新了 这些寄存器对应的高速缓冲存储器,刷新到符合16位实模式下 段界限和段属性该有的样子
;注意1 此时没有刷新 cs(代码段寄存器)对应的高速缓冲处理器,因为此时我们现在还是处于保护模式的16位代码段中执行,执行需要受保护,不能将此刻的代码段属性改为16位实模式!!
;注意2 该段 段界限一定要指定为 0xFFFF 64k, 否则跳不回实模式,因为 BACK_ENTRY_SEGMENT代表16位实模式下的偏移地址,最大64K, 要保持一致!!
    mov ax, UpdateSelector
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax
    
	;通知处理器 现在退出保护模式 进入实模式
    mov eax, cr0
	;将对应位置 0 
    and al, 11111110b
    mov cr0, eax

;此处已经不是保护模式了,跳转地址不可以用选择子了,要用16位实模式下的地址操作方法 目标地址 : 段基地址<<4 + 偏移地址
;;所以这里处理器将这条语句理解为 跳转到 段基地址0<<4 + 偏移地址BACK_ENTRY_SEGMENT = 目标地址
;注意这里是段间跳转!!! 跳转到 16位实模式所对应的代码处
;我们想要跳转到( 段基地址<<4+BACK_ENTRY_SEGMENT)地址处继续执行,段基地址已经被设置为了cs寄存器值(前面有设置为ENTRY_SEGMENT标签地址)
;前面已经将16位实模式下的代码段基地址cs寄存器值 复制到  BACK_TO_REAL_MODE标签所代表的内存单元地址偏移+3个字节 的位置
; 注意此时 前面将16实模式代码段段基址拷贝到了 本标签所代表地址偏移三个字节位置处(jmp 跳转命令 段基地址),根据内存排布特点,就可以排除是段内跳转了 !! 段内跳转 jmp指令最多一共才3个字节长度
BACK_TO_REAL_MODE:    
    jmp 0 : BACK_ENTRY_SEGMENT

;段的长度    
Code16SegLen    equ    $ - CODE16_SEGMENT

    
[section .s32]
[bits 32]
CODE32_SEGMENT:
    mov ax, VideoSelector
    mov gs, ax
    
    mov ax, Stack32Selector
    mov ss, ax
    
    mov eax, TopOfStack32
    mov esp, eax
    
    mov ax, Data32Selector
    mov ds, ax
    
    mov ebp, DTOS_OFFSET
    mov bx, 0x0C
    mov dh, 12
    mov dl, 33
    
    call PrintString
    
    mov ebp, HELLO_WORLD_OFFSET
    mov bx, 0x0C
    mov dh, 13
    mov dl, 31
    
    call PrintString
    
	;跳转到 16位保护模式代码段,即 CODE16_SEGMENT 标签处
	;注意区分,这是保护模式,处理器识别该命令是 通过选择子得到段基地址,再到该段的0偏移位置处
    jmp Code16Selector : 0

; ds:ebp    --> string address
; bx        --> attribute
; dx        --> dh : row, dl : col
PrintString:
    push ebp
    push eax
    push edi
    push cx
    push dx
    
print:
    mov cl, [ds:ebp]
    cmp cl, 0
    je end
    mov eax, 80
    mul dh
    add al, dl
    shl eax, 1
    mov edi, eax
    mov ah, bl
    mov al, cl
    mov [gs:edi], ax
    inc ebp
    inc dl
    jmp print

end:
    pop dx
    pop cx
    pop edi
    pop eax
    pop ebp
    
    ret
    
Code32SegLen    equ    $ - CODE32_SEGMENT

;32位保护模式下专用栈段 代码节  大小4K
[section .gs]
[bits 32]
STACK32_SEGMENT:
	;times 可以占位?
    times 1024 * 4 db 0
;栈空间大小
Stack32SegLen equ $ - STACK32_SEGMENT
;栈顶值
TopOfStack32  equ Stack32SegLen - 1
X86从实模式到保护模式 源代码 X86从实模式到保护模式 源代码。 立即下载

相关推荐

SAM2与Docker的完美组合:5分钟搞定Linux环境下的图像分割部署

本文详细介绍了如何在Linux环境下通过Docker快速部署SAM2图像分割模型,解决安装过程中的常见问题。文章提供了从镜像选择、CUDA版本匹配到容器构建的全流程指南,特别针对GPU加速环境下的'cudnn_frontend: No execution plans support the graph'等报错提供了实用解决方案,帮助开发者在5分钟内完成高效部署。

fern8的博客 933

13 - 从保护模式返回实模式

13 - 从保护模式返回实模式

嵌入式wu 780

如何用ggplot2绘制专业级双侧柱状图展示GO富集结果(附完整代码)

本文详细介绍了如何使用R语言的ggplot2包绘制专业级双侧柱状图展示GO富集结果,包括数据预处理、基础图形构建、高级样式定制和出版级细节调整。通过完整的代码示例和实用技巧,帮助生物信息学研究人员高效可视化高通量数据,提升学术图表的质量和可读性。

weixin_30342209的博客 77

从保护模式到实模式的转换

弄了几天了,终于弄好了,呵呵,也得到了不少东西。从保护模式到是模式的转换一定要注意的有(转): 1、程序开始时在实模式下要有自己的堆栈段,进入保护模式前先暂存ss及sp的值至某内存处,以便从保护模式返回实模式后恢复到原先的堆栈。 2、返回实模式前需把各段寄存器设置为规范段,包括SS也要设置 3、返回实模式前必须在16位段返回,不能在32位段里返回实模式。 4、返回实模式前的段必

sunacmer的专栏 5492

VMware Workstation Pro 16 安装 Ubuntu 20.04

VMware Workstation Pro 16 安装 ubuntu 20.04目录环境VMware Workstation下载Ubuntu 20.04下载安装过程 目录 环境 Windows 10 Workstation 16 Pro for Windows Ubuntu 20.04 LTS 64位 desktop版本 VMware Workstation下载 链接: https://www.vmware.com/products/workstation-pro/workstation-pro-eval

qq_45642410的博客 1万+

Spring Boot Swagger未授权访问漏洞:原理、风险与修复方案详解

在微服务架构中,API文档管理是开发与运维的重要环节。Swagger作为RESTful API文档生成与调试的标准化工具,通过OpenAPI规范自动生成交互式接口文档,极大提升了开发效率。然而,其默认配置往往缺乏访问控制,导致文档端点直接暴露,形成未授权访问漏洞。从技术原理看,该漏洞源于Spring Boot等框架集成Swagger时,相关端点未纳入安全框架的拦截范围,攻击者可通过扫描常见路径获取完整的接口定义与数据结构。这不仅会造成敏感信息泄露,更可能成为越权操作、数据篡改等深度攻击的入口点。在工程实践中

weixin_42524171的博客 498

《一个操作系统的实现》读书笔记--第三章--“实模式--保护模式--实模式”转换过程

下面以pmtest2.asm为例,来讲述“实模式--保护模式--实模式”的转换过程。 1、“实模式--保护模式--实模式”的转换过程。 2、介绍段描述符属性 3、pm.inc 中的宏定义 4、pmtest2.asm源代码 一、“实模式--保护模式--实模式”的转换过程 1、“实模式--保护模式”的跳转 (1)关中断 (2)打开地址线A20 (3)置cr0寄存器的末位为1

zgh1988的专栏 6159

【数据结构】考点二十八 : 二叉树的概念:二叉树的度、完全二叉树、满二叉数结点数、哈夫曼结点数、完全二叉树的深度

二叉树(Binary Tree)是一种常见的数据结构,它或者为空(null),或者由一个根节点(root node)和两个子树(left subtree 和 right subtree)组成,这两个子树又分别是一棵二叉树。二叉树的每个节点最多有两个子节点,通常称为左子节点(left child)和右子节点(right child)。

超越的博客 1738

进入保护模式小例子

16位实模式进入32位保护模式

x 280

13、HTML 表格创建与样式设置全攻略

本文全面介绍了HTML表格的创建与样式设置方法,涵盖表格行列添加、边框控制、行和列分组(thead、tbody、tfoot、colgroup)、宽度与高度设置、内边距与间距调整,以及表格对齐方式。同时提供了最佳实践建议、常见问题解决方案及综合示例代码,帮助开发者构建结构清晰、样式美观且兼容性强的HTML表格。

blue的专栏 97

基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机

目录基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机项目实例1. 项目背景2. 系统架构2.1 电励磁同步电动机模型2.2 三相逆变器模型2.3 自适应控制器(Adaptive Controller)2.4 系统框图3. 模型设计3.1 创建Simulink模型3.2 自适应控制(Adaptive Control)设计3.3 仿真环境搭建4. 参数优化4.1 自动调优5. 实际应用案例5.1 工业驱动系统5.2 风力发电系统6. 结论进一步优化建议需求分析电励磁同步电动机

MHD0815的博客 266

第十三课 从保护模式返回实模式

  前几节课我们演示了从实模式进入到保护模式,那么从保护模式返回到实模式具体怎么操作呢?   先将上一节的程序列出: 1 %include "inc.asm" 2 3 org 0x9000 4 5 jmp CODE16_SEGMENT 6 7 [section .gdt] 8 ; GDT definition 9 ; ...

diaozhiwa5526的博客 371

【ArcGIS Pro微课1000例】0065:制作千层饼多图层叠加效果

右键dem图层,点击符号系统,在右侧的符号系统窗口中,选择拉伸,勾选【显示名称】和【显示全部】,选择高程色带7。由于数据具有高程源,因此可以将数据进行三维显示。右键地面→添加高程源图层。打开ArcGIS PRo,新建一个局部场景,命名为千层饼。设置了高程源数据之后,千层饼一下子就变成了三维形状。数据默认都是在一个平面上,以默认的符号系统显示。到此为止,每个图层均为平面的千层饼已经做好了。将TIN图层的高程偏移设置为-1000。最后将等高线的高程设为2000.移除工程默认加载的图层。默认即可,不需要做修改。

智慧空间实验室 1156

实模式到保护模式再返回实模式的学习代码

下面的代码是根据于渊的《自已动手写操作系统》里面的代码所写的,编译器是Nasm;描述符 在pm.inc中%macro Descriptor 3 dw %2 & 0ffffh dw %1 & 0ffffh db (%1 >> 16) & 0ffh dw (%2 >> 8) & 0f00h | (%3 & 0f0ffh) db (%1 >> 24) & 0ffh%endmacro;主文件%

ciahi的专栏 1376

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

从保护模式返回实模式_返回早期模式

从保护模式返回实模式 返回早期模式 (Return Early Pattern)When I learned about programming, the basic thought process that I had when creating a function was to validate the corresponding requirements until reaching t...

weixin_26752759的博客 609

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

操作系统实践(4)——从保护模式返回实模式

好吧,一开始我觉得从保护模式应该就是设置一下cr0然后jmp一下就回到实模式了,这个没必要去实践。不过看到书中里面有些代码觉得有些冗余,然后里面有段话也是没看明白,动手实践才恍然大悟。 于渊在书中写这个例子的思路大概是这样的: 1. 从实模式中跳转进入保护模式。(参考前面几篇) 2. 在保护模式下,访问一个地址偏大点的(实模式寻址范围之外)内存块进行读写,验证一下保护模式寻址范围是不是比实模式寻

最帅惋红曲 1868

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

x86架构下保护模式返回实模式的技术实现与挑战

在x86架构中,CPU工作模式切换是系统编程的核心技术之一。保护模式通过段描述符表实现内存隔离与保护,而实模式则采用经典的段地址寻址方式。两种模式在内存管理、中断处理等方面存在本质差异,这使得模式切换过程需要严格遵循特定时序和操作序列。正确实现保护模式到实模式的切换对系统兼容性开发、传统硬件初始化等场景具有重要价值。特别是在嵌入式系统、虚拟化技术中,这种底层模式切换技术仍然是解决特定问题的关键手段。通过合理控制CR0寄存器、重新加载段描述符以及正确处理中断控制器,可以确保模式切换的稳定性和可靠性。

dezhen7015的博客 387

汇编:实模式->保护模式->实模式 切换的注意事项

1、程序开始时在实模式下要有自己的堆栈段,进入保护模式前先暂存ss及sp的值至某内存处,以便从保护模式返回实模式后恢复到原先的堆栈。 2、返回实模式前需把各段寄存器设置为规范段,包括SS也要设置 3、返回实模式前必须在16位段返回,不能在32位段里返回实模式。 4、返回实模式前的段必须定义在GDT中。 5、在32位段下操作有关寄存器时,注意32位寄存器和16位寄存器的差别,类似于SP寄存器,应用使用ESP寄存器。 6、在使用定义在LDT中的段时,一定要使用LLDT先加...

qq_42136434的博客 268

3.保护模式3----保护模式进阶

在前面的代码上进行修改后,测试读写大地址内存(实模式下的1MB限制),而且从保护模式再调回实模式. 上代码分析(省略前面重复的代码部分): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3

tasty 302

保护模式与实模式的切换

关于从保护模式切换到实模式的相关说明   参考于渊的《自己动手写操作系统》第三章中从实模式切换到保护模式,最后有重新切回实模式的代码(代码如下),其中有几点不太明白的,参考其他文章之后在此记录一下。 其中还有不太明白的地方,希望大家能在下面 留个言帮我讲明白,谢谢。 下面代码有些宏定义没贴出来,应该能看明白。   1; ====================

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1244

卓一笔记--实模式跳到保护模式再跳回实模式

书接上回,上节<卓一笔记>--保护模式下访问5M地址处数据讲到实模式跳到保护模式,在保护模式下访问5M大地址处的数据.眼尖的同学肯定发现了这段代码进入保护模式后就再没有出来,那如何回到实模式吗?请看此节讲解 首先构建pm.inc DA_32 EQU 4000h ;32位段 DA_DRW EQU 92h ; 存在的可读写数据段属性值 DA_...

qinjiliaoqinmu的专栏 304

OS——保护模式编程(2)

[section .gdt]    --->  we should give such these definations for the Descriptors in that section                LABEL_GDT --> empty Descriptor;                LABEL_DESC_CODE32 --> ...

weixin_30952535的博客 90

《自己动手做操作系统》保护模式阅读报告

一、            基本 1、实模式下的寻址模式和寻址能力: 寻址模式为 段值*16+偏移值 ,寻址能力为0~FFFFFh。 当时由于计算机的发展,地址线增加到了20位,但是处理器仍是16位的,由于16位的寄存器不能存放20位的地址,因此内存被分成多个64KB的段,段值如00000、10000、20000等,由于最后一个十六进制数都为0,因此省略了,将高16位存放在段寄存器,

Pandoras Box 1373
上一篇: 80386保护模式下实现 Hello World
下一篇: 局部段描述符表的使用
Ma浩然
博客等级 码龄9年 1万+粉丝 462原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值