linux 0.11 源码学习(三)

bootsect.s

bootsect完成的是整个内核的引导工作,简单的说就是将内核镜像中的bootsect、setup、system三部分从引导盘拷贝到内存的指定位置(当然对bootsect自己其实是已经被BIOS自动拷贝到内存0x7C00处,所以应该只能算是位置的搬迁)。bootsect依次做了如下工作:

  • 启动后首先将bootsect自身的512字节目标程序拷贝至0x9000;
entry _start
_start:
    mov    ax,#BOOTSEG
    mov    ds,ax
    mov    ax,#INITSEG
    mov    es,ax
    mov    cx,#256 //256个字 = 512字节
    sub    si,si
    sub    di,di
    rep
    movw
    jmpi    go,INITSEG
  • 将setup目标文件(4个扇区),拷贝到0x9200处;此时setup还在引导盘(软盘上),因此考虑要利用BIOS终端int 0x13
load_setup:
    mov    dx,#0x0000        ! drive 0, head 0
    mov    cx,#0x0002        ! sector 2, track 0
    mov    bx,#0x0200        ! address = 512, in INITSEG
    mov    ax,#0x0200+SETUPLEN    ! service 2, nr of sectors
    int    0x13            ! read it
    jnc    ok_load_setup        ! ok - continue
  • 将system目标文件拷贝到0x1000处,与setup类似,不做赘述;在linux 0.11版本中system大小由SYS_SIZE定义为0x3000。
  • 检查根文件设备号,若未指定则根据BIOS获取的扇区来决定采用1.2MB A驱动器还是1.44MB A驱动器。
    seg cs
    mov    ax,root_dev
    cmp    ax,#0
    jne    root_defined
    seg cs
    mov    bx,sectors
    mov    ax,#0x0208        ! /dev/ps0 - 1.2Mb //参考Linux的软盘逻辑设备号
    cmp    bx,#15
    je    root_defined
    mov    ax,#0x021c        ! /dev/PS0 - 1.44Mb
    cmp    bx,#18
    je    root_defined
  • 最后程序跳转到setup处执行:
jmpi    0,SETUPSEG // SETUPSEG = 0x9020

转载于:https://www.cnblogs.com/Fredric-2013/archive/2013/05/02/3055406.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值