暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么移动怎来的 思考过程. 现在忘掉作者的代码思路,如果是我们自己写代码,鼠标指针应该怎么样才能动起来呢? 我的思路: 其实让鼠标指针动起来真的非常简单,只需要改变下面函数中的mx,my变量,也就是鼠标的position变量,鼠标指针就会移动了.但是在移动前一定要把原来鼠标指针出现的位置填充为背景 色,…
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写这个笔记了,因为开学了,还要学习课业上的压力,转博了压力山大啊. 这一天的课程最难的我感觉是后面的memory free的部分,这一部分有很多已经没有接触到的东西,所以感觉比较难. 内存的管理在任何os中都是一个重要的问题. 还是按照作者的书本上第九天的顺序的来做笔记吧: 1:整理源文件部分,这一部…
harib16a: 这一部分,我们在系统中实现读取文件内容的命令type.在windows中,输入“type 文件名”,在Linux中,输入“cat 文件名”都可以显示文件的内容.我们先来看看如何读取文件本身的内容.这一节的前面部分,笔者花了大量篇幅去寻找文件内容在内存中的位置得到了以下规律: 1.clustno 表示文件从哪个扇区开始放: HARIBOTE.SYS 02 00 -> clustno = 0x0002 :0x004200        IPL10.NAS 39 00 -> cl…
harib09a: 定时器:(Timer)每隔一段时间,会向CPU发送一个中断.这样CPU不用记住每一条指令的执行时间.没有定时器很多指令CPU都很难执行.例如HLT指令,这个指令的执行时间不是个固定值,没有定时器,CPU就不能执行这个指令 -PIT-: 可编程的间隔型定时器(Programmable Interval Timer )通过设定PIT,可以让定时器每隔一定时间就产生一次中断.PIT和PIC都被集成在别的芯片里了,连接着IRQ的0号中断,IRQ0的中断变更周期是通过寄存器AL的值来设…
harib06a: 在昨天的最后一部分,我们已经变成了32位的模式,目的就是希望能够使用电脑的全部内存. 虽然鼠标的显示处理有一些叠加问题,不过笔者为了不让我们感到腻烦,先带我们折腾一下内存 这里笔者有把bootpack.c文件做了整理: 我们可以看到,把不同的函数有封装到了不同的源文件中.harib06b: 折腾了这么长时间的鼠标,大家都累了!我们来折腾一下内存吧! 笔者首先给我们科普了一点先验知识: 1.CPU每次访问内存都要将访问的地址和内容写入到CATCH中(写数据也是一样的) 2.观察…
//bootpack.c 完整代码 #include <stdio.h> void io_hlt(void); void io_cli(void); void io_out8(int port, int data); int io_load_eflags(void); void io_store_eflags(int eflags); void init_palette(void); void set_palette(int start, int end, unsigned char *rgb…
harib00a: 添加的部分从P46开始,制作IPL准备开始从磁盘装载程序了 笔者讲解了软盘的驱动的构造,以及汇编语言读取软盘的方法 MOV AX,0x0820 MOV ES,AX ; 柱面0 ; 磁头0 ; 扇区2 MOV AH,0x02 ; AH=0x02 : 读盘 ; 1个扇区 MOV DL,0x00 ; A驱动器 INT 0x13 ; 调用磁盘BIOS harib00b: 这一部的目的主要是试错 P51 软盘是很不可靠的存储设备,有时候会发生不能读取数据的情况 改良后的程序就是这一部分…
harib14a: 接着上一天的内容,我们来思考一个问题:当所有的LEVEL中都没有任务的时候怎么办?采用前面定时器链表中加入“哨兵”的思路,我们加入一个idle任务,去执行HLT.接下来我们只需要将这个闲置任务idle放在最下层的LEVEL就行了.之后修改一下HariMain测试一下结果. void task_idle(void)//限制任务idle { for (;;) { io_hlt();//让CPU不断的HLT等待中断的到来 } } struct TASK *task_init(str…
harib15a: 到这里为止,我们已经能实现窗口的切换了.我们发现所有的窗口都有光标闪烁,而我们只希望可以接受输入的窗口有光标闪烁.这里我们先来修改任务A中的光标闪烁,当按下TAB时,如果让A不现实光标,我们让cursor_c为负值. void HariMain(void) { //...... for (;;) { //..... <= i && i <= ) { /* 键盘数据 */ //..... + 0x0f) { /* Tab键 */ ) { //向CMD任务窗口输…
harib13a: 今天我们要继续折腾多任务,任务的高效管理是操作系统的一个重要的任务.在今天,我们将为系统创建更加完善的任务管理系统,其中包括优先级,任务等级等. 1.任务管理结构体 #define MAX_TASKS 1000 /* 最大任务数量 */ #define TASK_GDT0 3 /* 任务块在GDT中的初始位置:从GDT的3号段开始 */ struct TSS32 {//任务状态段,这个在前面已经提到过,这里再介绍一下 // 26个int成员,104字节 int backlin…