文章目录

  • 前言
  • 操作系统怎么做?
  • 搭建环境
  • 动手
  • 简单回顾


前言

今年博主也开始学操作系统了,然鹅学校老师讲得偏理论和老旧,云里雾里的学习状态加上对操作系统的浓厚兴趣促使楼主决定从0开始做一个小操作系统,现在刚跳坑,希望把自己的过程记录下来,以后也有装逼的用武之地。、

  • 本文算是个小教程,但很多东西都是博主参考其他大神的文章和书籍,在这里会详细列出他们的来源。

操作系统怎么做?

  1. 首先先阅读闪客大神的文章:

计算机开机过程,讲明白了计算机开机时究竟做了什么

  1. 我们知道了:按下计算机开关后,PC寄存器就被强制初始化为0xFFFF0,这就是BIOS程序的入口地址
  2. BIOS开启硬件自检后,就会去加载启动区来启动计算机,**BIOS会按照顺序,读取启动盘第一个扇区共512字节的内容,**如果这个扇区的最后两个字节内容是0x55,0xAA,那么就识别成启动区。 (这5122个字节也叫主引导记录Master Boot Record ,MBR)
  3. 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 根据下图输入或者回车

bios编辑写代码的软件 bios编程入门_自制操作系统

完成了这一步就会在当前目录下生成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

到这里就开机成功了!

bios编辑写代码的软件 bios编程入门_自制操作系统_02

简单回顾

其实我们究竟做了什么? 博主做完之后,觉得好简单啊(其实已经花了一个晚上+一个下午的时间才搞清楚)

直白的说,就是拿到一个计算机(虚拟机) 和 一张空白的软盘 ,并在将自己的代码写入计算机内:
0.编写启动区代码
1.制作软盘
2.将启动区代码写入软盘的第一扇区内
3.获得一部计算机(bochs)
4.开机!

参考:
计算机自制操作系统(一):最小操作系统

10分钟完成的操作系统(Bochs的使用–windows系统下)

参考书籍:
《Orange’S:一个操作系统的实现》
《30天自制操作系统》