分享

Linux源码学习笔记day8 就这几行代码就进入保护模式了?

 山峰云绕 2023-02-24 发布于贵州

https://m.toutiao.com/is/BoKM1TG/?= 


上一次我们介绍了全局描述符表(gdt)。 为进入保护模式做好了准备,今天我们接着往下看。

A20地址线

用途:用来突破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进军了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多