06|解决段寄存器的历史包袱问题
闪客
你好,我是闪客。
这一讲我们要探索的是,在实模式和保护模式下,物理地址的计算方式有怎样的不同?这又和段寄存器的历史包袱有什么关系?
上一讲咱们说到,操作系统又折腾了一下内存,之后的很长一段时间内存布局就不会变了,终于稳定下来了,目前它长这个样子:
0 地址开始处存放着操作系统的全部代码,也就是 system 模块,0x90000 位置处往后的几十个字节存放着一些设备的信息,方便以后使用。
是不是十分清晰?不过别高兴得太早,清爽的内存布局,是为了方便后续操作系统的大显身手!
模式的转换
接下来就要进行真正的第一项大工程了,那就是模式的转换,需要从现在的 16 位的实模式转变为之后 32 位的保护模式。
当然,虽说是一项非常难啃的大工程,但从代码量看,却是少得可怜,所以你不必太过担心。
每次讲这里都十分的麻烦,因为这是 x86 的历史包袱问题,现在的 CPU 几乎都是支持 32 位模式甚至 64 位模式了,很少有还仅仅停留在 16 位的实模式下的 CPU。
所以,我们要为了这个历史包袱,写一段模式转换的代码,如果 Intel CPU 被重新设计而不用考虑兼容性,那么今天的代码将会减少很多,甚至不复存在。
这里我不打算直接和你说实模式和保护模式的区别,我们还是跟着代码慢慢品味。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
段寄存器的历史包袱问题一直困扰着操作系统的内存布局和模式转换。文章介绍了在实模式和保护模式下,物理地址的计算方式的不同,以及与段寄存器的历史包袱的关系。在实模式下,逻辑地址到物理地址的计算相对简单,而在保护模式下,需要通过全局描述符表来查找段基址,再加上偏移地址才能得到物理地址。这种变化是进入保护模式前的准备工作之一。全局描述符表(gdt)存储在内存中,其位置信息存储在gdtr寄存器中。文章还介绍了中断描述符表的原理和内存布局。总的来说,文章深入浅出地介绍了实模式和保护模式下的内存地址计算方式的差异,以及相关的技术细节。
该试读文章来自《Linux0.11 源码趣读》,如需阅读全部文章,
请先通过赠一得一解锁课程
请先通过赠一得一解锁课程
赠一得一
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- Doby我想问一下,CPU处理的处理的命令是用CS:IP定位的吧。在新的gdt中,代码段的base address 为 0,也就是说开启保护模式以后CPU处理的命令只用IP定位了吗?那么这样的话在开启保护模式的那一瞬间,是否CPU所执行的命令就会跳出去。假如说一开始CS=0x9000, ip=0x0000,定位到的命令地址为0x90000,命令长度为8,那么我在此时开启保护模式后,CPU就不会执行0x90008地方的命令了,而转去执行0x00008位置的命令?
作者回复: 有可能呀,所以开启保护模式后立刻长跳转了一下,算好了就到下一行地址
2022-11-21归属地:北京21 - 浩仔是程序员.word是什么意思呢
作者回复: 看 as 汇编器或 as86 汇编器手册里的定义
2022-11-07归属地:北京21 - charle历史包袱才是学习操作系统最大的拦路虎2022-11-19归属地:上海8
- 无笔秀才假如偏移量一样,到代码段和数据段查找 岂不是冲突了?2023-02-22归属地:北京1
- 周忠祥文章里提到“可以看到这个标签位置处表示一个 48 位的数据”,这个是怎么判断出来的,两个字不是32位吗,为什么是48呢2023-03-08归属地:北京1
- Geek_lucas.word 看解释说是占位用的 .word代表是字,一个字长。 字长与处理器的位数有关,比如16位处理器,字长为2Byte: 同理,arm的32位处理器字长为4字节。2023-01-10归属地:广东
收起评论