前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux源码学习笔记day6 模式转换是什么鬼?

Linux源码学习笔记day6 模式转换是什么鬼?

作者头像
用户1072003
发布2023-02-23 17:08:15
3190
发布2023-02-23 17:08:15
举报
文章被收录于专栏:码上读书码上读书

上一次我们一起学到把操作系统代码都复制到内存里的0地址处了。

模式转换

接下来就要进行模式转换了,要从16位实模式转换为32位保护模式。

这是x86的历史包袱。现在的CPU一般都是64位,至少也是32位的,所以需要写一段转换代码

保护模式

还是在setup.s文件里,搬完操作系统代码就来到了end_move这个标签处。

代码语言:javascript
复制
end_move:
	lidt	idt_48		# load idt with 0,0
	lgdt	gdt_48	

完了,这上来就是两个下马威,这俩个指令都不认识啊。

想要理解这2个指令就涉及到实模式和保护模式的区别了。目前我们还处于实模式下,这个模式的CPU寻址方式是之前说的:段基址左移4位 + 偏移地址

表达方式为

代码语言:javascript
复制
ds:偏移量

变成保护模式后,内存地址计算方式就变了。寄存器ds里的值

  • 在实模式下叫段基址
  • 在保护模式下叫段选择子,段选择子里存的是段描述符的索引。

然后根据段描述符到 全局描述符表(gdt) 里找一个段描述符,段描述符里才存着段基址。

再用这个段基址和偏移地址相加,得到物理地址(线性地址,还需要进行分页转换)。整体过程如下图所示:

那全局描述符表又是什么鬼呢?我们下次接着一起学。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上读书 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模式转换
  • 保护模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档