从0创建一个OS (十一) 进入32-bit模式
终于要进入32-bit模式了,本节将完整的学习从boot sector进入32bit模式的流程
关键字: 中断; 流程
目标:进入32-bit保护模式并且测试前两节中学习到的(GDT设置,VGA打印功能)保护模式知识.
理论基础
进入32-bit保护模式需要进行以下几个步骤:
- 关闭所有中断(不响应所有中断)
- 导入设计好的GDT
- 将CPU控制寄存器CR0的bit0设置为1
- 通过一个设计好的jmp指令跳跃到保护模式中
- 更新所有的段寄存器
- 更新栈设置
- 调用一个标签,该标签包含32bit保护模式下第一个有用的指令
接下来对每个步骤进行说明.
- 关闭中断
使用cli
指令可以屏蔽所有可屏蔽中断 - 导入设计好的GDT
在设计GDT那一节,我们设计了GDT描述符,用来确定GDT,而使用lgdt
可以将GDT描述符导入GDT寄存器(GDTR,6个字节)中,之后GDTR就可以告诉CPU,GDT的各个参数为多少. - 将CPU控制寄存器CR0的bit0设置为1
CR0是CPU的控制寄存器,其结构如下图
其中bit0,即PE(Protected Mode Enable)负责使能保护模式. - 通过一个设计好的jmp指令跳跃到保护模式中
进入保护模式运行的前提是,“进入GDT中的代码段”,因此使用jmp CODESEG:某标签
即可进入GDT中的代码段. - 更新所有的段寄存器
将所有段寄存器置为GDT中的数据段DATASEG
- 更新栈设置
将栈底和栈顶更新为32-bit模式下的栈底和栈顶 - 调用一个标签,该标签包含32bit保护模式下第一个有用的指令
本节保护模式下第一个有用的指令为32-bit模式下的VGA打印函数.
源码
32bit-switch.asm 该文件执行进入保护模式的7个步骤设置
32bit-main.asm 主程序
实验结果
__EOF__

本文作者:EwanHai
本文链接:https://www.cnblogs.com/haiyonghao/p/14623197.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/haiyonghao/p/14623197.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律