在实模式下的地址范围:0x7C00~0x7DFF,512B。
BIOS最后一项工作是校验启动盘中位于0盘0道1扇区(就是第0个,但是根据CHS表示磁盘扇区的方法,叫做1扇区)的内容。如果此扇区末尾的两个字节分别是魔数0x55和0xaa,BIOS就认为此扇区中存在可执行的程序(即MBR),便加载到物理地址0x7C00,随后跳转到此地址。
1、为什么是0盘0道1扇区?
因为这个扇区距离BIOS最近(BIOS可能在这个扇区)。
2、为什么是0x7C00?
这也是一个魔数,0x7C00最早出现在IBM的个人电脑PC5150的ROM BIOS的INT 19H中断处理程序中。开机后,BIOS处理程序开始自检,调用BIOS中断,即call int 19h。在此中断处理程序中,BIOS要检测这台计算机有多少个硬盘或软盘,如果检测到了任何可用的磁盘,BIOS就把它的第一个扇区加载到0x7C00。
那为什么PC 5150要把它放到0x7C00呢?
PC 5150 BIOS研发工程师假定最小内存32KB。一、为了避免被过早覆盖,MBR被放在32KB的末尾;二、MBR本身大小512字节,但还要为其所用的栈分配空间,所以其实际所用的内存空间要大于512字节,估计1KB够用。根据以上两点,32KB为0x8000,减去1KB(0x400),等于0x7C00,这就是0x7C00的由来。
作用:读取硬盘,把loader程序读到内存,此处把loader读到0x900。
步骤:
待操作的扇区数、写入地址、写入命令、操作
1、先选择通道,往该通道的sector count寄存器中写入待操作的扇区数。
2、往3个LBA寄存器写入扇区起始地址的低24位。
3、往device寄存器中写入LBA地址的24~27位,并置第6位为1,使其为LBA模式,设置第4位,选择操作的硬盘(master或slave硬盘)。
4、往command寄存器写入命令。
5、读取status寄存器,判断硬盘工作是否完成。
6、如果是读硬盘,进入第7步,否则,完工。
7、将硬盘数据读出。