1KOS开发
文章平均质量分 72
metaxen
厚积薄发
展开
-
第0章 无中生有
每个学计算机的同学都想写一个操作系统,每个学存储的同学都想开发一款磁盘阵列。每当看到“操作系统”四个字我就冲动,那是大脑皮层的强烈反应,无奈能力不济,绕了一大圈都没入门。今年5月刚好没啥正事,所以打算重整旗鼓,写一个非常简单的OS,想用来敲开“操作系统”这个大门。这个系列的文原创 2011-09-02 20:30:08 · 737 阅读 · 0 评论 -
第22章 系统时间(RTC编程)
取得当前系统时间的方法是直接访问RTC芯片。RTC芯片可以通过0x70和0x71端口直接访问。0x70是选址寄存器,0x71是数据寄存器。Addr Function==== =========================================**原创 2011-09-04 19:09:02 · 1038 阅读 · 0 评论 -
第23章 扩展任务管理模块
1、增加任务的HASH表,HASH值是任务的PID,这样通过任务的PID就能查找到任务的task_struct。2、增加任务挂起队列、死亡队列。运行态的任务在运行队列。被挂起的任务在挂起队列。被杀死的任务在死亡队列。3、增加任务挂起函数、任务唤醒函数、任务杀死函数原创 2011-09-04 19:10:42 · 675 阅读 · 0 评论 -
第8章 设置IDT(中断描述符表)
步骤:1、设置IDT表 可以参考《Inter微处理器 第8版》p5452、加载IDT表(只有开中断,它才开始作用)设置IDT和ISR,idt.c的源代码如下所示#include "io.h"#include "video.h"#in原创 2011-09-04 16:41:21 · 1265 阅读 · 0 评论 -
第14章 任务调度算法总结
CPU调度要达到的目的有:1、极小化平均响应时间2、极大化系统吞吐率3、系统各个功能部件的均处于繁忙状态4、公平机制原创 2011-09-04 18:42:51 · 402 阅读 · 0 评论 -
第15章 实现系统调用
在 1KOS中,我们使用中断向量0x80用于实现系统调用。0x80中断的ISR是trap gate而不是interrupt gate。我们需要在IDT表中的第0x80个中断向量中填入陷阱门(trap gate)描述符。而且设置描述符中DPL=0x3,这样用户态程序也能进行系统调用原创 2011-09-04 18:47:47 · 448 阅读 · 0 评论 -
第16章 测试任务调度算法
如何知道任务调度算法是正确的,可以创建800个(包括任务0)任务(当前任务优先级数目为32),任务执行下面的代码。 void task_func(void) { int pid = current->pid; int x,y,z;原创 2011-09-04 18:50:00 · 703 阅读 · 0 评论 -
第19章 管理系统与元数据
管理资源的系统都是管理系统,OS也是管理系统。描述资源的数据都是元数据1、如何设计元数据详细的元数据可以从多角度、多维度描述资源 可以更好的管理资源2、如何存取元数据元数据的格式 元数据存放的位置(分配和回收) 访问元数据(共享、竞争)原创 2011-09-04 18:58:42 · 485 阅读 · 0 评论 -
第24章 任务中定时器的设计与实现
目标:实现定时器功能,实现系统调用sleep。定时器的定义如下所示,系统使用定时器链表管理定时器。struct timer{ struct task_struct *task; struct timer *next, *prev; in原创 2011-09-04 19:18:16 · 799 阅读 · 0 评论 -
第25章 实现进程间通信(IPC)
目标:实现系统调用int send_msg(int pid, struct msg *msg);int receive_msg(struct msg *msg);消息结构如下所示:#define TASK_MSG_NR 10struct原创 2011-09-04 19:25:42 · 463 阅读 · 0 评论 -
第27章 1KOS版本说明
版本功能头文件源码文件1kos.01.tar.gz打印1kos booting....。把软驱A中的第二个扇区中的。程序复制到0x7e00上。程序跳转到0x7e00上。打印love weiwei...原创 2011-09-04 19:29:25 · 825 阅读 · 0 评论 -
第10章 时钟中断(PIT编程)
设置时钟中断就是给操作系统加上心跳。设置时钟中断就是是设置PIT(8253/54芯片),可参考 《IBM-PC汇编语言程序设计 第2版》p384。PIT有一个控制寄存器(0x43)和三个计数寄存器(0x40~0x42)。三个计数寄存器是16位的,有两种表示形式(BCD原创 2011-09-04 16:56:28 · 1817 阅读 · 0 评论 -
第21章 内存管理的设计与实现
内存管理的目标是提供:内核函数:void *sys_malloc(unsigned long size); void *sys_free(void *);系统调用函数 void * malloc(unsigned long size); void * free(voi原创 2011-09-04 19:06:45 · 820 阅读 · 0 评论 -
第20章 内联汇编
C/C+代码与汇编代码间有交接,双方要指定交接人。交接人之间传值,完成C/C++代码与汇编代码的沟通。内联汇编执行步骤:1、C/C++代码把值传给汇编代码(输入)2、内联汇编中的汇编语句3、汇编代码把值传回给C/C++代码(输出)可以参考《Develo原创 2011-09-04 18:59:38 · 477 阅读 · 0 评论 -
第18章 锁的使用
假如当前任务有锁,当时钟中断产生时,在任务调度上也需要这把锁,这就陷入死锁状态。解决办法是在task_stuct 上新增成员 lock_count,当前任务没有锁时(lock_count == 0)才可以调度。原创 2011-09-04 18:58:01 · 397 阅读 · 0 评论 -
第2章 从软驱中读取1个扇区到内存
决定存放程序的内存地址在MBR中,我们需要读取软驱上的程序到内存中。在什么内存上才存放这些程序呢? 1、不能复制到1M以上的内存,因为A20地址线还没打开,没进入保护模式,不能寻址到1M以上的内存。 2、不能复制到0x0上的内存,因为BIOS的中断向量在0x0上,而我原创 2011-09-04 15:59:12 · 1186 阅读 · 0 评论 -
第3章 从软驱上读取多个扇区到内存中
编写rd_kern汇编函数,用于从软驱上读取N个扇区到内存中输入参数是CX 扇区数SI 起始逻辑扇区ES:BX 内存地址#函数名:rd_kern#功能:读取软驱A上连续多个扇区#参数1: ES:BX 读取数据原创 2011-09-04 16:06:25 · 706 阅读 · 0 评论 -
第1章 打印启动信息
显示器I/O知识:显存地址是 0xb8000,屏幕是80*25,每个位置由两个字节决定。第一个字节决定所显示的字符,如0xb8000。第二个字节决定怎么显示字符(背景颜色,前景颜色),如0xb8001。汇编命令知识:cld: 方向标志置0,si和di 增1原创 2011-09-02 20:43:01 · 739 阅读 · 0 评论 -
第4章 进入保护模式(设置GDT全局描述符表)
进入保护模式的步骤是:1、关中断;2、打开A20地址线,使之能访问1M以上的内存;3、设置GDT; GDT知识可查看《Intel微处理器 第8版》p541 也可以查看 Intel开发手册4、加载GDT;5、进入保护模式,跳转到setup.sbo原创 2011-09-04 16:14:24 · 1641 阅读 · 0 评论 -
第5章 在保护模式中调用C语言函数
步骤:1、设置ds、es、fs、gs、ss选择符指向内核数据段;2、调用main函数(main.c文件中的main函数由C语言编写)。setup.s源代码如下所示 .text .global pm_mode .include "ker原创 2011-09-04 16:22:33 · 822 阅读 · 0 评论 -
第6章 打印函数
打印函数的原理写操作系统必须要有打印函数,这样才方便调试。对于所有的显示适配器,文本方式下显示字符的原理都是一样的,所不同的是各种适配器的视频显示存储器(又称显存)的起始地址不同;对MDA,显存的起始地址为B000:0000,对CGA、EGA、VGA是B800:0000。每个原创 2011-09-04 16:34:43 · 827 阅读 · 0 评论 -
第7章 初始化中断(8259A编程 PIC编程)
设置IRQ硬件中断(硬件中断包括时钟中断、键盘中断等),可参考《自己动手写操作系统 第1版》p112,《Inter微处理器 第8版》p364在8259中,需要把 IRQ0~IRQ7 映射到中断向量0x20~0x27,把 IRQ8~IRQ15 映射到中断向量0x28~0x2原创 2011-09-04 16:39:32 · 1064 阅读 · 0 评论 -
第9章 设置ISR(中断处理函数)
中断处理有三个阶段1、进入阶段:栈保存(带出错码的中断、不带出错码的中断)2、处理阶段:中断处理3、退出阶段:恢复栈80x86中有特权级的概念,不同的特权级有不同的栈,所以中断发生时要保存中断前的栈地址。查看intel使用手册原创 2011-09-04 16:47:15 · 2308 阅读 · 0 评论 -
第11章 任务调度
如何在Intel 386 CPU进行任务切换在Intel 386 CPU中支持硬件切换任务(有多种硬件切换方法,但是我们只用一种方法)。386 CPU 支持: 任务嵌套(我们不用) 支持4种特权级(我们只用两种,0和3)原创 2011-09-04 18:26:12 · 798 阅读 · 0 评论 -
第12章 中断嵌套问题、IOPL问题
问题:在80386中,中断是否可以嵌套?在80386中有两种事件(可以参考我写的《中断与异常》文档):1、中断事件(异步 interrupts)(一般是硬件中断)2、异常事件(同步 exceptions)在IDT中,有三种门描述符(通过设置原创 2011-09-04 18:39:18 · 813 阅读 · 0 评论 -
第13章 实现复杂度O(1)的调度算法
参考了linux 2.6内核的O(1)调度算法,在1KOS中实现了该调度算法。实现该算法的主要是靠:1、任务的双向链表(时间片轮转算法,而且双向链表适合增加删除,算法复杂度为O(1))2、优先级位图(跟优先级队列配合,算法复杂度为O(1))3、优先级队列(其实原创 2011-09-04 18:41:38 · 882 阅读 · 0 评论 -
第17章 互斥量的设计与实现
当所有的任务在同个单一地址空间下,使用共享资源时,必然涉及到共享资源的竞争。只有多个任务互斥地访问共享资源时才不会发生错误。只有提供互斥或信号量才能保证内核并发机制。任何互斥尝试必须基于一些基础硬件互斥机制。最常见的这种约束是某一时刻对内存的一次访问。(intel处理原创 2011-09-04 18:57:06 · 481 阅读 · 0 评论 -
Interrupts and Exceptions (中断事件与异常事件)
1 Interrupts事件与Exceptions事件的区别 Interrupts事件和Exceptions事件的共同点是改变当前CPU的控制流。 Interrupts:异步事件(跟当前指令无关)。事件是由CPU外部产生的。 Interrupts事件产生原创 2011-09-04 19:47:22 · 1518 阅读 · 0 评论