Question 1:
User-level ISA 是用户态的 application 可以直接调用的指令集。
System-level ISA 是 application 必须通过系统调用来执行的指令集。
Question 2:
内存寻址模式有 Real Mode 和 Protected Mode。
Real Mode,访存寻址用 Segment:Offset 的方法。寄存器 16-bit,总线 20-bit。 实际编程时用段寄存器来指定 segment。
Protected Mode,由于为了考虑向前兼容性,段寄存器仍然使用 16-bit,但段描述符已经成了64-bit,所以引入了GDT,用段寄存器的值寻址 GDT,GDT存放着段描述符。
Question 3:
- BIOS 把磁盘第一个扇区中的启动代码读到物理地址 0x7c00 处,初始化 cs = 0,ip = 7c00,以 real mode 开始执行
- 关闭中断,将 ds、es、ss几个段寄存器的值初始化为0.
- 打开 A20gate
- 将 GDT 的 bass 和 limit 到 GDTR
- 将 CR0 中的 PE 位置成 1,从 real mode 切换到 protected mode
- 通过 ljmp 将 cs 设为 8,同时修改 PC
- 调用 boot main 函数读取 kernel 的 elf 文件,启动 kernel
-
What is the usage of "ljmp $(SEG_KCODE<<3), $start32"?
修改 cs 寄存器,同时修改 PC -
What is the A20 problem?
在8086/8088中,只有20根地址总线,所以可以访问的地址是2^20=1M,但由于8086/8088是16位地址模式,能够表示的地址范围是0-64K,所以为了在8086/8088下能够访问1M内存,Intel采取了分段的模式:16位段基地址:16位偏移。其绝对地址计算方法为:16位基地址左移4位+16位偏移=20位地址。
到了80286,系统的地址总线发展为24根,这样能够访问的内存可以达到2^24=16M。Intel在设计80286时提出的目标是,在实模式下,系统所表现的行为应该和8086/8088所表现的完全一样,也就是说,在实模式下,80286以及后续系列,应该和8086/8088完全兼容。但最终,80286芯片却存在一个BUG:如果程序员访问100000H-10FFEFH之间的内存,系统将实际访问这块内存,而不是象过去一样重新从0开始。
为了解决上述问题,IBM使用键盘控制器上剩余的一些输出线来管理第21根地址线(从0开始数是第20根),被称为A20 Gate:如果A20
Gate被打开,则当程序员给出100000H-10FFEFH之间的地址的时候,系统将真正访问这块内存区域;如果A20
Gate被禁止,则当程序员给出100000H-10FFEFH之间的地址的时候,系统仍然使用8086/8088的方式。绝大多数IBM PC兼容机默认的A20
Gate是被禁止的。由于在当时没有更好的方法来解决这个问题,所以IBM使用了键盘控制器来操作A20 Gate,但这只是一种黑客行为,毕竟A20
Gate和键盘操作没有任何关系。在许多新型PC上存在着一种通过芯片来直接控制A20 Gate的BIOS功能。从性能上,这种方法比通过键盘控制器来控制A20
Gate要稍微高一点。
因此在实模式下,gate关闭时,无法访问1M以上内存地址;gate打开的时候,可以访问到1M以上内存地址。而在保护模式下,gate关闭时,用户只能访问0-1M,2-3M……的地址;gate开启时,可以访问全地址。
网友评论