声明:本blog基于2019 NJU OS Labs
Lab1 系统引导
1、任务
- 通过 start.s 从实模式切换到保护模式,进入 boot.c 中调用 app 完成 hello world 的打印
2、细节
……
cli #clearinteruption 关闭中断是为了保证 cpu 在开启 A20 地址线时不被外部中断打扰
inb $0x92, %al #Fast set up A20 Line with port 0x92,necessary or not?
……
必须要打开 A20 地址线: 因为最初8086/8088 拥有20根地址线,可以访问$2^{20}$(即1M)的地址, 但是 8086/8088 是 16 位地址($2^{16=64KB}$),表示不了 1M 的地址.
为了访问到 1M 地 址,Intel 采取了分段模式来计算绝对地址:
20 位地址 =16位基地址左移 4 位+16 位偏移量.
采用上述模式:0xFFFF0+0xFFFF=0x10FFEF,实际上计算机能访问的内存 远远超过了系统实际能访问的 1M,这种情况在 8086/8088 中因为产生”回卷”(超过 1M自动从 0 开始计算)没有影响. 到了80286,系统地址总线发展到24根,系统实际能访问的内存达到了 2^24(即16M),这个时候仍然按8086/8088的标准采用”回卷”处理需要访问1M以上 的内存就会导致无法访问真实的 1M~16M 的内存.
解决这个问题的途径就是引入”A20地址线”. 80286 为了兼容 8086/8088,在实模