6) 确定根文件系统设备号并保存其设备号于root_dev
! Linux中,软驱的主设备号是2,次设备号=type*4+nr,其中nr为0-3分别对应软驱A、B、C和D;
! type是软驱类型(2->1.2MB或7->1.44MB)。
! 因为7*4+0=28,所以/dev/PS0 (2,28)指1.44MB A驱动器,其设备号是0x021c(2*256+28)
! 同理,/dev/at0 (2,8)值1.2MB A驱动器,设备号是0x0208
! 取上面获得的每磁道扇区数,如果sectors=15说明是1.2MB的驱动器;如果sectors=18说明是1.44M软驱(为什么?);
!因为是可引导的驱动器,所以肯定是A驱
seg cs
mov ax,root_dev
cmp ax,#0
jne root_defined !检查root_dev是否是空,如果否,则说明其已经存入根设备号,直接跳转后面
seg cs
mov bx,sectors
mov ax,#0x0208 ! /dev/ps0 - 1.2Mb
cmp bx,#15
je root_defined !将sectors与15对比,如果相同,则ax=0x0208,最终赋值给root_defined
mov ax,#0x021c ! /dev/PS0 - 1.44Mb
cmp bx,#18
je root_defined !将sectors与18对比,如果相同,则ax=0x021c,最终赋值给root_defined
undef_root:
jmp undef_root
root_defined:
seg cs
mov root_dev,ax !将获取的驱动设备号存入root_dev
接下来要确定使用哪个根文件系统设备。开始判断,如果已经指定了设备(!=0),那么就使用给定的设备;否则就使用前面获取的每磁道扇区数来确定到底是使用/dev/PS0 (2,28)还是/dev/at0 (2,8)。但是不清楚“如果sectors=15说明是1.2MB的驱动器;如果sectors=18说明是1.44M软驱”这句话。
7)跳转到setup程序开始处(即0x90200)执行setup程序
jmpi 0,SETUPSEG !SETUPSEG=0x9020
3、bootsect大概执行过程如上面所写,因为都是汇编语言,所以读起来有点困难,有些定义我也不太清楚,但是程序模块性好,每一段都实现了每一步骤的功能,整体流程还是比较清晰的。前面已经对其执行过程做了总结,所以这里不再赘述。