从零开发操作系统:MBR加载磁盘程序,突破512字节限制

说明

本文为b站从零开发操作系统的实验

mbr.asm

;能够将第二个扇区里面的内容加载进内存
;mbr.asm loader.asm
;0       1 
;loader放入0x900

LOADER_BASE_ADDR equ 0x900
LOADER_START_SECTOR equ 0x2;表示LBA方式,
SECTION MBR vstart=0x7c00
    mov ax,cs
    mov ds,ax
    mov es,ax
    mov ss,ax
    mov fs,ax
    mov sp,0x7c00
    mov ax,0xb800
    mov gs,ax
    ;利用0x06功能,调用十号中断
    ;ah=0x06
    ;al=0表示全部清除
    ;bh=上卷的属性
    ;(cl,ch) 左上角
    ;(dl,dh) 右下角
    mov ax,0x0600
    mov bx,0x0700
    mov cx,0
    mov dx,0x184f;(80,25)
    int 0x10
    ;输出当前在MBR
    mov byte [gs:0x00],'1'
    mov byte [gs:0x01],0xa4
    mov byte [gs:0x02],' '
    mov byte [gs:0x03],0xa4
    mov byte [gs:0x04],'M'
    mov byte [gs:0x05],0xa4
    mov byte [gs:0x06],'B'
    mov byte [gs:0x07],0xa4
    mov byte [gs:0x08],'R'
    mov byte [gs:0x09],0xa4

    mov ax,LOADER_START_SECTOR;
    mov bx,LOADER_BASE_ADDR
    mov cx,1;等待读入的扇区
    call rd_disk;
    jmp LOADER_BASE_ADDR;跳转到实际的物理内存


rd_disk:
    ;eax LBA的扇区号
    ;bx 数据写入的内存地址
    ;cx 读入的扇区数
    mov esi,eax;备份
    mov di,cx;备份
    ;读写硬盘
    ;1.设置要读取的扇区数量。
    ;这个数值要写入 0x1f2 端口。
    ;这是个 8 位端口,因此每次只能读写 255 个扇区:
    mov dx,0x1f2
    mov al,cl
    out dx,al
    mov eax,esi
    ;2.设置起始 LBA 扇区号。
    ;扇区的读写是连续的,因此只需要给出第一个扇区的编号就可以了。
    ;28 位的扇区号太长,需要将其分成 4 段,分别写入端口 0x1f30x1f40x1f50x1f6 号端口。
    ;其中,0x1f3 号端口存放的是 07;0x1f4 号端口存放的是 815;0x1f5 号端口存放的是 1623;
    ;最后 4 位在 0x1f6 号端口
    mov dx,0x1f3
    out dx,al ;LBA 地址 70
    
    mov cl,8

    shr eax,cl
    mov dx,0x1f4
    out dx,al;LBA 地址 158
    
    shr eax,cl
    mov dx,0x1f5
    out dx,al;LBA 地址 2316
    
    shr eax,cl
    and al,0x0f
    or  al,0xe0;设置LBA模式,即设置7-41110mov dx,0x1f6
    out dx,al
    
    mov dx,0x1f7
    mov al,0x20
    out dx,al

    ;检测硬盘状态,等待可以传输
.not_ready:
    in al,dx;端口0x1f7 既是命令端口,又是状态端口
    and al,0x88;取第4位,第7位,第4位为1,表示可以传输,第7位为1表示繁忙
    cmp al,0x08;判断第4jnz .not_ready


    ;读数据
    mov ax,di
    mov dx,256
    mul dx;扇区数(ax)*256,结果放在axmov cx,ax
    mov dx,0x1f0

   
.go_on:
    in ax,dx
    mov [bx],ax
    add bx,2
    loop .go_on ;ax 自动减1
    ret
times 510 - ($-$$) db 0
dw 0xaa55

loader.asm

LOADER_BASE_ADDR equ 0x900
SECTION LOADER vstart=LOADER_BASE_ADDR
    mov ax,0xb800
    mov es,ax

    mov byte [es:0x00],'O'
    mov byte [es:0x01],0x07
    mov byte [es:0x02],'K'
    mov byte [es:0x03],0x06
    jmp $

创建虚拟磁盘

在widows系统上用diskpart命令,应该有更好的办法

create vdisk file=d:\os.vhd maximum=1000000 type=fixed

https://baijiahao.baidu.com/s?id=1697453311426810138&wfr=spider&for=pc

编译写入虚拟磁盘

nasm -f bin -o mbr.bin mbr.asm
nasm -f bin -o loader.bin loader.asm
dd if=mbr.bin of=os.vhd seek=0 bs=512 count=1 conv=notrunc
dd if=loader.bin of=os.vhd seek=2 bs=512 count=1 conv=notrunc #注意写入seek=2

virtualbox使用已有磁盘新建系统

在这里插入图片描述

结果

在这里插入图片描述

这里是引用
https://www.bilibili.com/video/BV18K411w7Z2?p=13&spm_id_from=pageDriver
https://blog.csdn.net/fjlq1994/article/details/49472827

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值