中断处理过程示意图_ucore操作系统实验笔记 - Lab1

最近一直都在跟清华大学的操作系统课程,这个课程最大的特点是有一系列可以实战的操作系统实验。这些实验总共有8个,我在这里记录实验中的一些心得和总结。

Task1

这个Task主要是为了熟悉Makfile以及如何生成操作系统的镜像文件。Makefile会用就行了,并不用太深入的理解。

Task2

这个Task主要是为了熟悉GDB以及熟悉操作系统的启动过程,下面是调试BIOS的一些过程。

首先修改gdbinit为:

set architecture i8086

target remote :1234

define hook-stop

x/i $pc

end

然后输入

make debug

通过输入

x/i $cs

x/i $eip

我们可以获取当前 $cs 和 $eip 的值。其中

$cs = 0xf000

$eip = 0xfff0

在实模式下,这个地址就是

$cs << 4 | $eip = 0xffff0

我们也可以看看这个地址的指令是什么

x/2i 0xffff0

得到的结果是

0xffff0: ljmp $0xf000,$0xe05b

也就是说,BIOS开始的地址应该是

$cs << 4 | 0xe05b = 0xfe05b

此时, 我们设置一个断点到0x7c00:

b *0x7c00 /* 注意,对于绝对地址来说,需要添加*将其作为地址 */

然后当程序运行起来后, 最后会停止在 0x7c00 这个地址。这里存放的便是bootloader了。

Task3

这个Taks是这5个Taks中最重要的一个。通过这个Task我们可以了解:如何开启A20;CPU是如何从实模式转换到保护模式;如何初始化和使用GDT表。

如何开启/关闭 A20

实模式下内存的访问

在开启A20前,我们先来说说i8086时CPU是如何访问内存空间的。

在i8086时代,CPU的数据总线是16bit,地址总线是20bit,寄存器是16bit,因此CPU只能访问1MB以内的空间。因为数据总线和寄存器只有16bit,如果需要获取20bit的数据, 我们需要做一些额外的操作,比如移位。实际上,CPU是通过对segment(每个segment大小恒定为64K) 进行移位后和offset一起组成了一个20bit的地址,这个地址就是实模式下访问内存的地址:

address = segment << 4 | offset

理论上,20bit的地址可以访问1MB的内存空间(0x00000 - (2^20 - 1 = 0xFFFFF))。但在实模式下, 这20bit的地址理论上能访问从0x00000 - (0xFFFF0 + 0xFFFF = 0x10FFEF)的内存空间。也就是说,理论上我们可以访问超过1MB的内存空间,但越过0xFFFFF后,地址又会回到0x00000。

上面这个特征在i8086中是没有任何问题的(因为它最多只能访问1MB的内存空间),但到了i80286/i80386后,CPU有了更宽的地址总线,数据总线和寄存器后,这就会出现一个问题: 在实模式下, 我们可以访问超过1MB的空间,但我们只希望访问1MB以内的内存空间。为了解决这个问题, CPU中添加了一个可控制A20地址线的模块,通过这个模块,我们在实模式下将第20bit的地址线限制为0,这样CPU就不能访问超过1MB的空间了。进入保护模式后,我们再通过这个模块解除对A20地址线的限制,这样我们就能访问超过1MB的内存空间了。

A20开启/关闭的过程

现在使用的CPU都是通过键盘控制器8042来控制A20地址线。默认情况下,A20地址线是关闭的(第20bit的地址线限制为0),因此在进入保护模式(需要访问超过1MB的内存空间)前,我们需要开启A20地址线(第20bit的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值