boot.asm
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage: db "Hello,OS World!"
times 510-($-$$) db 0
dw 0xaa55
当计算机电源被打开,运行存储在ROM中BIOS程序。他会检查位于磁盘的第一个扇区(0磁头0磁道1扇区),如果是以0xAA55结束,BIOS认为他是一个引导扇区,然后将这个扇区内容加载到内存0000:7C00的位置,然后跳转到0000:7c00将控制交给这段引导代码。因此程序开始ORG 7C00H
,设置程序被编译后的开始地址
$
表示当前行被汇编后的地址,$$
表示一个节的开始处被汇编后的地址。
times 510-($-$$) db 0
表示将0这个字节重复 510-(
−
-
−$)遍,加上最后的0xAA55正好有512字节一个扇区的大小
dw 0xaa55 设置有效引导扇区
jmp $ 循环执行程序,防止程序执行到后面非指令的数据上
需要的工具
nasm
dd.exe
虚拟机
1.编译汇编代码boot.asm生成boot.bin
nasm boot.asm -o boot.bin
2.创建软盘镜像disk.img
dd if=/dev/zero of=disk.img bs=512 count=2880
3.将boot.bin写入到disk.img
dd if=boot.bin of=disk.img bs=512 count=1 conv=notrunc
rawwrite dd for windows version 0.6beta3.
Written by John Newbigin <jn@it.swin.edu.au>
This program is covered by terms of the GPL Version 2.
notrunc
1+0 records in
1+0 records out
disk.img启动镜像已经制作好了,为了方便直接在虚拟机上测试,新建虚拟机
建立好虚拟机后设置,添加软盘驱动器
选择disk.img
运行。在没有操作系统的环境下跑出了helloworld
对于linux操作系统,磁盘的第一个扇区的MBR包含有基本的引导程序。计算机打开电源后,执行固化的BIOS程序,bios按照启动顺序检查可引导设备。硬盘上的当MBR被装载后,BIOS就会将控制权转交给MBR。MBR完成基本的初始化后并且将控制权交给硬盘主分区(活动分区)上的GRUB,GRUB再让用户选择启动的操作系统。之后将控制权交给操作系统,操作系统加载内核,层层引导实现启动
工具的下载
启动镜像
https://download.csdn.net/download/m0_60352504/87797045
nasm和dd
https://download.csdn.net/download/m0_60352504/87797032