系统启动过程
编写汇编码
; 文件名 boot.asm
org 7c00h ; BIOS读入MBR后,从0x7c00h处开始执行
; 下面部分和10h有关中断,10h中断用来显示字符
mov ax, cs
mov es, ax
mov ax, msg
mov bp, ax ; ES:BP表示显示字符串的地址
mov cx, msgLen ; CX存字符长度
mov ax, 1301h ; AH=13h表示向TTY显示字符,AL=01h表示显示方式(字符串是否包含显示属性,01h表示不包含)
mov bx, 000fh ; BH=00h表示页号,BL=0fh表示颜色
mov dl, 0 ; 列
int 10h
msg: db "hello world, welcome to OS!"
msgLen: equ $ - msg ; 字符串长度
times 510 - ($ - $$) db 0 ; 填充剩余部分
dw 0aa55h ; 魔数,必须有这两个字节BIOS才确认是MBR
编译
nasm boot.asm -o boot.bin
制作启动软盘
1、dd if=/dev/zero of=floppy.img bs=1474560 count=1 生成空白软盘镜像,(软盘大小必须为1.44M,因此bs=1474560 )
2、dd if=boot.bin of=myos.img bs=512 count=1 制作包含主引导记录boot.bin的启动镜像文件(引导程序占512byte)
3、dd if=floppy.img of=myos.img skip=1 seek=1 bs=512 count=2879 在 bin 生成的镜像文件后补上空白,成为合适大小的软盘镜像,一共2880个扇区,略过第一个
用软盘启动系统
1、将myos.img下载到windows
2、VMWare创建空的虚拟机
1、文件 - 创建新的虚拟机 - 典型
2、稍后安装操作系统
3、其他
4、一路next 完成
5、虚拟机设置,去掉CD/DVD选项中“启动时连接”
6、网络,选择“仅主机模式”,勾选“启动时连接”(好像无所谓)
7、添加软盘驱动器 使用软盘映像 找到myos.img
3、启动虚拟机
4、显示结果
为什么是0x7C00?
简单来说,IBM最初约定的是在07C00H,但后续为了兼容性,就都统一都放在这个地方了。
参考:https://www.glamenv-septzen.net/en/view/6