本文描述如何对linux1.0内核修改使其能从U盘启动。
内核加载到内存是在bootsect.S文件中处理的。bootsect.S本身写在了启动设备第一个扇区。bootsect.S加载启动设备后面4个扇区,做一些启动内核前的准备。接着,加载启动设备后面的扇区–内核到内存中。
bootsect.S中的汇编代码是读取软盘的扇区的,所以,将内核文件写入U盘也是无法使用的。所以需要修改bootsect.S中加载扇区的代码。
加载扇区,主要使用的是BIOS提供的中断—int 0x13。
INT 0x13,功能02
参数:
AH 02
AL 读取扇区数
CH 柱面[0, 79]
CL 扇区[1, 18]
DH 磁头[0, 1]
DL 驱动器(0x0 ~ 0x7f表示软盘,0x80 ~ 0xff表示硬盘)
ES:BX 缓冲区地址,即数据读到这里
返回值:
CF = 0表示操作成功,此时AH=0,AL=传输的扇区数
CF = 1即carry位置位(可用JC表示跳转)表示操作失败,AH=状态代码
其中,需要注意的是,BIOS启动时将U盘看成硬盘处理。所以驱动器用0x80。
除了读取扇区,在操作扇区前还需要使用 int 0x13获取硬盘信息。
INT 0x13,功能08
参数:
AH 08H
DL 驱动器,00H~7FH:软盘;80H~0FFH:硬盘
返回:
CF=1——操作失败,AH=状态代码
CF=0 成功
BL=01H — 360K
=02H — 1.2M
=03H — 720K
=04H — 1.44M
=05H ??
=06H 2.88M
=10H ATAPI可移动介质
CH=最大柱面号的低8位 low eight bits of maximum cylinder number(柱面号从0开始算)
CL的位7-6=最大柱面号的高2位 high two bits of maximum cylinder number
CL的位5-0=最大扇区号 maximum sector number(扇区号从1开始算)
DH=最大磁头号 maximum head number(磁头号从0开始算)
DL=驱动器数 number of drives
ES:DI=磁盘驱动器参数表地址(只软驱)