07|六行代码进入保护模式
闪客
你好,我是闪客。
这一讲我们要探讨的问题是,操作系统如何使 CPU 进入保护模式。保护模式虽然较为复杂,但仅仅是把模式切换过来只需要六行代码。
上一讲的最后,我们的内存布局变成了后面这样:
这仅仅是进入保护模式前准备工作的其中一个,我们接着往下看。
打开 A20 地址线
下面的代码仍然是 setup.s 中的。
这段代码的意思是打开 A20 地址线。到底什么是 A20 地址线呢?
简单来说,这一步就是为了突破地址信号线 20 位的宽度,变成 32 位可用。这是由于 8086 CPU 只有 20 位的地址线,所以如果程序给出 21 位的内存地址数据,那多出的一位就被忽略了。
我举个例子,你更容易理解。比如如果经过计算得出一个内存地址为:
1 0000 00000000 00000000
那实际上内存地址相当于 0,因为高位的那个 1 被忽略了,溢出了地址线。
当 CPU 到了 32 位时代之后,由于要考虑兼容性,还必须保持一个只能用 20 位地址线的模式,所以如果你不手动开启的话,即使地址线已经有 32 位了,仍然会限制只能使用其中的 20 位。
简单么?我们继续往下看。接下来这段代码,我建议你完全不用看,毕竟 Linus 自己都注释说过“这是一段不得不做,又一点意思也没有的代码”。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
六行代码进入保护模式,本文深入探讨了操作系统如何使 CPU 进入保护模式的过程。首先介绍了打开 A20 地址线的操作,解释了 A20 地址线的作用和必要性。随后详细讲解了对可编程中断控制器 8259 芯片进行的编程,以及重新编程的原因和意义。接着,重点介绍了切换模式的关键一步,通过修改寄存器的一位实现了从实模式到保护模式的切换,并进行了段间跳转指令的解释。最后,总结了保护模式下内存寻址方式的变化,以及跳转到内存地址的 0 地址处执行操作系统核心代码的过程。文章通过简洁的代码和清晰的解释,使读者能够快速了解 CPU 进入保护模式的关键步骤和原理,展现了深入的技术特点。
该试读文章来自《Linux0.11 源码趣读》,如需阅读全部文章,
请先通过赠一得一解锁课程
请先通过赠一得一解锁课程
赠一得一
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- 周晓东老师帮指点下我的理解是否正确,pe为置1也就是lmsw ax执行后为分界线,整个世界就进入了保护模式,下一条指令jmpi 0,8的取址就要遵循保护模式的法则,由于这个时候cs为0,gdt的第0个表项值全0,所以保护模式、实模式算出的物理地址是一样的(其实就是ip里的值),能顺利取到下一条指令jmpi 0,8,有点恒等的意思
作者回复: 没问题
2022-11-03归属地:北京3 - 小氘从实模式切换到保护模式后为什么可以继续执行下面的指令,因为段寄存器中有描述符高速缓存器,描述符高速缓存器中有段基址,切到保护模式后CS描述符高速缓存器中的段基址仍然是0x90200,所以下条指令“jmpi 0,8”依然可以取到。执行“jmpi 0,8”指令后,CS描述符高速缓存器中的段基址更新为0。2023-02-15归属地:江苏36
- 无笔秀才向老师和各位师兄姐们请教一下,没太理解 二进制8 确实是00000,0000,0000,1000。 但是 当成段选择子 查找 描述符索引值 为什么是1呢?2023-02-24归属地:北京11
- ileruza老师,我找了一圈还是没完全理解.word的作用,文档和一些资料说他是分配内存空间的。结合gdt这个标签下的一堆.word来看,确实像是弄了一个“gdt数组”,但是在那段无用的代码里.word的作用就完全说不清了呀,感觉好像没啥意义,也跟什么jmp $+2什么延迟之类的扯不上联系2022-12-11归属地:广东1
- charle太棒了,以前就是在这里卡死,放弃治疗的2022-11-19归属地:上海1
- 流风.word 0x07FF .word 0x0000 .word 0x9A00 .word 0x00C0 老师请问一下在setup.s中上面的全局描述符为什么基地址是0x0呢? 全局描述符的接口不应该是如下图片的格式吗? 为什么和图上的格式不一样呢? https://img-blog.csdnimg.cn/img_convert/cb1a782facb2aa9c846aadf2aad5667c.png2023-12-14归属地:广东
- 流风老师您好 请问 .word 0x07FF .word 0x0000 ; base address=0 .word 0x9A00 ; code read/exec .word 0x00C0 ; granularity=4096, 386 为什么基地址是0x0呢?2023-12-14归属地:广东
- hello操作系统为什么要有实模式和保护模式两种模式呢?2023-02-11归属地:云南5
收起评论