用户:
小萝卜cXsQ查看:14 回复:8 评论:14 创建时间:2022-12-24T14:43:44
有的人看到标题会觉得:哇,自制操作系统,一看就好难啊
而你,则点了进来
这说明
你与别人不一样
本期教程将会带你制作一个最小的,能跑的操作系统
首先,操作系统是什么,怎么才能写一个操作系统?
操作系统,就是你装在硬盘上的那个占用几十GB的软件
没错,操作系统也是软件,但它和普通的软件不同
你想,平时你装在电脑上的软件,需要你动动手指,双击才能打开,而操作系统,只要打开电脑就会启动
卸载其他软件后电脑能正常启动
那卸载了操作系统呢?
这就说明
操作系统与其他软件的关系是这样的
它提供了软件与用户、硬件交互的接口
没了它
电脑将寸步难行
至于写一个操作系统
我们得先了解操作系统是怎么启动的
当你按下开关时
BIOS将被从ROM,也就是只读储存器中读出来
它将进行硬件初始化
接着 ,它把硬盘或光盘,软盘,这些储存设备的第一个扇区读到内存的0x7c00,然后跳转
今天,我们就来写这一个扇区的代码
首先,我们要知道,BIOS跳转到0x7c00的条件是什么
它会检查这个扇区,也就是引导扇区的最后两个字节
如果是0x55aa,则跳转,否则报错
不要问我为什么是0x55aa,这是当年IBM定下的规矩
它,便是魔数
而一个扇区是512字节,所以可留给我们的空间是510字节
这确实很小,但是对于汇编来说,足矣
所以,接下来,我们将用汇编写一个hello world
先看效果

看到左上角的hello了吗?
首先,下载工具
打喵zzjcarrot/os-tutorial/tree/master/
下载zip
以后源码与工具之类的会在里面更新
解压zip
点开day1
可以看到hello.a喵
org 0x7c00
mov ax,0xb800
mov gs,ax
mov byte[gs:0],'H'
mov byte[gs:1],0x0f
mov byte[gs:2],'E'
mov byte[gs:3],0x0f
mov byte[gs:4],'L'
mov byte[gs:5],0x0f
mov byte[gs:6],'L'
mov byte[gs:7],0x0f
mov byte[gs:8],'O'
mov byte[gs:9],0x0f
fin:
hlt
jmp fin
times 510-($-$$) db 0
db 0x55,0xaa
org 0x7c00的意思是
告诉编译器
它将会被装在到0x7c00
让编译器把里面的地址都加上0x7c00
mov ax,0xb800
0xb800是视频缓冲区的地址,通过ax间接赋值给gs
因为gs是不能被直接赋值的
下面就是向缓冲区写东西了
[gs:0]、[gs:1]分别表示gs+0、gs+1地址的值
视频缓冲区用两个字节表示一个字符
第一字节表示这个字符
第二字节表示字符的颜色
0x0f代表黑底白字
最底下的times 510-($-$$) db 0
表示把剩下的空间填0,填足510字节
因为最后两个字节要留给0x55aa
最后一句就是填充0x55aa的
接下来到了实操环节
首先编译hello.a喵
双击console.bat
分别输入以下命令
tool/na喵.exe hello.a喵 -o hello.bin
bochs/bochs.exe -q -f debug.bxrc
弹出一个窗口....

完结撒花!