猫史档案馆


自制操作系统教程01:最小操作系统

用户:小萝卜cXsQ小萝卜cXsQ查看:14 回复:8 评论:14 创建时间:2022-12-24T14:43:44


有的人看到标题会觉得:哇,自制操作系统,一看就好难啊

而你,则点了进来

这说明

你与别人不一样

本期教程将会带你制作一个最小的,能跑的操作系统

 

首先,操作系统是什么,怎么才能写一个操作系统?

操作系统,就是你装在硬盘上的那个占用几十GB的软件

没错,操作系统也是软件,但它和普通的软件不同

你想,平时你装在电脑上的软件,需要你动动手指,双击才能打开,而操作系统,只要打开电脑就会启动

卸载其他软件后电脑能正常启动

那卸载了操作系统呢?

这就说明

操作系统与其他软件的关系是这样的

它提供了软件与用户、硬件交互的接口

没了它

电脑将寸步难行

至于写一个操作系统

我们得先了解操作系统是怎么启动的

当你按下开关时

BIOS将被从ROM,也就是只读储存器中读出来

它将进行硬件初始化

接着 ,它把硬盘或光盘,软盘,这些储存设备的第一个扇区读到内存的0x7c00,然后跳转

今天,我们就来写这一个扇区的代码

 

首先,我们要知道,BIOS跳转到0x7c00的条件是什么

它会检查这个扇区,也就是引导扇区的最后两个字节

如果是0x55aa,则跳转,否则报错

不要问我为什么是0x55aa,这是当年IBM定下的规矩

它,便是魔数

而一个扇区是512字节,所以可留给我们的空间是510字节

这确实很小,但是对于汇编来说,足矣

所以,接下来,我们将用汇编写一个hello world

先看效果

center_image

看到左上角的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

弹出一个窗口....

center_image

完结撒花!


回复

上一页1 页 / 共 1下一页
小萝卜cXsQ小萝卜cXsQ

喵是 s m (怎么连. a s m都屏蔽啊)

点赞0


评论


MYY1MYY1

一看就是那些“学不会的东西”

点赞0


评论


一个STUB用户_6923702一个STUB用户_6923702

jmp $来一波(?

点赞0


评论


小萝卜cXsQ小萝卜cXsQ

顶顶顶顶顶

点赞0


评论


小萝卜cXsQ小萝卜cXsQ

问一下,有谁做了效果是对的吗

点赞1


评论


小萝卜cXsQ小萝卜cXsQ

顶顶顶顶

点赞0


评论


七叶寂照秘密主promax七叶寂照秘密主promax

建议做一些c++和汇报底层交互代码

按你这想法Windows全用汇报得了

BIOS引导还得用二进制

点赞0


评论


明_明_

你们这个系统现在发展的怎么样了?

点赞0


评论