简易开发操作系统内核:由实模式进入保护模式(32位寻址)

本文介绍了从实模式进入保护模式的过程,重点在于如何实现32位寻址,以扩展寻址空间至4GB。内容包括保护模式的特点,转换步骤,以及相关汇编代码的解析,解释了为何不能在初始化时直接传入地址的原因。
摘要由CSDN通过智能技术生成

保护模式的两个特点:

1.寻址空间从实模式的1M增强到4G
2.不同的代码拥有不同的优先级,优先级高的能够执行特殊指令,优先级低的,某些重要指令就无法执行。
在实模式下,cpu是16位的,寄存器16位,数据总线16位,地址总线20位,于是寻找的范围必然受限于20位的地址总线,所以寻找范围无法超过1M(2^20).要想实现4GB的寻址,我们必须使用32位来表示地址,intel是这么解决这个问题的,他们用连续的8个字节组成的结构体来解决一系列问题。4G = (2^32)

BYTE7 BYTE6 BYTE5 BYTE4 BYTE3 BYTE2 BYTE1 BYTE0

字节2,3,4以及字节7,这四个字节合在一起总共有32位,这就形成了一个32位的地址。同时把字节0,字节1,以及将字节6的拆成两部分,各4个bits,前4个bits跟字节0,字节1合在一起,形成一个20个bit的数据,用来表示要访问的内存长度。

由实模式到保护模式步骤:

  1. 初始化32位代码段的段基址,并存储到GDT中对应的描述符中
  2. 准备GDT的基地址,并通过LGDT指令加载到GDTR寄存器中
  3. cli关中断
  4. 打开地址线A20
  5. 将CR0寄存器的PE位置1,进入保护模式

(对于CR0控制寄存器的解释https://blog.csdn.net/whatday/article/details/24851197)

  1. 已经进入保护模式,跳转到32位代码段继续执行
  2. 写显存

由实模式进入保护模式汇编代码:

%include "pm.inc" ;常量,宏,以及一些说明 32位的二进制数,8个字节

org 0x9000

jmp LABEL_BEGIN

[SECTION .gdt] ;定义一个段,名字:gdt
;                           段基址      段界限                  属性
LABEL_GDT:      Descriptor      0,         0,                    0                   ;空描述符
LABEL_DESC_CODE32: Descriptor   0,         SegCode32Len - 1,    DA_C 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值