本文接上一篇博文,在 loader.S中干点正事儿。进入保护模式。
1.什么是保护模式?
最经典的 8086CPU 是只有实模式的。实模式下有很多的不足,所以有了保护模式。
实模式的缺点:
- 操作系统和用户程序处于同一特权级。
- 用户程序所引用的地址都是指向真实的物理地址。
- 用户程序可以自行修改段基址,可以访问所有内存。
- 访问超过 64KB 的内存区域要切换段基址。
- 一次只能运行一个程序。
- 共 20 条地址线,最大可用内存 1 MB 。
实模式是 32 位的 CPU 运行在 16 位模式下的状态。而不是CPU变为16位的了。
保护模式下,很多东西都扩展了。(因为变为32位了嘛)
-
寄存器扩展
但是 CS、 DS、 ES、 FS、 GS、 SS 段寄存器还是16位的。 -
寻址扩展
-
指令扩展
实模式下,它的操作数可以是 8 位、16位,
而在保护模式下,它不仅要支持 8 位、16位,还得支持 32 位的操作数。
add al, cl ; 8位
add ax, cx ;16位
add eax, ecx ;32位
2.全局描述符表(GDT)
在实模式下,地址用 段基址:偏移地址 来表示。段基址左移 4 位加上偏移地址。只能寻址 1MB的地址空间。
为了兼容性,地址也要用 段基址:偏移地址 来表示。但是这个段基址不是用来左移 4 位。
准确来说,段寄存器中存的不是段基址,而是选择子。
保护模式下的寻址:
- 在内存中有一部分区域是 GDT(全局描述符表),表中每个表项是段描述符。 <