操作系统
文章平均质量分 88
公子无缘
这个作者很懒,什么都没留下…
展开
-
【操作系统】30天自制操作系统--(28)兼容标准函数(完)
至此,操作系统基本框架已经完成,后本章主要包含了原书第29和30天的内容,后面就是一些修修补补的工作,主要是增加了几个有用的应用程序,由于有些应用程序篇幅比较长,这边就不一一列举了,有兴趣的可以自行看书。一 兼容标准函数C语言当中有一些标准函数,诸如printf、putchar、strcmp、malloc等。如果将他们封装好的话,那么可以用在windows或则linux上面的应用程序就可以移植过来了,非常的方便。其实主要就是利用之前写好的API...原创 2022-05-24 17:44:59 · 333 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(27)文件操作
本章主要介绍了对 _alloca 函数的兼容,日文的显示,以及着重介绍了文件系统操作。一 对_alloca的支持首先作者写了一个小应用程序,功能是找出并打印1000以内的质数:#include <stdio.h>#include "apilib.h"#define MAX 1000void HariMain(void){ char flag[MAX], s[8]; int i, j; for (i = 0; i < MAX; i++) ...原创 2022-05-24 14:32:30 · 490 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(26)LDT与库
本章主要描述了一种基于LDT(本地段描述符表)的程序保护机制。另外引入了库,并基于此整理了一下当前的操作系统源码以及应用程序的目录。一 解决BUG上一章最后留有一个“使用 ncst 启动的程序无论是用 shift + F1 还是鼠标点 x 都无法结束”的BUG。问题在于在shift + F1 还是鼠标点 x 处需要唤醒任务,以便结束处理能够得到执行:task_run(task, -1, 0); //功能是将休眠的任务唤醒...原创 2022-05-23 16:22:19 · 970 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(25)为窗口移动提速
本章主要是针对命令行窗口的一些优化工作,主要包括提高窗口的移动速度、增加更多的命令行窗口以及关闭命令行窗口(之前介绍的是关闭应用程序窗口)。一 提高窗口移动速度【优化1】:优化 sheet_refreshmap 函数以提升窗口的移动速度。优化方案是判断将对透明图层的判断放到循环嵌套的外面,可以减小判断的执行次数。if (sht->col_inv == -1) { /*从此开始*/ /*无透明色图层专用的高速版*/ for (by = by0; by &...原创 2022-05-20 17:21:28 · 262 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(24)增加命令行窗口
本章主要是针对前面窗口的内容,做了一些优化,增加了一个命令行窗口以便于运行两个应用程序。另外还有一些边缘API编写,诸如蜂鸣器以及颜色的处理。一 蜂鸣器发声蜂鸣器和定时器一样,都是由PIT来控制的,而PIT位于芯片组中,因此所有型号的电脑都能使用它。蜂鸣器发声的控制如下:【1】设计蜂鸣器发声API如下:【2】依据此修改 console.c :/* console.c */else if (edx == 20) ...原创 2022-05-19 15:07:30 · 326 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(23)窗口操作
本章承接之前的窗口相关内容进行完善,增加了一些诸如拖动鼠标移动窗口、点击鼠标切换窗口等等的操作,使得操作系统用起来更像Windows的表现。最后还增加了几个定时器API的编写,供外部应用程序调用。一 窗口切换 加入两个功能,可以切换指定窗口到最上层图层:【1】按 F11 键时可以将最下面的图层切换到最上面:if(256 <= i && i <= 511) { /* 键盘数据 */ if(i == 256 + 0x57 ...原创 2022-05-17 14:57:57 · 332 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(22)图形处理API
本章主要编写了内存分配API、几个图形处理的API(包括画点、画线、窗口刷新以及窗口关闭)以及键盘输入的API。一 编写malloc API应用程序需要多少内存应该在编写应用程序时指出来比较好,这就需要应用程序调用memman、malloc、free等API。【1】设计几个API如下:【2】依据此修改 console.c :int *hrb_api(int eid, int esi, int ebp, int esp. int ebx, int ...原创 2022-05-16 10:22:01 · 405 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(21)用C语言编写应用程序
本章的内容比较杂。首先构建了几个攻击程序,尝试破坏操作系统,并依据测试结果,强化操作系统保护机制的过程。其次描述了.hrb文件的开头结构,并依据改文件格式,来用C语言编写应用程序。最后还顺带提了一下创建显示窗口、以及绘制字符和方块的API。一 测试操作系统几个测试,证明了某些情况下,异常保护的有效性:【1】第一招,在定时器上做手脚。但是实际操作系统会出现异常报错,原因在于当以应用程序模式运行时,执行 IN 或者 OUT 指令,都会产生一般保...原创 2022-05-11 17:16:22 · 2602 阅读 · 1 评论 -
【操作系统】30天自制操作系统--(20)保护操作系统
本章主要描述了如何防止应用程序对操作系统本身产生破坏和一些异常处理。一 用C语言编写应用程序前一章节的应用程序 hello.nas 是用汇编语言编写的:[INSTRSET "i486p"][BITS 32] MOV EDX,2 MOV EBX,msg INT 0x40 RETFmsg: DB "hello",0如果能用C语言编写会省事很多,类似下面 hello.c 这样:void api_putchar...原创 2022-05-11 14:17:41 · 215 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(19)API
本章实现由应用程序对操作系统功能的调用(即API,也叫系统调用)。简单来说,就是操作系统提前准备好接口,供外部的应用程序调用并实现相应的功能(前一章中,应用程序只是一个简单的HLT,并没有调用操作系统的接口,这一章就是操作系统准备好一个字符打印的接口,供应用程序使用)。一 调用API显示单个字符 我们先来通过API显示单个字符,实现这个功能我们先把需要显示字符编码存入寄存器,然后再让应用程序能够调用cons_putchar函数。这里存在两个...原创 2022-05-07 18:06:05 · 532 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(18)应用程序
本章主要介绍了文件处理的相关操作以及尝试制作第一个应用程序hlt。一 type命令与Linux里面的type命令不同,Windows命令行中的type命令是用来查看文件内容的。在自制的操作系统中,我们模仿的是Windows的type功能。 怎么才能把文件内容读到命令行窗口中呢?首先要找到它存放的扇区。这个在上一章【操作系统】30天自制操作系统--(17)命令行窗口2中有所描述,关注clustno这个变量,存放的就是文件的存储扇区:s...原创 2022-05-06 18:03:39 · 527 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(17)命令行窗口2
本章承接上一章命令行窗口,完善了命令行的一些基本功能,诸如切换窗口光标闪烁、回车换行以及一些简单的命令反馈。一 光标闪烁对于主任务,按下TAB之后,需要对光标处理,使其不闪烁。那么对于命令行任务,该如何通过HariMain来告知console_task需不需要让光标闪烁呢?这边采取的做法就是像按键编码一样,通过FIFO缓冲区来传递参数。 在主函数中,如果需要切换,将光标闪烁的参数(闪烁为2,不闪为3)传递给命令行任务:if (i == ...原创 2022-05-05 17:35:39 · 593 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(16)命令行窗口1
本章主要介绍创建命令行窗口,并向命令行窗口中输入字符。一 创建命令行窗口(任务) 这边的命令行不仅仅是一个单一的窗口,而是需要新建一个任务。前面有几个计数任务B正好可以拿来改造。 下面是任务的执行程序(窗口的创建在主函数中,这边不再赘述):void console_task(struct SHEET *sheet) { struct FIFO32 fifo; struct TIMER *timer; struct TASK *task ...原创 2022-05-01 12:00:00 · 704 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(15)多任务2
本章主要针对多任务的通用性处理、任务休眠操作以及任务优先级处理进行一些改进。一 多任务的通用性处理 回顾一下前一章的任务切换处理mt_taskswitch(参考【操作系统】30天自制操作系统--(14)多任务1): 两个任务这么处理可以,但是当任务多达几十上百个之后,这么处理就不行了。所以这边需要一个TASKCTL的任务管理结构来存放所有的子任务:#define MAX_TASKS 1000 #define TASK_GDT0 3 ...原创 2022-04-28 16:48:01 · 2787 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(14)多任务1
本章开始多任务的设计。一 多任务的说明多任务(multitask),指的是操作系统中,多个应用程序同时运行的状态。然而,对于单核CPU来说,同一个瞬间只能处理一个事情,不能做到左右互搏、一心二用的效果,那只能通过快速切换运行任务,来实现这种所谓的多任务状态:在一般的操作系统中,这个切换动作每0.01-0.03秒进行一次(这样CPU大概只有1%的处理能力消耗在任务切换上,可以忽略不计)。这个切换时间不能太慢(会让人感觉到程序卡顿)、也不能太快...原创 2022-04-26 16:19:09 · 1175 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(13)高分辨率及键盘输入
本章内容主要讲的是提高显示分辨率(汇编)和通过键盘码映射表实现键盘输入的显示。相对来说较为简单的一张内容,这边主要是起到一个补充讲解的作用。一 高分辨率模式由于画面切换中我们要使用BIOS,所以就需要改写asmhead.nas的画面模式设定部分(参考链接【操作系统】30天自制操作系统--(3)C语言写内存与简单的画面显示): 可以修改为:; 设定画面的模式 MOV BX,0x4101 ; VBE的640x480x8bi彩色...原创 2022-04-25 14:51:24 · 1626 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(12)定时器2
本章主要是针对上一章【操作系统】30天自制操作系统--(11)定时器1继续进行性能优化的内容。一 简化字符串显示本书有个很让人头疼的问题就是,一些本来可以合并在一起形成一个章节的内容,非要零零碎碎地分布在各个章节。这边就是一个典型,一个简简单单地封装操作,前面介绍界面绘制的时候顺便提一下就好了,安排在这边定时器一章多少显得有点不论不类。 这边就是将下面几个函数: 合并封装为一个整体putfonts8_asc_sht(意思就是在图层sht中的...原创 2022-04-24 16:46:39 · 497 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(11)定时器1
本章介绍定时器中断的使用。一 定时器中断的使用 由【操作系统】30天自制操作系统--(5)分割编译与中断处理中的表格可以看到,对于定时器中断的使用就用到了IRQ0这个中断请求。中断请求 硬件设备 IRQ0 系统计时器 IRQ1 键盘 IRQ2 可设置中断控制卡 IRQ3 COM2(串行接口2) IRQ4 COM1(串行接口1) IRQ5 空 IRQ6 磁盘机 IRQ7 并行接口...原创 2022-04-20 15:04:52 · 731 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(10)制作窗口
本章首先处理了一下鼠标在画面边缘的bug,另外创建窗口,在窗口中显示内容(计数器累加),并修复了内容刷新的会发生闪烁的bug(我在使用成熟的嵌入式界面绘制软件emWin的时候,也会发生图层叠加,刷新不当,而导致显示的内容闪烁的情况,所以这类bug还是比较典型的,应当引以为戒)。一 鼠标在界面边缘显示的bug修复在sheet_refreshsub中针对刷新的范围做出修正,如果刷新的范围超过了该图层的范围,则做幅值范围的限制:void sheet_refresh...原创 2022-04-19 16:47:15 · 1127 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(9)叠加处理
这一章主要是处理之前遇到的图层叠加的问题。【操作系统】30天自制操作系统--(7)鼠标移动与32位切换一 内存管理优化上一章的内存管理虽然写好,但是还是有不完善的地方。因为如果不对申请内存的大小有限制的话,时间长了,内存就会呈现碎片化的情况,而且内存管理列表也很有可能达到上限。所以这边单独写一个每次申请4K大小的函数,这样如果调用这个函数,内存就会以一块4K来排列,比较规整(事实上,实际的使用中,会有专门申请大内存的函数和申请小内存的函数,以应对不同的使用场景,内...原创 2022-04-18 16:13:58 · 613 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(8)内存管理
搞定了鼠标和键盘这两个外设的处理,终于走到了内存管理这一步。平时写上层应用的时候,就是malloc、free、memset这几件套,较少关注内存多少、内存能不能用等底层细节,但是要制作操作系统,对于内存的检查和管理就不可或缺了,所以一章的内容是比较重要的。这一章着重介绍了内存的检查和内存容量的管理。一 内存检查 考虑在操作系统上电初始化的时候做一次内存检查,内存检查的代码实现如下:unsigned int memtest(unsigned ...原创 2022-04-15 15:29:42 · 617 阅读 · 0 评论 -
【操作系统】CPU寄存器详解
寄存器是 CPU 内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果以及一些 CPU 运行需要的信息。本文将归纳下面几中寄存器:目录一 通用寄存器二 标志寄存器三指令寄存器四 段寄存器五 控制寄存器六 调试寄存器七 描述符寄存器八 任务寄存器九 MSR寄存器一 通用寄存器 最常用的,也是最基础的有8个通用寄存器(注意一般看到的EAX、ECX也是指的这类寄存器再32位CPU上的拓展,另...原创 2022-04-15 11:29:26 · 15682 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(7)鼠标移动与32位切换
上一章介绍了键盘与鼠标的中断以及操作码的读入,这一章将用鼠标的操作码,结合之前绘制的鼠标箭头,实现鼠标的移动。另外,再说明一下前文略过的asmhead.nas的内容。一 鼠标移动鼠标在中断中的存储的操作码包含三位的信息,即[操作,X坐标,Y坐标],我们在主函数中读取的时候,可以三位三位地读取。 这边鼠标数据的解读分为三个阶段,首先要把最初读到的0xfa舍弃掉。之后,每次从鼠标那里送过来的数据都应该是3个字节一组的,所以每当数据累 积到3个字节,就把它...原创 2022-04-14 11:20:33 · 938 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(6)FIFO缓冲区与鼠标控制
上一章的最后,实现了键盘的中断反馈,但是鼠标依然没有反应,所以承上启下,本章要做这么几个事情,(1)将中断接收到的数据,拿到中断外面来处理,以减少中断中的操作,加快程序运行(这边很好理解,不再赘述);(2)建立FIFO缓冲区,以便快速稳定地读写键盘/鼠标的活动数据;(3)键盘控制电路的初始化,并激活鼠标,应用建立的FIFO缓冲区读写鼠标的活动数据;一 建立FIFO缓冲区缓冲区是一个队列结构,先进先出,队列长度可以在初始化中自行定义。这边主要构建了以下几个操...原创 2022-04-13 16:13:00 · 1642 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(5)分割编译与中断处理
上一章的GDT/IDT内容结束的没头没尾的,这一章会接着介绍。 这一章做了这么两件事情,一是将目前略显冗余的源文件bootpack.c整理了一下,分成了几个具有不同功能的源文件。二是继续上一章节的内容,在初始化中断向量表之后,设置新的中断关联鼠标和键盘。我觉得这一章的内容虽然短小,却还是挺重要的。一 分割编译目前的源文件内容已经比较多了,包含了GDT/IDT的配置初始化,调色板的初始化,屏幕(尺寸等)的初始化,还有绘制光标、显示字符等应用部分。作者将bo...原创 2022-04-12 15:26:46 · 413 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(4)显示字体(汉字)以及GDT/IDT
一 显示字体(汉字)字符的显示其实跟上一章矩形的显示类似,也是往指定的像素块中写颜色值,只不过字符的显示回更精细一些,而不是一大块一大块的简单赋值。 显示8*16字符的函数如下,通过直接向VRAM中的地址赋值来显示字符:/** * @brief 通过直接向 VRAM 中的地址赋值来显示字符 * @param vram * @param xsize * @param x * @param y * @param c 颜色 color * @...原创 2022-04-11 17:10:20 · 1490 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(3)C语言写内存与简单的画面显示
有了前文底层汇编的铺垫,本章主要是过渡到C语言的编写,先由最基础的写内存,绘制基本图形开始。一 C语言写内存前文用汇编语言构建了一个写内存的函数write_mem8:_write_mem8: ; void write_mem8(int addr, int data); MOV ECX,[ESP+4] ; [ESP+4]にaddrが入っているのでそれをECXに読み込む MOV AL,[ESP+8] ; [ESP+8]にdataが入っているのでそれを...原创 2022-04-08 17:06:31 · 1629 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(2)导入C语言
一 汇编语言入门8位系统中主要包含以下几个寄存器:简写 原文 解释 AX accumulator 累加寄存器 CX counter 计数寄存器 DX data 数据寄存器 BX base 基址寄存器 SP stack pointer 栈指针寄存器 BP base pointer 基址指针寄存器 SI source index 源变址寄存器 DI d...原创 2022-04-08 10:18:55 · 1493 阅读 · 0 评论 -
【操作系统】30天自制操作系统--(1)虚拟机加载最小操作系统
最近学习了川合秀石的《30天自制操作系统》,准备跟着书里面的介绍自己做一做,这边开个新帖用作记录。自制操作系统首先要搭建环境,书中是用软盘作为系统的启动盘,现在哪里找软盘去,只能先用VMware虚拟机,虚出一个带软盘处理的环境进行测试。一 准备工作【1】《30天自制操作系统》的光盘资料:30天自制操作系统的光盘资源-其它文档类资源-CSDN下载【2】VMware(版本不限,我这边用的是15的版本)二 用VMware虚拟机搭建环境【1】下载安装VMw...原创 2022-04-07 14:02:08 · 2605 阅读 · 7 评论