![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
操作系统
文章平均质量分 81
操作系统知识点总结
水龙吟唱
这个作者很懒,什么都没留下…
展开
-
30天自制操作系统——第二十四天增加命令行窗口
蜂鸣发声器目前制作的操作系统还不能发声呢,由于调用声卡的过程比较复杂,这里我们就先实现蜂鸣器发声好了。蜂鸣器发出的声音,是那种哔哔哔哔的,听起来有些奇怪。这里设置声音的频率随着时间以100Hz的速度降低,当声音频率降到20Hz以下或键盘按下任意键时结束。beepdown.cvoid HariMain(void){ int i, timer; timer = api_alloctimer(); api_inittimer(timer, 128); for (i = 20000000; i &g原创 2021-10-11 06:52:57 · 2057 阅读 · 3 评论 -
30天自制操作系统——第二十三天窗口操作
窗口及输入切换我们先来实现用键盘切换窗口,按下F11键,将最下面的窗口移动到最上面,这里F11按键的编码为0x57。bootpack.c节选:void HariMain(void){ (略) for (;;) { (略) if (fifo32_status(&fifo) == 0) { (略) } else { (略) if (256 <= i && i <= 511) { /* 键盘数据 */ (略) if (i原创 2021-10-02 14:19:03 · 675 阅读 · 0 评论 -
30天自制操作系统——第二十二天图形处理
画点点是各种图形的基础,要实现图形处理,就先从画点开始吧。创建窗口的程序之前写过了,忘记的话往前翻翻找一下。再给窗口来一个黑色背景,窗口名就叫“夜空中最亮的星”吧。画点API式样:画点API:EDX=11EBX=窗口句柄ESI=显示位置的x的坐标EDI=显示位置的y坐标EAX=色号a_nask.nas节选:_api_point: ; void api_point(int win, int x, int y, int col); PUSH EDI PUSH ESI PUSH原创 2021-09-27 00:13:49 · 2042 阅读 · 2 评论 -
30天自制操作系统——第二十一天用C语言编写应用程序
帮助发现bugCPU的异常处理功能,还能帮助我们发现bug,比如下面的例子:bug1.c:void api_putchar(int c);void api_end(void);void HariMain(void){ char a[100]; a[10] = 'A'; /* 这句没有问题 */ api_putchar(a[10]); a[102] = 'B'; /* 这句有问题 */ api_putchar(a[102]); a[123] = 'C'; /* 这句也有问题 *原创 2021-09-23 22:11:40 · 4082 阅读 · 10 评论 -
30天自制操作系统——第二十天保护操作系统
在实现保护操作系统之前,我们先来实现两个功能。一个是使用API显示字符串,另一个是用C语言编写应用程序。使用API显示字符串显示字符串有两种方法,一种是显示一串字符,当遇到字符编码0时结束。另一种是先指定要显示的字符串的长度,然后进行显示。实现方式如下:console.c节选:void cons_putstr0(struct CONSOLE *cons, char *s){ for (; *s != 0; s++) { cons_putchar(cons, *s, 1); } retu原创 2021-09-18 07:40:34 · 1775 阅读 · 2 评论 -
30天自制操作系统——第十九天系统调用(API)
系统调用API(application program interface)即应用系统对操作系统功能的调用,也可以称为系统调用(system call)。今天我们就来实现系统调用的功能,我们先来思考一下WIN10系统是如何实现系统调用的呢?下图是简化版的Windows系统架构图:Windows计算机中处理器有两种模式,分别为用户模式(用户态、目态)和内核模式(核心态、内核态、管态、系统模式、管理模式)。在用户模式下,处理器运行用户进程,不能使用特权指令,其中特权指令是指具有特殊权限的指令,一般原创 2021-09-16 20:06:59 · 1033 阅读 · 3 评论 -
30天自制操作系统——第十八天运行应用程序
读取文件内容我们在运行应用程序之前,先来实现读取文件内容的功能吧。在windows的命令行窗口中,也可以实现读取文件内容的功能,当我们输入“type 文件名”时,就会显示文件的内容。定义一个文件信息结构:struct FILEINFO{ unsigned char name[8],ext[3],type; char reserve[10]; unsigned short time,date,clustno; unsigned int size;}其中clustno变量,代表文件从哪个原创 2021-08-26 06:13:17 · 2055 阅读 · 11 评论 -
30天自制操作系统——第十七天制作命令行窗口
今天的任务是制作命令行窗口,那么命令行窗口应该是什么样呢?在Windows系统里我们都使用过命令行窗口,它首先是黑底的,可以在里面输入各种字符、可以对输入的命令进行响应…由于命令行窗口的制作用到的都是之前的知识点,难度并不大。由于修改的代码量较大,篇幅有限,就不把代码粘贴上来了,有兴趣的同学可以自行下载阅读。这里主要记录一下制作命令窗口的关键步骤(本节没有什么新的知识点,可以直接跳过):一、绘制命令行窗口我们先在HariMain函数中画出一个命令行窗口的样子,命令行窗口一般就是黑底白字,可以对输入原创 2021-08-24 20:39:30 · 5038 阅读 · 33 评论 -
30天自制操作系统——第十六天实现多任务(二)
任务休眠上一篇我们实现的多任务,是为每个任务分配相同的时间。实际情况可能是A任务一直闲着没事干,B任务就一直拼命干活,这种分配显然是不合理的。那么如何避免这种浪费呢?我们可以把这样闲着没事干的任务,从tasks里删除,这种做法在多任务里叫作“休眠”(sleep)。当FIFO有数据过来时,我们再将A任务唤醒。(这里大家可以类比线程状态及状态切换,思路是相同的。)首先来创建task_sleep,mtask.c节选:void task_sleep(struct TASK *task){ int i;原创 2021-08-23 05:10:19 · 2952 阅读 · 28 评论 -
30天自制操作系统——第十五天实现多任务(一)
每日一句,完成比完美更重要。今天的任务是实现多任务,内容较多,现在就开始吧——任务切换多任务(multitask)也可以称作多进程,在windows操作系统中,就是多个应用程序同时运行的状态。这里来复习一下进程和线程的概念:进程:进程是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位。可以将运行在内存中的exe文件理解为进程,进程是受操作系统管理的基本运行单元。线程:线程可以理解成在进程中独立运行的子任务。比如QQ.exe运行时,就有很多子任务同时运行。每一项任务可以理解成“线程原创 2021-08-22 17:45:41 · 986 阅读 · 3 评论 -
30天自制操作系统——第十四天高分辨率显示切换与键盘输入
写在前面最近很喜欢下面这段话——是的,很大程度上程序员在创造和改变这个时代。上面一段话是《黑盒与画家》里的序章,不少书的序也很是精彩,错过了实在可惜呢。很多同学会觉得学操作系统、学汇编,实际工作没有用。且不说工作中还真的有可能会用到,更重要的是,我们现在正是处于一个程序的时代。学习和理解这个时代的内容,不能说是没有用,而这个时代的任何人都应该去理解计算机。后面计划自制一个CPU,不过现在元器件还没有找齐,等我找齐了再开始吧(希望能找齐),感兴趣的小伙伴可以后期继续关注。废话不多说了,开始今天的内容原创 2021-08-21 12:29:04 · 773 阅读 · 2 评论 -
30天自制操作系统——第十三天添加定时器(二)
测试性能由于后续开发中要经常用到定时器,需要不断对定时器进行改善,提高性能。然而每次一番操作,性能有没有提高,提高了多少,凭我们直观的感受可不好衡量,因此我们需要一个具体的方法来测试性能。这里我们测试性能的方法很简单,我们在HariMain函数进行修改。先将count置0,不显示任何计数。在for循环中全力执行“count++",当到了10秒后超时,再对这个count进行显示。这里需要注意的是,由于每次电脑初始化花费的时间差别较大(原因很多,这里就不赘述了),我们在3秒后把count复位为0一次,这样测原创 2021-08-20 07:34:37 · 968 阅读 · 6 评论 -
30天自制操作系统——第十二天添加定时器(一)
定时器定时器对操作系统而言十分重要,它会每隔一段时间发送一个中断信号给CPU。想要在电脑里管理定时器,需要对PIT进行设定。PIT(Programmable Interval Timer),可编程的间隔定时器,可以通过设定PIT,让定时器每隔多少秒就产生一次中断。PIT连接着IRQ(interrupt request)0 ,所以设定了PIT就可以设定IRQ0的中断间隔。将中断周期设置为11932,中断频率即为100Hz,也就是1秒钟发生100次中断,而11932换算成十六进制数就是0x2e9c。设置原创 2021-08-19 06:11:59 · 2452 阅读 · 18 评论 -
30天自制操作系统——第十一天制作窗口并消除闪烁
显示窗口制作一下窗口,思路与制作背景和鼠标一样,需要先准备一张图层,然后在图层缓冲区内描绘一个类似窗口的图。make_window8函数绘制窗口:void make_window8(unsigned char *buf, int xsize, int ysize, char *title){ static char closebtn[14][16] = { "OOOOOOOOOOOOOOO@", "OQQQQQQQQQQQQQ$@", "OQQQQQQQQQQQQQ$@", "OQ原创 2021-08-18 07:41:04 · 316 阅读 · 0 评论 -
30天自制操作系统——第十天叠加处理
向下舍入及向上舍入向下舍入:例如把135元以10元为单位进行向上舍入,就是130元;把675元以100元为单位进行向上舍入,就是600元。也可以理解为,向下舍入就是把最后几位数字强制变为0。向上舍入:例如把135元以10元为单位进行向上舍入,就是140元;把675元以100元为单位进行向上舍入,就是700元。向下舍入和向上舍入可使用与运算,比如把变量i中的数字以0x1000为单位进行向下舍入的式子如下:i = i &0xffff000;以0x1000为单位0x12345678进行向上舍入原创 2021-08-17 02:21:03 · 314 阅读 · 0 评论 -
30天自制操作系统——第九天内存管理
写的越来越像流水账,背离了初衷,后面只记录一下关键步骤,还有相关概念。内存容量检查这里不使用BIOS函数,而是自己去检查。思路是先关闭CPU的高速缓存(cache)功能,再进行内存检查。内存检查时,要往内存里随便写入一个值,然后马上读取,检查写入的值与读取的值是否相等。高速缓存:每次访问内存时,都将所访问的地址和内容都放到高速缓存里,这样会大大提高CPU的性能,这种性能的提升可能是数倍以上的。聪明的编译器在对内存进行检查时,发现了问题。编译器对用C语言编写的看似重复性的代码进行了优化处理,将该段程原创 2021-08-15 23:16:05 · 368 阅读 · 0 评论 -
30天自制操作系统——第八天鼠标控制与32位模式切换
今天的任务是让鼠标真正移动起来,之前的路走的真是艰辛呀。终于到走到这里啦,下面正式开始了——鼠标解读(harib05a)昨天我们已经能从鼠标取得数据了,接着要读取这些数据,看看鼠标是怎么移动的,在根据鼠标的动作,让鼠标指针动起来。先对bootpack.c的HariMain函数做一些修改:unsigned char mouse_dbuf[3], mouse_phase;enable_mouse();mouse_phase = 0; /* 进入到等待鼠标的0xfa的状态 */for (;;)原创 2021-08-14 23:02:39 · 412 阅读 · 0 评论 -
30天自制操作系统——第七天FIFO缓冲区与鼠标控制
昨天鼠标不动的问题,是因为相关的设定还没到位。鼠标和键盘的情况很类似,在解决鼠标问题之前,先拿键盘练练手。获取按键编码(hiarib04a)现在在键盘上按一个键,就在屏幕上显示出信息。我们把程序修改成,键盘按下一个键后不直接结束,可以接着在屏幕上显示按键的值,其他就先不做了。需要修改的是int.c中的inthandler21函数:#define PORT_KEYDAT 0x0060void inthandler21(int *esp){ struct BOOTINFO *binfo = (原创 2021-08-14 08:19:21 · 567 阅读 · 0 评论 -
30天自制操作系统——第六天尝试让鼠标指针动起来
昨天制作了鼠标,但是没让它动起来,今天我们来找找让鼠标动起来的方法。在这之前先做一些准备活动吧——分割源文件(harib03a)现在的bootpack.c文件已经有300行的长度了,因此我们决定把它分割成几个部分。将分割后的 .c文件,先生成 .obj文件(目标文件),再将这些目标文件全部link上,生成bootpack.bim。对应的Makefile也需要修改,修改完毕我们来make run一下,画面没有什么变化——整理Makefile文件(harib03b)C语言的程序是变短了,现在Ma原创 2021-08-13 00:01:05 · 695 阅读 · 2 评论 -
30天自制操作系统——第五天显示文字及开始制作鼠标指针
昨天已经给操作系统加了一个大大的进度条,让我们来继续制作的操作系统吧!今天主要任务包括使用结构体、文字显示、开始鼠标移动。使用结构体接收启动信息(harib02b)上一篇在bootpack.c里,是将0xa0000、320、200这些数字直接写入程序。按照正常写程序的思路 ,这些数据应该作为初始化变量,在asmhead.nas先前保存下来的值中取。将这些变量保存到结构体中,结构体的内容如果忘记了,可以翻阅一下大学的课本,这里就不做说明啦——bootpack.c节选:struct BOOTIN原创 2021-08-12 06:14:13 · 865 阅读 · 1 评论 -
30天自制操作系统——第四天使用C语言制作操作系统进度条
昨天已经让画面显示黑屏了,但是黑屏太没意思,今天来让画面画点东西吧。今天的任务还是比较有趣的,主要包括内存写入、画面显示条纹图案、设定色号、绘制矩形,最后制作一个进度条。每个大标题下的代码,都在文末的资源里,可自行下载实验。内存写入(harib01a)想要在画面上画东西,只要往VRAM里写点东西就可以了。那什么是VRAM呢?上一篇的最后已经用到了VRAM,不过没有做详细的讲解。VRAM指的是显卡内存(video RAM),就是可以用来显示画面的内存。这一块内存可以像内存一样存储数据,它的各个地原创 2021-08-10 20:26:19 · 918 阅读 · 1 评论 -
30天自制操作系统——第三天画面显示黑屏和着手使用C语言开发
今天的主要任务是让画面显示黑屏,嘿嘿。内容比较多,包括制作能装载程序的IPL,读取软盘内容,画面显示黑屏,开始运行C语言编写的程序。由于我们在同一个文件上做了多次修改,因此今天的资源分了多个文件夹,里面用到的文件括号里的内容对应文末资源里的文件夹名。事不宜迟,那么现在就开始吧——制作IPL上一篇我们知道,磁盘最初的512字节是启动区,现在我们要装载下一个512字节的内容。我们在上一版ipl.nas中添加了如下代码,由于该部分内容后面需要经过多次修改,这里给每次修改添加了版本,ipl.nas(ve原创 2021-08-10 06:07:30 · 1266 阅读 · 2 评论 -
30天自制操作系统——第二天汇编语言学习和Makefile入门
今天的任务是汇编语言和寄存器学习、制作启动区、Makefile入门里面用到的文件,都在文末的链接里。下面是采用汇编语言编写的helloos.nas编写,是不是比前一篇好读多了:; hello-os; TAB=4 ORG 0x7c00 ; 指明程序的装载地址; 以下这段是标准FAT12格式软盘专用的代码 JMP entry DB 0x90 DB "HELLOIPL" ; 启动区的名称可以是任意的字符串(8个字节) DW 512 ; 每个扇区(sect原创 2021-08-08 19:27:55 · 1442 阅读 · 2 评论 -
30天自制操作系统——第一天制作一个Hello word操作系统
入手一本《30天自制操作系统》,内容诙谐有趣,很适合对操作系统一窍不通的新手。据作者所言,这本书的最终目标是从零开始编写一个五脏俱全的图形操作系统,不用什么基础,而且只需30天!!没有看错,只需30天,看着真的心动了。编写一个操作系统应该是很多程序员的梦想吧,可能很多人想都不敢想,觉得太难了。但是作者却说这是一件很简单的事,那么挑战一次也未尝不可吧。那么就正式开始第一天——顺便一提,文中用到的软件、文件都在文章最后的网盘连接里,可以直接下载。一、制作软盘映像文件helloos.img首先要用到原创 2021-08-07 10:32:17 · 5958 阅读 · 8 评论