30天自制操作系统
文章平均质量分 83
nepu_bin
前方的路没有答案,只有走着走着才有了答案
展开
-
30天自制操作系统:第十五天 多任务(1)
1 挑战任务切换(harib12a)多任务(multitask),顾名思义就是“多个任务”的意思。稍稍思考一下我们就会发现,多任务这个东西还真是奇妙,它究竟是怎样做到让多个程序同时运行的呢?如果我们的电脑里面装了好多个CPU的话,同时运行多个程序倒也顺理成章,但实际上就算我们只有一个CPU,照样可以实现多任务。其实说穿了,这些程序根本没有同时在运行,只不过看上去好像是在同时运行一样:程序A运行一会儿,接下来程序B运行一会儿,再接下来轮到程序C,然后再回到程序A… …如此反复,在OS上有个专业点的名词为:原创 2021-09-26 23:26:20 · 346 阅读 · 0 评论 -
30天自制操作系统:第十四天 高分辨率及键盘输入
1 继续测试性能(harib11a ~ harib11c)这一小节作者测试了昨天优化过的程序。2 提高分辨率(1)(harib11d)在 asmhead.nas 中改变分辨率。为什么使用 0x4101 ?make run 运行:3 提高分辨率(2)(harib11e)这一小节主要在判断真机显卡是否可以使用VBE。make run运行:4 键盘输入(1)(harib11f)这里是为了将键盘的输入显示到显示框内这里核心部分也就在于HariMain函数中,看原书对代码的解释原创 2021-09-25 16:42:43 · 237 阅读 · 0 评论 -
30天自制操作系统:第十三天 定时器(2)
1 简化字符串显示(harib10a)这一小节是做了一个函数将之前多次重复使用的代码放在了一起,对函数内部进行了简化。2 重新调整FIFO缓冲区(1)(harib10b)这一小节把定时器用的多个FIFO缓冲区都集中成1个了。3 测试性能(harib10c~harib10f)这里对程序进行了一定的测试,测试的方法为:先对HariMain略加修改,恢复变量count,然后完全不显示计数,全力执行"count++;"语句,当到了10秒后超时的时候,再显示这个count值。后续的程序按照作者原创 2021-09-24 16:18:56 · 180 阅读 · 0 评论 -
30天自制操作系统:第十二天 定时器(1)
1 使用定时器(harib09a)定时器(Timer)对于操作系统非常重要。它在原理上很简单,只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。辛亏有了定时器,CPU才不用辛苦的去计量时间。注:英文的Timer在汉语有“定时器” 或 “时钟” 等多种译法,这里将Timer称作“定时器”,Clock称作“时钟周期” 或 “周期”如果没有定时器,假如CPU看不到定时器而仍想计量时间的话,就只能牢记每一条指令的执行时间了。比如,往寄存器写入常数的MOV指令是1个时钟周期(Clock);加法计算的原创 2021-09-23 22:00:51 · 1062 阅读 · 1 评论 -
30天自制操作系统:第十一天 制作窗口
1 鼠标显示问题(harib08a)第一小节解决了鼠标的一点细节问题:可以向右或向下移动到画面之外隐藏起来。当前不能这么做的原因:代码很简单,当鼠标移出屏幕时会被修改成 binfo->scrnx - 16,也就是屏幕边缘。这里先做一个简单的修改:make run运行一下:↑出现图层问题2 实现画面外的支持(harib08b)怎样才能让图层位于画面以外时也不出问题呢?因为只有 sheet_refershsub函数在做把图层内容写入VRAM的工作,所以需要对该函数进行优化。对比图原创 2021-09-22 14:38:01 · 303 阅读 · 0 评论 -
30天自制操作系统:第十天 叠加处理
1 内存管理(续)(harib07a)***memman_alloc***和***memman_free*函数能够以1字节为单位进行内存管理,这种方式虽然不错,但是有一点不足:在反复进行内存分配和内存释放之后,内存中就会出现很多不连续的小段未使用空间,这样就会把man->frees(该属性指示了空闲空间块的总个数)消耗殆尽。因此,作者编写了一些总是以0x1000字节为单位进行内存分配和释放的函数,它们会把指定的内存大小按0x1000字节(4KB)为单位向上舍入,选择0x1000这个数值非常精妙,我原创 2021-09-21 15:55:00 · 240 阅读 · 0 评论 -
30天自制操作系统:第九天 内存管理
1 整理源文件(harib06a)这里仅仅是对文件进行了一些整理,查看下图即可。2 内存容量检查(1)(harib06b)内存管理在操作系统中是一大块,既是重点也是难点,所以作者也花了较大的篇幅进行介绍。要进行内存管理,首先要做的事情就是搞清楚内存究竟有多大,范围是到哪里。如果连这一点都搞不清楚的话,内存管理就无从谈起。在最初启动时,BIOS肯定要检查内存容量,所以我们只要问一问BIOS,就能知道内存容量有多大,但问题是,如果那样做的话,一方面asmhead.nas会变长,另一方面,BIOS版本原创 2021-09-20 15:13:47 · 670 阅读 · 0 评论 -
30天自制操作系统:第八天 鼠标控制与32位模式切换
1 鼠标解读(1)(harib05a)现在已经从鼠标取得数据了,现在的问题是要解读这些数据,观察鼠标的移动动作,让鼠标指针相应地移动起来。看一下对bootpack.c中HariMain函数的一些修改。程序要做的事情很简单,首先把最初读到的0xfa舍弃掉(改变mouse_phase变量进入下一个阶段),之后,每次从鼠标那里送过来的数据应该都是3个字节一组的,所以每当数据累积到3个字节,就把它显示到屏幕上。变量mouse_phase用来记住接收鼠标数据的工作进展到了什么阶段(phase),接收到的数据放原创 2021-09-19 15:47:13 · 220 阅读 · 0 评论 -
30天自制操作系统:第七天 FIFO与鼠标控制
1 获取按键编码(hiarib04a)小节的内容实现让程序按下一个键后不结束,而是把所按键的编码在画面上显示出来。代码 “io_out8(PIC0_OCW2, 0x61);” 用来通知PIC“已经知道发生了IRQ1中断哦”,如果是IRQ3,则写成0x63。也就是说,将“0x60 + IRQ号码”输出给OCW2就可以。执行这句话之后,PIC继续时刻监视IRQ1中断是否发生。反过来,如果忘记了执行这句话,PIC就不再监视IRQ1中断,不管下次键盘输入什么信息,系统都感知不到了。接下来需要注意,从编号为原创 2021-09-18 16:26:25 · 216 阅读 · 0 评论 -
30天自制操作系统:第六天 分割编译与中断处理
1 分割源文件(harib03a)有过编程经验的小伙伴知道:如果很多程序代码都放在一个程序中,对于它的阅读、管理都是较麻烦的,所以这里开始介绍将源文件 bootpack.c 文件分割成几部分。优点按照处理内容进行分类,将来修改时更容易找到地方。Makefile文件写得好,只需要编译修改过的文件,可以提高make的速度。单个源文件都不长,多个小文件比一个大文件好处理。缺点源文件数量增加分类不当修改时不容易找到地方分割后的源文件:对应源文件修改后还需要整理Makefile:2原创 2021-09-17 23:09:43 · 253 阅读 · 3 评论 -
30天自制操作系统:第五天 结构体、文字显示与 GDT/IDT初始化
今天的内容相比前几天多了很多,主要是一些东西用代码写出来更难理解,需要更多的时间去琢磨,因此对于一些较为基础的内容不会进行详细的描述。1.接收启动信息(harib02a)之前的程序大都是直接使用0xa0000、320、200等数值,而这些值应该从asmhead.nas程序先前保存下来的值中取,如果不这样做,当画面模式改变时,系统就不能正确运行。这里使用指针来取得这些值。binfo是bootinfo的缩写,scrn是screen(画面)的缩写。这里的0x0ff4之类的数据是从哪里来的呢,其实这些地原创 2021-09-16 23:36:39 · 440 阅读 · 0 评论 -
30天自制操作系统:第四天 C语言与画面显示的练习
1.用C语言实现内存写入(harib01a)章节开始展示了一个用于写入内存的汇编函数: _write_mem8对于注释: [ESP + 4]存放的是地址解释:函数调用的时候参数的压栈顺序是从右到左的,因此有如下结构:初始情况假设栈底位置为0x1008,(SS不重要,这里只是做出了标注,并没有给出数值),那么SP寄存器的值应该是栈的最高地址 + 1,0x1008 + 1 = 0x1009,如图栈压入一个参数,如果有汇编基础这块应该好理解,没有也没关系,这里给出压栈CPU执行的指令:原创 2021-09-15 20:01:10 · 1093 阅读 · 2 评论 -
30天自制操作系统:第三天 进入32位模式并导入C语言
今天的内容稍稍有点多,一起看看吧1.制作真正的IPL到昨天为止,讲到的启动区虽然也称为IPL(Initial Program Loader,启动程序装载器),但它实质上并没有装载任何程序。小节中作者给出了将之前的 hello-os 改名为 "纸娃娃操作系统" 的深意:用纸糊起来的,笔者将其理解为目前还有太多功能没有实现,只能是一个看起来像操作系统的东西。从简单的程序开始,磁盘最初的512字节是启动区,所以要装载下一个512字节的内容。看第一段程序 harib00a: JC指令jump if ca原创 2021-09-14 20:27:00 · 816 阅读 · 3 评论 -
30天自制操作系统:第二天 汇编语言学习与Makefile入门
1.介绍文本编辑器本小节内容只是编者介绍了一个免费的文本编辑器,因为是日语的缘故,译者向我们推荐了一个可编辑中文的文本编辑器: Notepad++,笔者也正用这个编辑器,放上下载链接:>>>> Download Notepad++ >>>>↑Notepad++使用界面2.继续开发节选了projects/02_day中的helloos3中的部分内容,原文档中注释用的是日文,所以这里截取了书中的代码片段:因为是从零开始做一个操作系统,作者对代原创 2021-09-13 13:35:57 · 597 阅读 · 0 评论 -
30天自制操作系统:第一天 从计算机结构到汇编程序入门
序终于开启了学习自制操作系统的道路,虽然对于笔者来说是一个无比巨大的挑战,但是为了能够打开操作系统这个黑盒子,做一个操作系统应该是最好的方式,讲道理做一个OS应该是很多程序员、工程师的梦想吧,毕竟OS是我们天天都在用的东西,自己能够完全从0开始做一个应该会有不一般地体验。本系列文章用于记录笔者在阅读书籍并着手开发过程中遇到的各种问题。1. 先动手操作刚开始就面临了不小地挑战,虽然是简简单单地按照书本上的图片输入相应的内容,不过还真是 Easier said than done,说起来简单做起来难,原创 2021-09-12 16:27:45 · 647 阅读 · 1 评论