https://m.toutiao.com/is/BoKM1TG/?=
上一次我们介绍了全局描述符表(gdt)。 为进入保护模式做好了准备,今天我们接着往下看。
用途:用来突破20位地址线的位宽,变成32位可用,用来增加内存寻址范围。
如果不打开A20地址线,如果给的地址数据超出20位就会把高位忽略。
比如下面这个例子,最高位的1就会被忽略。
1 0000 00000000 00000000
具体代码如下:
mov $0xD1, %al # command write out %al, $0x64 mov $0xDF, %al # A20 on out %al, $0x60
接下来就是真正切换模式了。 就是这三行代码:
#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 用二进制表示就是:
00000,0000,0000,1000
段选择子的结构是:
所以现在描述符索引值是1,那现在去**全局描述符表(gdt)**中招索引1的描述符。
现在代码段描述符和数据段描述符都是0,现在偏移量也是0。 所以,加起来还是0。
接下来就是跳转到内存地址为0的地方开始。 现在的内存地址0处,放的是操作系统的代码。 0地址处的代码就是head.s里的代码。 接下来就要向head.s进军了。
联系客服