linux-0.11分析:boot文件 bootsect.s 第一篇随笔

boot文件 bootsect.s 第一篇随笔

参考 [github这个博主的][ https://github.com/sunym1993/flash-linux0.11-talk ]

bootsect.s

开机后会主动把由硬件设置好的主动把第一磁盘扇区212字节的内容读取到内存中

1、boot文件

bootsect.s

  1. 第一段指令代码,只是把开机从磁盘读取的这段bootsect.s代码复制到了另一片区域,还设置了栈顶

    mov ax,#BOOTSEG ;BOOTSEG = 0x07c0
    mov ds,ax
    mov ax,#INITSEG ;INITSEG = 0x9000
    mov es,ax
    mov cx,#256
    sub si,si
    sub di,di
    rep
    movw ;rep movw字 就是 es:si = ds:di 然后si+1 di+1;这样循环执行256(cx)次,每次移动一个字
    jmpi go,INITSEG ;INITSEG = 0x9000
    go:
    mov ax,cs
    mov ds,ax
    mov es,ax
    mov ss,ax
    mov sp,#0xFF00

  2. 继续从磁盘加载setup.s这段代码的内容到内存中

    load_setup:
    mov dx,#0x0000 ; 驱动器0,磁头0
    mov cx,#0x0002 ; 从扇区2开始读,轨道0
    mov bx,#0x0200 ; 地址=512,在INITSEG中
    mov ax,#0x0200+SETUPLEN ; 服务2,需要读的扇区数量 SETUPLEN = 4
    int 0x13 ; 阅读它
  3. 第三步就是把系统的内存读取到内存中,顺便在显屏上打印一下东西

    ok_load_setup:
    ; 获取磁盘驱动器参数,特别是扇区/磁道的数量
    ......
    ; 打印msg1处的内容
    mov ah,#0x03 ; 读取光标位置
    xor bh,bh
    int 0x10
    mov cx,#24
    mov bx,#0x0007 ; 第0页,属性7(正常)
    mov bp,#msg1
    mov ax,#0x1301 ; 写入字符串,移动光标
    int 0x10
    ; 好的,我们现在已经写了消息
    ; 我们希望加载系统(0x10000)
    mov ax,#SYSSEG ; SYSSEG = 0x1000
    mov es,ax ; segment of 0x010000
    call read_it
    call kill_motor
    .......

  4. bootsect.s主要做了哪些事情了?需要和Makefile和build.c配合完成

posted @   水三丫  阅读(193)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示