0、操作系统启动过程
第一步:读取BIOS
按下电源按钮后,计算机首先读取一块ROM芯片,这块芯片里的程序是"基本输入输出系統"(Basic Input/Output System),即BIOS.
第二步:硬件自检
BIOS会检查计算机硬件是否满足运行条件,如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。
第三步:启动顺序
硬件检查完成后,BIOS会将控制权交给下一阶段的启动程序,注意,“下一阶段的启动程序”可能存放在硬盘中,也可能存放在CD/DVD中,或者软盘中等等,可以设置BIOS选择从哪个设备启动。
第四步:主引导记录
BIOS找到了“下一阶段的启动程序”所在设备,会读取该设备的第一个扇区,即读取最前面的512字节,称为主引导记录。主引导记录会告诉计算机下一步到哪里去找操作系统。
第五步:bootloader
计算机读取"主引导记录"前面446字节的机器码之后,运行事先安装的“启动管理器”bootloader,由用户选择启动哪个操作系统。如果你安装了多个操作系统,那么就要从这步做出选择了。
第六步:加载内核
好了,选择操作系统(内核)后,会加载内核,下面就交给内核去处理了。
我们制作的操作系统将从第三步之后开始,通过vitrualbox 加载软盘img镜像的方式启动
BIOS读img文件的前512字节,主引导记录,主引导记录的前446字节(boot.bin的前446字节,也是boot.img的前446字节)为bootloader,确定启动哪个操作系统
1、制作boot.bin (需要下载安装 nasm https://www.nasm.us/)
编辑文件boot.asm
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
BootMessage: db "Hello, One OS!" ; 想要开机后在屏幕上显示的字符串
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
nasm boot.asm -o boot.bin
2、制作img镜像
制作img镜像方法一:Linux下的dd命令(亲测可用)
1. 制作软盘镜像文件diska.img
命令: dd if=/dev/zero of=diska.img bs=512 count=2880
2. 复制boot.bin到boot.img中
命令: dd if=boot.bin of=boot.img bs=512 count=1
3. 复制diska.img中从第512字节往后的内容添加到boot.img中
命令: dd if=diska.img of=boot.img skip=1 seek=1 bs=512 count=2879
尝试过,如果把这里的第2,3步换成用FloppyWriter在windows上写boot.bin到diska.img镜像中,会出现virtualbox能识别diska.img镜像,但运行过程报“FATAL: No bootable medium found! System halted.”的错误,也就是说boot.bin其实没有生效。
制作img镜像方法二:使用bximage工作和dd命令(亲测可用)
使用linux下bximage命令,以ubuntu为例
sudo apt-get install bximage
bximage
fd
[Enter]
[Enter]
默认生成a.img的软盘镜像文件
然后把boot.bin写入a.img文件前512字节内
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
如图:
这里也尝试过,把方法一中第一步生成的img文件,代替bximage工具生成的img文件,然后继续使用方法二中的dd命令,生成的a.img,在vitrualbox上无法启动,此处不知道原因,希望有高手解答。
3、使用vitrualbox启动boot.img
然后,启动运行就可以(下面这张是我的图,上面都是网图)