摘要:
我们的操作系统虽然已经实现了键盘驱动,但其功能仅限于在屏幕上打印输入的字符,任务并不能读取到这些字符。本章将要实现读取键盘输入的系统调用。 16.1 读取键盘输入的原理 想要让任务读取到键盘输入,最简单的方法是构造一个数组,当键盘中断发生时,将键盘输入的字符保存在这个数组中。然而,这个方案有一个无法 阅读全文
摘要:
到目前为止,我们的操作系统只能输出而不能输入。本章将要实现的是键盘驱动,其能让我们的操作系统接收键盘输入。 15.1 键盘驱动的原理 当按下键盘上的键时,发生了什么呢?原来,每当按下键盘上的键,键盘都会发起至少一次键盘中断;每当一个键弹起时,键盘又会发起至少一次键盘中断;如果一直按住一个键不松手,键 阅读全文
摘要:
文件系统是操作系统的一个重要模块。本章将要实现的是文件系统。 14.1 什么是文件系统 文件系统是操作系统用于管理硬盘,并使硬盘更易于使用的模块。 想要管理硬盘,就需要记录硬盘扇区的使用情况,可以使用位图实现这个功能。 想要让硬盘更易于使用,就需要一个非常关键的概念:文件。文件可以将底层的起始扇区号 阅读全文
摘要:
在前面的两章中,我们的操作系统均不支持任务回收,所以任务不能退出。本章将要实现的是任务回收功能。 13.1 任务回收的原理 如果一个任务位于任务队列中,其就会被运行。所以,如果一个任务的运行已经结束,它就应该从任务队列中删除。 仅仅将任务从任务队列中删除是不够的,这是因为任务还持有一些内存没有释放, 阅读全文
摘要:
特权级是保护模式的核心概念之一,但我们的操作系统一直没有引入这个概念。这是因为,特权级只有在3特权级任务存在时才有意义。本章将要实现的是3特权级任务的加载与任务切换。 12.1 特权级 12.1.1 特权级的功能 特权级(Privilege Level),是保护模式中用于限制任务权限的机制。特权级有 阅读全文
摘要:
上一章中,我们的操作系统已经支持内核共享,这为任务的加载和运行做好了准备。 本章将要实现的是0特权级任务的加载与任务切换。 11.1 任务切换的原理 11.1.1 协同式与抢占式任务切换 如果CPU上只运行着Kernel.c的main函数,那么情况非常简单,只需要不断执行下一条指令即可。然而,如果现 阅读全文
摘要:
一直以来,我们的操作系统在启动后,运行的都是Kernel.c中的main函数。只运行这一个函数是不够的,操作系统应当有能力加载并运行其他程序。 从本章开始,将使用四章的篇幅讨论操作系统如何加载并运行任务。这里的任务(Task)与进程(Process)是同义词,在操作系统领域中,任务这个词更为常用,请 阅读全文
摘要:
操作系统应当具备读写硬盘的能力。因此,本章将要实现的是硬盘驱动。硬盘驱动由两个函数构成:读硬盘函数与写硬盘函数。 9.1 读硬盘 想要读硬盘,就需要提供以下三个信息: 起始扇区号 读取的扇区数 数据存储的地址 需要注意的是:读取的扇区数只能是一个8字节的整数。 由于读硬盘需要使用大量的端口读写指令, 阅读全文
摘要:
计算机上的任何程序,包括操作系统自己,都需要使用内存。因此,操作系统需要实现内存管理系统,以进行内存的分配和回收。 在我们的操作系统中,内存管理系统由两部分组成:页分配器与页回收器。本章将实现这两个部分。 8.1 从虚拟地址到物理地址 回顾CPU对内存地址的转换过程: 使用段寄存器中的段选择子,在G 阅读全文
摘要:
7.1 什么是中断 中断是一种能够随时打断CPU正常工作的机制。这句话看着挺别扭的,CPU工作的好好的,为什么要"随时打断"它?这是因为,CPU需要为诸多外部设备提供服务,以键盘为例,当键盘上的键被按下时,CPU需要对此做出响应和处理,如果不能及时响应,我们会说:"电脑很卡";如果一直都不能响应,我 阅读全文