自己写操作系统 1

0、操作系统启动过程  https://blog.csdn.net/judyge/article/details/52278384

  第一步:读取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镜像 https://blog.csdn.net/sunjing_/article/details/78781411

制作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  http://www.cnblogs.com/777777-716/p/5003964.html

 

然后,启动运行就可以(下面这张是我的图,上面都是网图)

 

附:

https://www.csdn.net/gather_26/MtTacg0sODU2My1ibG9n.html

https://github.com/lucasysfeng/lucasOS.git

原文地址:https://www.cnblogs.com/lr-ting/p/10542686.html