购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3.2 开机引导程序

BIOS(Basic Input/Output System,基本输入/输出系统)是计算机接通电源后执行的第一个程序。BIOS首先会做硬件检查,判断是否满足计算机运行的条件,例如,内存条如果没插好,BIOS会提示错误信息,某些情况下主板会发出蜂鸣声警告等。

做完硬件检查之后要确定启动顺序,当选中某块磁盘之后,控制权限就会交给这块磁盘上的MBR(Master Boot Record,主引导记录)。MBR位于磁盘的第一个扇区,一个扇区只有512字节,其中最后两个字节是0x55和0xAA,表明这个设备可以启动。

回顾1.3.1节的bootsect.S的ld选项,-Ttext 0x0的含义正是将目标文件bootsect.o的代码段放到linux.img的开头,也就是在第一个扇区。同时我们可以用如下命令查看第一个扇区的最后两个字节为0x55AA,可以用来启动。

xxd-s 510 linux.img

1981年8月,IBM公司最早的个人电脑IBM PC 5150上市,使用的是Intel的第一代个人电脑芯片8088。8088芯片本身需要占用0x0000~0x03FF的地址空间,用来保存各种中断处理程序(引导程序本身就是中断信号INT 19h的处理程序)。所以,内存只剩下0x0400至0x7FFF的地址空间可以使用。为了把尽量多的连续内存留给操作系统,引导程序就被放到了内存地址的尾部。因为一个扇区是512(十六进制为0x200)字节,引导程序本身也需要一段内存保存数据,系统就另外给它留出512字节。所以,引导扇区的预留位置就变成了0x7FFF−512−512+1=0x7FFF−0x200−0x200+0x1=0x7C00。

在1.3.1节的例子中,bootsect.S中定义了BOOTSEG=0x7c0,汇编代码将被加载到内存地址0x7C00执行。需要注意的是,早期的8086处理器的寄存器都是16位的,地址线是20位,这就意味着CPU的寻址能力是1MB(2的20次方),但是只采用一个寄存器只能寻址64KB(2的16次方),所以它采用了基地址加偏移的方式寻址,也就是使用两个寄存器的值拼接一个真实的物理地址。它的计算方式是物理地址等于基地址左移4位加上偏移值,例如下面的代码:

mov %ds:(%ax),%bx

上述代码表示以ds寄存器为基地址,以ax寄存器为偏移值计算一个地址,然后取这个内存地址处的值,送入bx寄存器。其中,真实物理地址的值是ds的值左移4位再加上ax寄存器的值。 I0j6hKyJTKnkvXMlv3yGjm7NijyS3TuYrlR+U8GSnV3GQmmr1nagv2kNL2hhGrHV

点击中间区域
呼出菜单
上一章
目录
下一章
×