zl程序教程

您现在的位置是:首页 >  系统

当前栏目

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

2023-06-13 09:17:12 时间

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

模式转换

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

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

保护模式

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

end_move:
	lidt	idt_48		# load idt with 0,0
	lgdt	gdt_48	

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

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

表达方式为

ds:偏移量

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

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

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

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

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