Linux0.11 源码趣读
闪客
低并发编程公号作者
18650 人已学习
赠一得一
课程目录
已完结/共 22 讲
Linux0.11 源码趣读
15
15
1.0x
00:00/00:00
登录|注册

07|六行代码进入保护模式

你好,我是闪客。
这一讲我们要探讨的问题是,操作系统如何使 CPU 进入保护模式。保护模式虽然较为复杂,但仅仅是把模式切换过来只需要六行代码。
上一讲的最后,我们的内存布局变成了后面这样:
这仅仅是进入保护模式前准备工作的其中一个,我们接着往下看。

打开 A20 地址线

下面的代码仍然是 setup.s 中的。
mov al,#0xD1 ; command write
out #0x64,al
mov al,#0xDF ; A20 on
out #0x60,al
这段代码的意思是打开 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归属地:江苏
    3
    6
  • 无笔秀才
    向老师和各位师兄姐们请教一下,没太理解 二进制8 确实是00000,0000,0000,1000。 但是 当成段选择子 查找 描述符索引值 为什么是1呢?
    2023-02-24归属地:北京
    1
    1
  • 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.png
    2023-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
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部