《30天自制操作系统》学习笔记_day04

版权所有!!! 未经作者允许不得转载!!!
写上这一句的目的有一次发现一个网站原封不动copy了我的文章,太可气了。

1.C语言实现内存写入

第三天中实现了启动haribote.sys程序以后,设置画面为全黑,第四天首先希望通过向VRAM内存中写入的方式控制画面显示的内容。因为haribote中有有一部分我们已经开始用C语言写,我们希望用C语言可以实现像汇编一样像内存写入(这里先不考虑指针)
在harib01a中的nasfunc.nas中增加了
在这里插入图片描述
这是一个C语言函数的汇编原型,write_mem8(0x1234,0x56),动作上相当于MOVE BYTE [0x1234],0x56 (具体原因作者书中有解释)。

再在C语言文件中调用这个函数:
在这里插入图片描述
向0xa0000~0xaffff内存中全部写入15(白色)
我们试着运行一下:
在这里插入图片描述
可以看到我们虚拟机运行的窗口已经全部变成了白色。第一步完成。

2.在窗口上显示多种颜色

我们试着向VRAM中写入不同的内容,使其显示多种颜色。
改动bookpack.c中调用函数write_mem8的参数内容,在harib01b中:
在这里插入图片描述
不再是单纯的写入15 而是通过地址的与运算得到一个和地址相关的值,具体值解释作者在书中有讲。
我们试着运行一下:
在这里插入图片描述
还是蛮花哨的,第二步就已经完成。

3.指针的应用

在第一点中我们是用 汇编语言写了一个C语言函数,用来将数据写入指定的内存位置当中。如果考虑C语言指针的使用的画,完全不必用汇编语言写一个函数。
在harib01c中
在这里插入图片描述
增加了 char型指针变量p 用来存放内存地址。
这样运行会出现warning 警告普通数值不能直接生成指针
在这里插入图片描述
作者为我们提供了解决方法:
修改为 p =(char *) i提前将普通数值转化为指针型数值,就不会报出warning。
到此为止,我们完成了直接通过C语言向内存,nasfunc.nas中的write_mom8也就可以删去了。
作者在这里还提供其他两种解决办法,大体上是利用了C语言数组的思想。
分别在harib01d和harib01e中可以看到:
在这里插入图片描述

在这里插入图片描述

4. 设置调色板

这一部分书上的内容不太容易看懂,但总结一下的话中心思想是在于设置我们320×200 8位模式的颜色。简单来说,也就是在8位模式下255种颜色分别是什么
作者在书里为16种颜色定义了0~15的号码(重要,后面传参的依据
在hariib01f中打开bootpack.c
在这里插入图片描述
在主函数HariMain( )前增加了很多函数声明,这些有的是在bootpack.c中定义,也有的是在nasfunc.nas中定义。
在这里插入图片描述
在主函数HariMain( )调用了init_palette( )函数,这个函数的作用就是完成我们自定义的颜色对应。
在这里插入图片描述
我们查看init_palette( )函数代码,里面设置了一个存放R G B颜色数据的数组,还有就是调用了set_palette( )函数,并将我们的数组传了进去,那么这个函数的0和15代表什么意识呢?其实就是我们16种颜色的号码。

我们查看set_palette( )函数源代码
在这里插入图片描述
比较重要的就是循环将R G B写入0x03c9的过程。这个函数里面的逻辑是规定的,作者里面也有解释。

还有的就是nasfunc.nas种的内容了,是几个函数的原型,包括屏蔽中断和设置中断等…都是在set_palette( )要用到,这些函数的使用的原因也是按照cpu规定来的。
nasfunc.nas部分内容:
在这里插入图片描述
到此为止,我们完成了对颜色的重新定义,我们再次make run一下。
在这里插入图片描述
会发现颜色和以前不一样了。

5.尝试绘制矩形

绘制矩形的原理就是在矩形的内存地址内写入相同的颜色数据,我们使用的是320×200=64000像素。
左下角对应的是(0,0)右下角对应的是(319,319)

作者定义了一个boxfill8函数用来画矩形,在harib01g中打开bootpack.c
在这里插入图片描述
这是我们的16中颜色。
在这里插入图片描述
boxfill8函数其实就是通过for循环往一片矩形内存区域内写入数据 。
在这里插入图片描述
主函数里画了3个矩形。我们make run一下。
在这里插入图片描述

绘制一个简单的窗口

简单更改一下bootpack.c绘制的内容,我们可以绘制一个更像操作系统的界面。
在harib01h中我们可以看到:
在这里插入图片描述
再次make run一下
在这里插入图片描述
有内味了。

今天的内容就是这样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值