30天制作操作系统第3天

30天制作操作系统第三天

这是一个菜鸡为了学习操作系统来练习写的操作系统,参照于书籍《30天自制操作系统》。
相关程序已经放到GitHub中,如果我的能力到位我可能会在这个操作系统的基础上进行添加及优化,作者已经把所有东西都做到极致了,我能做的很少,我只能把自己分析学习的文章总结出来。因为自己能力可能不到位,可能会有些错误希望大家理解,发到这里更多的原因的起到记录作用,如果以后的我回看我写的文章有错误,我会进行修改,同时也希望大家互相学习。
相关项目及源码已经放到GitHub中:https://github.com/Most3R-03/Simple-Operating-System

色号设定。
我们所选择的8位色彩模式,是指的只能存储00000000 11111111这种8位二进制的代码,也就是十进制的0~255,但是这远远不能满足我们的。
作者列出了我们需要用到的16种颜色,我们需要利用汇编语言将这16中颜色添加到系统调色板中,但是C语言并没有这种命令,所以我们需要调用汇编语言来做。
对于调色板的读写,我们需要对系统中断进行调用:
首先屏蔽中断(比如CLI)
将想要设定的调色板号写入0x03c8,紧接着按R,G,B的顺序写入0x03c9.如果还想继续设置下一个调色板,则省略调色板号码,再按照RGB的顺序写入0x03c9就可以。
如果想要读出当前调色板的状态,首先将调色板的号码写入0x03c7,再从0x03c9读取三次。读出的顺序是R,G,B。如果继续读下一个调色板,同样也是省略调色板号按R,G,B的顺序读出。
我们可以调用CLI与STI使CPU禁止中断。
如果开始执行了CLI,那么最后要执行STI。

在这里插入图片描述
在这里插入图片描述
我们通过汇编语言生成了多个函数供C语言调用,
在这里插入图片描述
函数大致功能,主要说的是读写EFLAGS寄存器功能功能函数:
FLAGS是存储进位标志和中断标志等标志的寄存器。
在这里插入图片描述
在这里插入图片描述
POP给EAX作为返回值。
它并不能由MOV命令直接赋值给EAX或者之类的。只能由PUSHFD-POPFD才能调用。
在这里插入图片描述
Set_palete函数要做的是首先执行CLI再处理结束之后一定要恢复中断,因此需要记住在执行CLI之前的中断标志。所以我们用io_load_eflag来获取EFLAGS位的值并储存,再利用io_store_eflags对标志位进行赋值(汇编语言中的赋值语句为POPFD)

接下来make run 之后 :
在这里插入图片描述
颜色已经变了,但是我们并没有改变颜色的值,因为颜色的值在调色板已经变了。

接下来我们试着画一个矩形:
在这里插入图片描述
在这里插入图片描述
函数原型与调用过程在这里,直接用的调色板,没有像作者那样调用常量。
在这里插入图片描述
接下来按作者那样绘制一个任务栏:
在这里插入图片描述
现在我们绘制出了一个任务条,源代码只是单纯的指定坐标并且绘制。

接收启动信息

在这之前,我们在系统启动之前用汇编语言取了一些启动信息保存到内存中(asmhead.nas),现在我们试着用指针来获得这些值。
在这里插入图片描述
用结构体同样可以,类似与数组:
在这里插入图片描述
在这里插入图片描述
声明一个结构体,大小及顺序需要同之前保存的一样:
在这里插入图片描述
此处调用。
在这里插入图片描述
这里作者教了我们一种非常方便的表示方法 ->
binfo->vram 可以直接表示为binfo.vram 较为方便哈

显示字符
在这里插入图片描述
字符可以用长方形点阵来表示

这里用16进制表示(从上往下开始显示)
0x00
0x18
0x18
0x18
0x18

在这里插入图片描述
因为c语言没法表示2进制,所以我们只能用16进制表示。也就是16进制往内存里 存取。我们应该从上往下排列
在这里插入图片描述
这里 d&0x80 等就是用于判断哪一个像素点需要填色 0x80为10000000,通过异或可以判断出二进制(00000000,100000000,11110000)这种哪一位是1。哪一位需要上色。

此代码是按照排列将像素排到现存上!
在这里插入图片描述
现在我们已经显示出字母了。
但是一个一个的画并不是好主意,所以我们选择沿用OSASK的字体,我们导入hankaku.txt这个文件。这既不是c也不是汇编,我们需要使用作者制作的编译器来将字体文件输出成目标文件。
我们需要将hankaku.txt编译成hankaku.bin文件,并由bin2obj.exe转换成目标程序,

好像把下面的代码转换成汇编语言:
_hankanku:
DB 各种数据(共4096字节)
在c语言中调用的话,因为我们已经链接到一起了,所以只要使用:
Extern char hankaku[4096];
就引入到了c语言中了,extern告诉程序引入外部程序。
现在我们已经将字体编译出来并且放到内存中了。
OSASK的字体数据,按照ASCII字符编码,含有256个字符。
A的字符编码为0x41,所以A的字体数据放在“hankaku+0x41*16”的位置,同时c语言中A可以用“A”表示恰好可以表示0x41,所以我们可以写成“hankaku+”A”*16”。
在这里插入图片描述
关键代码,写完一个字需要8位8位的向右偏移
在这里插入图片描述
字符显示成功

我们来写一个函数把这些功能全部集合到一起。
在这里插入图片描述
这个函数只要读入起始位置便自动输出文字。因为字符串是以0x00结尾的,所以用0x00作为判断的依据。
在这里插入图片描述
我们再次运行

接下来我们来显示变量的值,用于调试错误的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值