自制操作系统
文章平均质量分 92
Histranger_
这个作者很懒,什么都没留下…
展开
-
第30天 高级的应用程序
第30天 高级的应用程序2020.5.121. 命令行计算器(harib27a)编写代码cal.c:……此代码略长,且不是编写OS的重点,因此此处不再罗列代码。可以使用的运算符:+:加法运算-:减法运算*:乘法运算/:整除%:取余&:按位与|:按位或^:异或~:按位取反<<:左移>>:右移():括号运算结同时显示十进制和十六进制。只能进行整数运算。计算优先级和C语言的规定相同。可以直接使用16进制数字,只要在16进制.原创 2020-05-13 11:25:15 · 300 阅读 · 0 评论 -
第29天 压缩与简单的应用程序
第29天 压缩与简单的应用程序2020.5.101. 修复bug(harib26a)先修复harib25g中的bug。通过观察,发现harib25g中,只有全角字符的显示有问题,半角字符是正常的,而且移动窗口之后可以恢复正常,这说明图层缓冲区中是有数据的。因此,问题极有可能出现在刷新上面。修改putfont8_asc_sht(window.c):void putfonts8_asc_sht(struct SHEET *sht, int x, int y, int c, int b,.原创 2020-05-12 15:50:25 · 383 阅读 · 0 评论 -
第28天 文件操作与文字显示
第28天 文件操作与文字显示2020.5.81. alloca(1)(harib25a)编写一个求素数的应用程序sosu.c:#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++) { flag[i] = 0; .原创 2020-05-10 16:59:32 · 597 阅读 · 0 评论 -
第27天 LDT与库
第27天 LDT与库2020.5.71. 先来修复bug(harib24a)在harib23j中有一个bug,就是用ncst运行的应用程序,使用Shift+F1和点击“X”按钮都无法关闭窗口。其实这个bug在很久之前就有了,只是一直没有发现而已。修改HariMain:void HariMain(void){ …… for (;;) { …...原创 2020-05-07 23:50:47 · 450 阅读 · 0 评论 -
第26天 为窗口移动提速
第26天 为窗口移动提速2020.5.21. 提高窗口移动速度(1)(harib23a)本着优化用户体验的宗旨,修改代码以提高窗口移动速度。导致窗口移动相对缓慢的原因其中之一是:sheet_refreshmap的速度太慢。sheet_refreshmap在sheet_slide中被调用了2次,如果能够提高sheet_refreshmap的速度,那么就能显著提高窗口移动的速度。...原创 2020-05-05 11:46:18 · 300 阅读 · 0 评论 -
第25天 增加命令行窗口
第25天 增加命令行窗口2020.4.301. 蜂鸣器发声(harib22a)蜂鸣器和定时器一样,都是由PIT来控制的,而PIT位于芯片组中,因此所有型号的电脑都能使用它。关于蜂鸣器的相关资料:其中,赫兹大小 = 1.19318MHz / 设定值。PIT时钟频率与CPU时钟频率无关,PIT时钟频率大小恒定为1.19318MHz。设计蜂鸣器发声的API:EDX ...原创 2020-05-02 14:43:29 · 400 阅读 · 0 评论 -
第24天 窗口操作
第24天 窗口操作2020.4.291. 窗口切换(1)(harib21a)实现能够切换窗口顺序的功能,首先实现从键盘切换的方法:当按下F11时,将最下面的窗口放到最上面。F11的按键编码是0x57,F12的按键编码是0x58。修改HariMain:void HariMain(void){ …… for (;;) { …… ...原创 2020-04-30 15:01:52 · 292 阅读 · 0 评论 -
第23天 图形处理相关
第23天 图形处理相关2020.4.281. 编写malloc(harib20a)harib19g的winhelo2.hrb大小竟然有7.6KB。winhelo2.hrb中有很多00。原因是winhelo2.c中char buf[150*50];这一句代码,这相当于在可执行文件中插入了150*50=7500个字节的00,这和汇编语言中的RESB 7500是一样的。应用程序中...原创 2020-04-29 16:26:35 · 280 阅读 · 0 评论 -
第22天 用C语言编写应用程序
第22天 用C语言编写应用程序2020.4.261. 保护操作系统(5)(harib19a)把OS的段地址存入DS和访问OS管理的内存空间这两招已经不能用了。试试在定时器上做手脚:这样,光标闪烁就会变得异常,任务切换的速度也会变慢。编写恶意应用程序crack3.nas:[INSTRSET "i486p"][BITS 32] MOV AL,0x34 ...原创 2020-04-28 16:02:19 · 1077 阅读 · 0 评论 -
第21天 保护操作系统
第21天 保护操作系统2020.4.241. 攻克难题——字符串显示API(harib18a)在harib17h中hello.hrb运行出现异常。应该是内存段的锅。显示单个字符时,用[CS:ECX]的方式特意指定了CS(代码段寄存器),因此可以成功读取msg的内容。但是在显示字符串时,由于无法指定段地址,程序误以为是DS从而从完全错误的内存地址中读取了内容,碰巧读出的内容是0,于...原创 2020-04-26 18:10:19 · 281 阅读 · 0 评论 -
第20天 API
第20天 API2020.4.231. 程序整理(harib17a)实现由应用程序对OS功能的调用,即API(系统调用)。API,application program interface,应用程序(与系统之间的)接口。由应用程序来调用(操作)系统中的功能来完成某种操作。编写一个在命令行窗口中显示字符的API。(BIOS中也有这个功能,但是现在无法使用BIOS哦)现...原创 2020-04-26 18:09:48 · 217 阅读 · 0 评论 -
第19天 应用程序
第19天 应用程序2020.4.211. type命令(harib16a)type命令,显示文件内容。liunx中对应的命令是cat。要想实现type命令,就必须读取文件内容。回想一下昨天的内容:用二进制查看器查看了磁盘映像的内容,并定义了一个结构体用于存放32字节的数据。struct FILEINFO { unsigned char name[8], ext[3...原创 2020-04-26 18:09:16 · 414 阅读 · 0 评论 -
第18天 dir命令
第18天 dir命令2020.4.201. 控制光标闪烁(1)(harib15a)实现只让当前选中的页面的光标闪烁。判断按下的是否是Tab键的是HariMain,控制光标闪烁的是HariMain和console_task。修改HariMain:void HariMain(void){ …… cursor_c = COL8_FFFFFF; …… ...原创 2020-04-21 16:30:34 · 498 阅读 · 0 评论 -
第17天 命令行窗口
第17天 命令行窗口2020.4.191. 闲置任务(harib14a)在harib13e中,如果任务B0~B2没有启动,只有任务A启动,当任务A进入休眠状态,程序就会因为找不到其他的任务而导致运行出现异常。在harib13e的bootpack.c的HariMain中将代码:task_run(task_b[i], 2, i + 1);注释掉。make后用VMware运行:...原创 2020-04-20 17:40:53 · 370 阅读 · 0 评论 -
第16天 多任务(2)
第16天 多任务(2)2020.4.181. 任务管理自动化(harib13a)在bootpack.h中结构体TASK、TASKCTL和TSS的定义:#define MAX_TASKS 1000 /* 最大任务数量 */#define TASK_GDT0 3 /* 定义从GDT的几号开始分配给TSS */struct TSS32 { int backlink, e...原创 2020-04-19 18:30:10 · 400 阅读 · 0 评论 -
第15天 多任务(1)
第15天 多任务(1)2020.4.171. 挑战任务切换(harib12a)多任务,就是进程管理。假如有多个CPU核心,多任务也就很简单了。这是面向单核处理器的操作系统,一个CPU,照样可以实现多任务。一个CPU实现多任务,其实,这些程序根本没有在同时运行,只不过给人一种同时在运行的假象而已。。如下图:看上去是在同时运行:程序A运行一会儿,程序B再运行一会儿,程序C再运行一...原创 2020-04-18 13:06:39 · 494 阅读 · 0 评论 -
第14天 高分辨率及键盘输入
第14天 高分辨率及键盘输入2020.4.161. 继续测试性能(harib11a~harib11c)设定多个定时器(490+个),测试在下面三种情况中count的值:harib10g(有移位)harib10h(没有移位,没有哨兵)harib10i(没有移位,有哨兵)先编写函数set490(bootpack.c):void set490(struct FIFO32 *...原创 2020-04-18 13:05:18 · 411 阅读 · 0 评论 -
第13天 定时器(2)
第13天 定时器(2)2020.4.151. 简化字符串显示(harib10a)harib09g的bootpack.c有210行,代码中多次出现了:boxfill8(buf_win, 160, COL8_C6C6C6, 40, 28, 119, 43);putfonts8_asc(buf_win, 160, 40, 28, COL8_000000, s);sheet_refres...原创 2020-04-16 10:48:51 · 243 阅读 · 0 评论 -
第12天 定时器(1)
第12天 定时器(1)2020.4.111. 使用定时器(harib09a)定时器Timer对OS来讲非常重要。它的原理:每隔一段时间就给CPU发送一个中断信号。管理定时器是OS的重大任务之一。管理定时器,需要对PIT进行设定。PIT,programmable interval timer, 可编程间隔定时器。可以通过设定PIT,让定时器每隔多少秒就产生一次中断。电脑中PI...原创 2020-04-15 14:40:31 · 425 阅读 · 0 评论 -
第11天 制作窗口
第11天 制作窗口2020.4.101. 鼠标显示问题(harib08a)harib07d中鼠标移动到屏幕最右边:鼠标应该向右或向下移动到屏幕之外隐藏起来。修改HariMain函数中的代码if (mx > binfo->scrnx - 16) { mx = binfo->scrnx - 16;}if (my > binfo->s...原创 2020-04-11 16:46:32 · 290 阅读 · 0 评论 -
第10天 叠加处理
第10天 叠加处理2020.4.91. 内存管理(续)(harib07a)先整理一下源文件:把用于内存管理的函数、数据结构和常量汇总到memory.c中去。memman_alloc和memman_free是以1字节为单位进行内存管理。 这样在反复进行内存分配和释放之后就会产生很多不连续的小段未使用,从而导师man->frees达到饱和。因此,编写以0x1000字节(4...原创 2020-04-10 18:29:38 · 511 阅读 · 0 评论 -
第9天 内存管理
第9天 内存管理2020.4.81. 整理源文件(harib06a)修改函数所在源文件新增mouse.c和keyboard.c源文件。因此,需要修改Makefile。2. 内存容量检查(1)(harib06b)进行内存管理之前,我们必须知道内存究竟有多大。具体方法有二:在最初起启动的时候,BIOS肯定会检查内存容量,所以我们只要问一问BIOS,就知道内存容量有多...原创 2020-04-08 20:41:51 · 513 阅读 · 0 评论 -
第8天 鼠标控制与32位模式切换
第8天 鼠标控制与32位模式切换2020.4.21. 鼠标解读(1)(harib05a)现在,我们让鼠标动起来。先对bootpack.c中的HariMain函数进行修改。unsigned char mouse_dbuf[3], mouse_phase;……enable_mouse();mouse_phase = 0; /* 进入等待鼠标的0xfa状态 */for (;...原创 2020-04-07 22:34:05 · 497 阅读 · 0 评论 -
第7天 FIFO与鼠标控制
第7天 FIFO与鼠标控制2020.4.11. 获取按键编码(harib04a)修改程序,让程序在按下一个键以后不结束,而是把所按键的编码在画面上显示出来。修改int.c中的inthandler21函数:void inthandler21(int *esp){ struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTI...原创 2020-04-02 14:35:48 · 433 阅读 · 0 评论 -
第6天 分割编译与中断处理
第6天 分割编译与中断处理2020.3.311. 分割源文件(harib03a)开发至昨天,bootpack.c的长度已经有将近300行了。一个源文件太长可不是一件好事情。 因此,需要将bootpack.c分割成为几部分。源文件分割的利与弊:优点:按照处理内容进行分类,如果分得好,将来修改时,可维护性高。如果Makefile写得好,只需要编译修改过的文件,就可以提高ma...原创 2020-04-01 17:00:16 · 516 阅读 · 0 评论 -
第5天 结构体、文字显示与GDT/IDT初始化
第5天 结构体、文字显示与GDT/IDT初始化2020.3.291. 接受启动信息(harib02a)在harib01?中的bootpack.c中xsize、ysize屏幕分辨率等信息是直接写入程序的。正确的获取这些信息的方式是从asmhead.nas先前保存下来的值中获取。查看asmhead.nas的部分代码:; 有关BOOT_INFOCYLS EQU 0x0ff0 ...原创 2020-03-30 23:39:22 · 789 阅读 · 0 评论 -
第4天 C语言与画面显示的练习
第4天 C语言与画面显示的练习2020.3.281. 用C语言实现内存写入projects/04_day下的harib01a下的naskfunc.nas; naskfunc; TAB=4[FORMAT "WCOFF"] ; 制作目标文件的模式 [INSTRSET "i486p"] ; 告诉nask,这个程序是给486用的[BITS 32] ; 制作32...原创 2020-03-28 20:47:37 · 552 阅读 · 0 评论 -
第3天 进入32位模式并导入C语言
第3天 进入32位模式并导入C语言2019.12.301. 制作真正的IPLIPL:Initial Program Loader,启动程序装载器磁盘最初的512字节是启动区,所以需要装载下一个512字节的内容。修改ipl.nas,添加的内容如下:MOV AX,0x0820MOV ES,AXMOV CH,0 ; 柱面0MOV DH,0 ; 磁头0MOV...原创 2020-03-28 11:19:55 · 455 阅读 · 0 评论 -
30_OS 第2天 汇编语言学习与Makefile入门
第2天 汇编语言学习与Makefile入门1. helloos.nas节选详解helloos.nas; hello-os; TAB=4 ORG 0x7c00 ; 指明程序的装载地址; 以下的记述用于标准的FAT12格式的软盘 JMP entry DB 0x90---(中略)---; 程序核心entry: ...原创 2019-12-29 22:45:56 · 433 阅读 · 0 评论 -
30_OS 第1天 从计算机结构到汇编程序入门
第1天 从计算机结构到汇编程序入门2019.12.271. 二进制编辑器下载Bz1621.zip编写helloos.img 其大小为147560字节(92160*16字节)。2. tolset文件夹./tolset/z_new_w文件夹下!cons_9x.batcommand注:对于win10,个人认为,此文件没用。./toolset/z_new_w...原创 2019-12-28 16:24:15 · 376 阅读 · 0 评论