学习linux0.11内核代码——引导启动程序bootsect.s(4)

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驱动器,其设备号是0x021c2*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大概执行过程如上面所写,因为都是汇编语言,所以读起来有点困难,有些定义我也不太清楚,但是程序模块性好,每一段都实现了每一步骤的功能,整体流程还是比较清晰的。前面已经对其执行过程做了总结,所以这里不再赘述。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/cui841923894/article/details/82191903