说明
本文为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 段,分别写入端口 0x1f3、0x1f4、0x1f5 和 0x1f6 号端口。
;其中,0x1f3 号端口存放的是 0~7 位
;0x1f4 号端口存放的是 8~15 位
;0x1f5 号端口存放的是 16~23 位;
;最后 4 位在 0x1f6 号端口
mov dx,0x1f3
out dx,al ;LBA 地址 7~0
mov cl,8
shr eax,cl
mov dx,0x1f4
out dx,al;LBA 地址 15~8
shr eax,cl
mov dx,0x1f5
out dx,al;LBA 地址 23~16
shr eax,cl
and al,0x0f
or al,0xe0;设置LBA模式,即设置7-4位1110,
mov 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;判断第4位
jnz .not_ready
;读数据
mov ax,di
mov dx,256
mul dx;扇区数(ax)*256,结果放在ax中
mov 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