https://m.toutiao.com/is/BoKM1TG/?= 上一次我们介绍了全局描述符表(gdt)。 为进入保护模式做好了准备,今天我们接着往下看。 A20地址线用途:用来突破20位地址线的位宽,变成32位可用,用来增加内存寻址范围。 如果不打开A20地址线,如果给的地址数据超出20位就会把高位忽略。 比如下面这个例子,最高位的1就会被忽略。 1 0000 00000000 00000000 具体代码如下:
模式切换,开始~接下来就是真正切换模式了。 就是这三行代码: #mov $0x0001, %ax # protected mode (PE) bit #lmsw %ax # This is it! ljmp $sel_cs0, $0 # jmp offset 0 of code segment 0 in gdt 前面2行,把寄存器cr0 的位0设置成1,就从实模式切换成保护模式了。 接下来又是一个跳转指令, cs寄存器的值是 ip寄存器的值是 前面有说过,模式改成保护模式后,物理地址的转化逻辑就变了,段寄存器里的值是段选择子了。 8 用二进制表示就是:
段选择子的结构是: 所以现在描述符索引值是1,那现在去**全局描述符表(gdt)**中招索引1的描述符。 现在代码段描述符和数据段描述符都是0,现在偏移量也是0。 所以,加起来还是0。 接下来就是跳转到内存地址为0的地方开始。 现在的内存地址0处,放的是操作系统的代码。 0地址处的代码就是head.s里的代码。 接下来就要向head.s进军了。 |
|
来自: 山峰云绕 > 《操作系统原理及内核源码文件》