上一次我们一起学到把操作系统代码都复制到内存里的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) 里找一个段描述符,段描述符里才存着段基址。
再用这个段基址和偏移地址相加,得到物理地址(线性地址,还需要进行分页转换)。整体过程如下图所示:
那全局描述符表又是什么鬼呢?我们下次接着一起学。