MIT6.828-Lab1-Part1-Exercise2-理解BIOS指令

 

理解BIOS指令

使用GDB si 命令,尽可能去追踪ROM BIOS几条指令

1. 0xffff0: ljmp $0xf000, $0xe05b  # 跳转到0xfe05b,可以看到接下来CPU去执行0xfe05b的指令
2. 0xfe05b: cmpl $0x0, $cs:0x6ac8  # 比较立即数0x0和内存$cs:0x6ac8处的值,若相等ZF标志位置为1,否则清零
3. 0xfe062: jne 0xfd2e1            # ZF=0时跳转到0xfd2e1,下面指令地址说明ZF=1,即$cs:0x6ac8处的值为0
4. 0xfe066: xor %dx, %dx           # dx寄存器通过异或清零
5. 0xfe068: mov %dx, %ss
6. 0xfe06a: mov $0x7000, %esp
7. 0xfe070: mov $0xf34d2, %edx
8. 0xfe076: jmp 0xfd15c
9. 0xfd15c: mov %eax, %ecx         # 通过mov设置寄存器的值,第8条是进行绝对跳转
10. 0xfd15f: cli                   # 清除interrupt标志位,接下来的指令不会被中断
11. 0xfd160: cld                   # direction标志位置为0,意味着内存增长方向为从低到高
12. 0xfd161: mov $0x8f, %eax
13. 0xfd167: out %al, $0x70
14. 0xfd169: in $0x71, %al

inout 指令是CPU通过 eax/ax/al 寄存器和特定的端口(IO端口)和硬件设备进行交互

  • in 从特定的 port 读取 byte/word/dwordal/ax/eax
  • outal/ax/eaxbyte/word/dword 写到特定的端口

每个IO端口代表的设备见此,可以看到它是控制CMOS设备,其8-bit数据功能如下图所示:

image-20230422154134284

在计算机中,CMOS设备(存储的信息是非易失性的,断电不丢失)的主要功能有以下几个方面:

  1. 保存BIOS中的设置:在计算机启动时,BIOS (Basic Input/Output System) 会读取 CMOS 中存储的设置信息,如硬盘、光驱等设备的参数以及日期、时间等信息,以便正确配置计算机硬件和软件。
  2. 提供实时时钟功能:CMOS 中集成了一个实时时钟电路,可以独立于计算机主机运行,并持续跟踪日期和时间。实时时钟的使用非常广泛,例如在计算机开机时自动设置时间、定时备份数据、在计算机休眠或待机时保存系统状态等。
  3. 存储密码和其他安全信息:CMOS 还可以存储密码和其他安全信息,以保护计算机免受未经授权的访问。例如,计算机 BIOS 中的用户密码、硬盘加密密钥等都可以存储在 CMOS 中。
15. 0xfd16b: in $0x92, %al
16. 0xfd16d: or $0x2, %al
17. 0xfd16f: out %al, $0x92

上述指令可以确定0092 port 的 bit1=1,根据此页面的信息,可知其指示A20地址线被激活,说明此时进入了保护模式。但boot loader 程序一开始应该工作在实模式下,可以推测后续会有操作将此时的保护模式切换为实模式。

18. 0xfd171: lidtw %cs:0x6ab8     # 将从%cs:0x6ab8内存处开始的6字节数据加载到中断向量表寄存器(IDTR)
19. 0xfd177: lgdtw %cs:0x6a74     # 将从%cs:0x6a74内存处开始的6字节数据加载到全局段描述符表寄存器(GDTR)
20. 0xfd17d:  mov  %cr0, %eax
21. 0xfd180:  or  $0x1, %eax
22. 0xfd184:  mov  %eax, %cr0

CR0~CR3 是控制寄存器,用于控制和确定处理器的操作模式,上述操作将CR0的bit0置为1,表示开启保护模式。同上,后续应该有指令将操作模式切换为实模式。

参考资料

  1. cnblog-fatsheep9146
  2. github-jiahao42/MIT-JOS