文章目录
- 前言
- 操作系统怎么做?
- 搭建环境
- 动手
- 简单回顾
前言
今年博主也开始学操作系统了,然鹅学校老师讲得偏理论和老旧,云里雾里的学习状态加上对操作系统的浓厚兴趣促使楼主决定从0开始做一个小操作系统,现在刚跳坑,希望把自己的过程记录下来,以后也有装逼的用武之地。、
- 本文算是个小教程,但很多东西都是博主参考其他大神的文章和书籍,在这里会详细列出他们的来源。
操作系统怎么做?
- 首先先阅读闪客大神的文章:
- 我们知道了:按下计算机开关后,PC寄存器就被强制初始化为0xFFFF0,这就是BIOS程序的入口地址。
- BIOS开启硬件自检后,就会去加载启动区来启动计算机,**BIOS会按照顺序,读取启动盘第一个扇区共512字节的内容,**如果这个扇区的最后两个字节内容是0x55,0xAA,那么就识别成启动区。 (这5122个字节也叫主引导记录Master Boot Record ,MBR)
- BIOS把启动区的内容加载到0x7C00的地址,并从这个地址开始执行 (BOIS工作结束)
搭建环境
- Bochs
Bochs是开源的虚拟机,用软件虚拟了许多硬件,支持调试,看寄存器的状态,对比下来比vmware和virtualbox都好一些 - Nasm 汇编编译器
- Cygwin 运行linux指令,(如果是linux环境应该不需要| 博主的猜测)
动手
零. 编写汇编代码并编译
这就是启动区的代码
文件名:boot.asm
org 07c00h ; 指定程序的起始地址
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 跳转到DispStr
jmp $ ; 死循环
DispStr:
mov ax, Str
mov bp, ax
mov cx, 13
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
Str: db "Hello, world!"
times 510-($-$$) db 0
dw 0xaa55
在这个文件的目录下打开cmd 用nasm 编译一下:nasm boot.asm -o boot.bin
(如果上面文件名不同,这里也要改哦
一. 用bximage创建一个软盘映像
bochs中有一个工具叫做bximage,可以生成虚拟软盘,虚拟硬盘,也称为磁盘映像
进入bochs安装目录启动cmd或者powershell输入
.\bximage.exe
根据下图输入或者回车
完成了这一步就会在当前目录下生成a.img文件
二. 使用dd命令(linux下) ,将引导扇区写进磁盘映像文件的第一扇区
$ dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
为windows的用户补充说明:
Linux 的dd命令可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。
参数说明: if=输入文件名,即源文件
of=输出文件名,即指定目的文件
ibs=bytes : 一次读入的bytes字节
count =bolock 仅拷贝blocks 个块, 块大小等于ibs指定的字节数
conv=<关键字> ,关键字有11种 ,其中notrunc 为不截短输出文件如果你和楼主一样,都是在window环境下,就需要一个软件–Cygwin 方法:
运行Cygwin.bat,进入boot.bin所在的目录再输入上面指令
三. 编写bochs的配置文件
在bochs的安装目录下有一个bochsrc-sample.txt的文档,是官方提供的配置文件模板,甚至有注释说明,可以读一读
# how much memory the emulated machine will have
megs:32
# 对应真实机器的BIOS和VGA BIOS
romimage:file=$BXSHARE/BIOS-bochs-latest
vgaromimage:file=$BXSHARE/VGABIOS-lgpl-latest
# 设置bochs使用的磁盘,软盘使用关键字floppya,硬盘使用disk
# 若有多个软盘,可写floppya,floppyb
floppya:1_44=a.img,status=inserted
#设置bochs使用的磁盘,软盘使用关键字floppya,硬盘使用disk
boot:floppy
log:bochsout.txt
mouse:enabled=0
keyboard: keymap=$BXSHARE/keymaps/x11-pc-de.map
四, 启动bochs
cmd输入
bochs -f bochsrc
到这里就开机成功了!
简单回顾
其实我们究竟做了什么? 博主做完之后,觉得好简单啊(其实已经花了一个晚上+一个下午的时间才搞清楚)
直白的说,就是拿到一个计算机(虚拟机) 和 一张空白的软盘 ,并在将自己的代码写入计算机内:
0.编写启动区代码
1.制作软盘
2.将启动区代码写入软盘的第一扇区内
3.获得一部计算机(bochs)
4.开机!
10分钟完成的操作系统(Bochs的使用–windows系统下)
参考书籍:
《Orange’S:一个操作系统的实现》
《30天自制操作系统》