【一个操作系统的设计与实现】第26章 多处理器(下):应用处理器引导

9 月 1 日
阅读 3 分钟
176
当计算机启动时,不管其中有多少个CPU,都只有一个CPU会真正启动,这个CPU就称为引导处理器(Bootstrap Processor,BSP);而其他CPU会等待被BSP唤醒,这些CPU就称为应用处理器(Application Processor, AP)。

【一个操作系统的设计与实现】第25章 多处理器(上):多处理器同步原语

9 月 1 日
阅读 2 分钟
190
当计算机中存在不止一个CPU时,基于关中断的同步原语就失效了。这是因为每个CPU的中断是独立的,关闭一个CPU的中断并不会影响其他CPU。从本质上说,中断由rflags控制,但rflags在每个CPU中都有一个,因此,只有找到一个共享区域,才能实现多CPU间的同步原语。内存正是这样的共享区域,其可用于实现锁。

【一个操作系统的设计与实现】第24章 64位文件系统,键盘驱动与外壳程序

9 月 1 日
阅读 1 分钟
150
想要实现文件系统,就需要一个超级块和一个文件系统位图。在我们的操作系统中,超级块位于98号扇区,文件系统位图位于99号扇区,文件从100号扇区开始存放。

【一个操作系统的设计与实现】第23章 快速系统调用

8 月 31 日
阅读 3 分钟
192
系统调用是操作系统为3特权级任务提供服务的一种手段。在32位操作系统中,我们通过中断实现了系统调用。由于系统调用是一个使用非常频繁的机制,且中断也不是专门为系统调用设计的,因此,64位CPU提供了系统调用的专用机制:快速系统调用。

【一个操作系统的设计与实现】第22章 64位任务

8 月 31 日
阅读 3 分钟
186
如图所示,64位TSS的大小不变,还是104字节。64位CPU淘汰了硬件任务切换和数据段寄存器,因此,64位TSS的组成与32位TSS完全不同,其已不具备保存寄存器的功能,其中的大部分字节用于中断栈表(Interrupt Stack Table,IST),这个功能在我们的操作系统中没有使用。在我们的操作系统中,TSS的作用是取得0特权级栈,这与32...

【一个操作系统的设计与实现】第21章 高级可编程中断控制器

8 月 31 日
阅读 3 分钟
196
我们已经使用过型号为8259A的可编程中断控制器(Programmable Interrupt Controller,PIC)。在单CPU计算机中,中断的处理相对简单:所有的外设和CPU都连接在PIC上即可。然而,如果计算机中不止一个CPU,情况就会变得复杂起来。以双CPU为例:

【一个操作系统的设计与实现】第20章 加载64位内核,64位显卡驱动与内存管理系统

8 月 31 日
阅读 2 分钟
198
在64位模式下,由于内存地址变宽,ELF格式中的内存地址也要跟着变宽。这并不是一个麻烦的问题,因为ELF格式的整体结构没有发生变化,仍然由一个文件头,加上若干程序头表组成。

【一个操作系统的设计与实现】第19章 IA32-e模式

8 月 31 日
阅读 4 分钟
249
在32位操作系统中,我们使用的是平坦模型而非分段模型,从而,段描述符的段基址和段限长均成了摆设。在64位模式下,就连CPU也淘汰了分段模型,转而固定使用平坦模型。

【一个操作系统的设计与实现】第18章 欢迎回来

8 月 31 日
阅读 2 分钟
184
我们已经实现了一个运行在保护模式下的操作系统,然而,读者朋友也许不会满足:如今早已是多核CPU,64位操作系统的时代,而我们的操作系统仅仅是单核CPU,32位的。因此,从本章开始,我们将在32位单核操作系统的基础上,将其升级为一个64位多核操作系统。

【一个操作系统的设计与实现】第17章 系统交互

2023-12-02
阅读 2 分钟
329
操作系统最终是供用户使用的,所以其需要具备与用户交互的能力,交互方式可以是命令行,图形界面,甚至是触摸屏,语音,实体按钮等。本章将要实现的是系统交互。

【一个操作系统的设计与实现】第16章 键盘驱动(下)

2023-12-02
阅读 3 分钟
183
想要让任务读取到键盘输入,最简单的方法是构造一个数组,当键盘中断发生时,将键盘输入的字符保存在这个数组中。然而,这个方案有一个无法解决的问题:如果一个任务想要读取键盘输入,但此时数组是空的,该怎么办?

【一个操作系统的设计与实现】第15章 键盘驱动(上)

2023-12-02
阅读 3 分钟
676
当按下键盘上的键时,发生了什么呢?原来,每当按下键盘上的键,键盘都会发起至少一次键盘中断;每当一个键弹起时,键盘又会发起至少一次键盘中断;如果一直按住一个键不松手,键盘就会连续不断的发起键盘中断。

【一个操作系统的设计与实现】第14章 文件系统

2023-12-02
阅读 2 分钟
241
想要让硬盘更易于使用,就需要一个非常关键的概念:文件。文件可以将底层的起始扇区号、扇区数等信息用一个文件名代替,存储这些信息的数据结构被称为文件控制块(File Control Block,FCB)。使用文件系统时,可以从文件名出发,找到其对应的FCB,并从中取出起始扇区号、扇区数等信息,提供给更底层的函数使用。

【一个操作系统的设计与实现】第13章 任务(四):任务回收

2023-12-02
阅读 3 分钟
756
在前面的两章中,我们的操作系统均不支持任务回收,所以任务不能退出。本章将要实现的是任务回收功能。13.1 任务回收的原理如果一个任务位于任务队列中,其就会被运行。所以,如果一个任务的运行已经结束,它就应该从任务队列中删除。仅仅将任务从任务队列中删除是不够的,这是因为任务还持有一些内存没有释放,这包括以...

【一个操作系统的设计与实现】第12章 任务(三):3特权级任务

2023-12-02
阅读 8 分钟
282
特权级是保护模式的核心概念之一,但我们的操作系统一直没有引入这个概念。这是因为,特权级只有在3特权级任务存在时才有意义。本章将要实现的是3特权级任务的加载与任务切换。

【一个操作系统的设计与实现】第11章 任务(二):0特权级任务

2023-12-02
阅读 4 分钟
177
如果CPU上只运行着Kernel.c的main函数,那么情况非常简单,只需要不断执行下一条指令即可。然而,如果现在有不止一个任务需要运行,CPU就必须在这几个任务之间不断切换,使每个任务都能得到运行的机会。那么,CPU在何时进行任务切换?又怎么进行任务切换呢?

【一个操作系统的设计与实现】第10章 任务(一):共享内核

2023-12-02
阅读 2 分钟
368
一直以来,我们的操作系统在启动后,运行的都是Kernel.c中的main函数。只运行这一个函数是不够的,操作系统应当有能力加载并运行其他程序。

【一个操作系统的设计与实现】第9章 硬盘驱动

2023-12-02
阅读 1 分钟
195
操作系统应当具备读写硬盘的能力。因此,本章将要实现的是硬盘驱动。硬盘驱动由两个函数构成:读硬盘函数与写硬盘函数。9.1 读硬盘想要读硬盘,就需要提供以下三个信息:起始扇区号读取的扇区数数据存储的地址需要注意的是:读取的扇区数只能是一个8字节的整数。由于读硬盘需要使用大量的端口读写指令,所以,该函数使用...

【一个操作系统的设计与实现】第8章 内存管理系统

2023-12-02
阅读 4 分钟
289
计算机上的任何程序,包括操作系统自己,都需要使用内存。因此,操作系统需要实现内存管理系统,以进行内存的分配和回收。在我们的操作系统中,内存管理系统由两部分组成:页分配器与页回收器。本章将实现这两个部分。8.1 从虚拟地址到物理地址回顾CPU对内存地址的转换过程:使用段寄存器中的段选择子,在GDT中找到一个...

【一个操作系统的设计与实现】第7章 中断

2023-12-02
阅读 6 分钟
307
中断是一种能够随时打断CPU正常工作的机制。这句话看着挺别扭的,CPU工作的好好的,为什么要"随时打断"它?这是因为,CPU需要为诸多外部设备提供服务,以键盘为例,当键盘上的键被按下时,CPU需要对此做出响应和处理,如果不能及时响应,我们会说:"电脑很卡";如果一直都不能响应,我们会说:"电脑死机了"。由此可见中...

【一个操作系统的设计与实现】第6章 显卡驱动

2023-12-02
阅读 5 分钟
551
驱动这个词听起来很高大上,但实际上很简单,就是硬件的接口函数。在软件工程中,可以使用接口封装和简化设计,硬件也是一样。例如:想要读硬盘,需要很多指令设定好几个端口,然后等待硬盘就绪,最后才能读硬盘。这一套流程可以封装成一个接口函数,其接受三个参数:

【一个操作系统的设计与实现】第5章 加载内核

2023-12-02
阅读 3 分钟
263
一直以来,我们都在使用汇编语言对MBR编程,但对于操作系统这样的复杂程序来说,使用汇编语言是比较困难的。本章将实现操作系统内核的加载与进入。

【一个操作系统的设计与实现】第4章 分页模式

2023-12-02
阅读 5 分钟
273
这是一段内存,每格为1字节,阴影部分的内存被占用。此时,如果向内存中加载一个4字节的程序,显然是做不到的。然而,此时的空闲内存其实是够4字节的,纯粹是因为其不连续,导致了这样的结果。看来,问题的关键在于内存连续。如果有一种办法能让内存不连续,问题就解决了。

【一个操作系统的设计与实现】第3章 保护模式

2023-12-02
阅读 5 分钟
251
实模式下,内存的访问是没有任何限制的,任何程序都能访问和修改任何内存地址,这就导致了实模式下的程序,甚至操作系统自己,都可能自身难保。于是,自8086的下一代产品80286起,保护模式诞生了;进一步的,自80386起,32位保护模式诞生了。

【一个操作系统的设计与实现】第2章 主引导记录

2023-12-02
阅读 3 分钟
256
这是一个百废待兴的时刻,所有的硬件设备都刚启动,并没有做好准备,甚至连CPU自己都是。此时,就需要一些外力帮助CPU工作起来。具体来说,在CPU刚启动时,其CS:IP被硬件电路设定为f000:fff0。这个地址并非指向内存,而是指向主板的一个非易失性ROM,其中存放的代码被称为基本输入/输出系统(Basic Input Output System...

【一个操作系统的设计与实现】第1章 什么是操作系统

2023-11-30
阅读 2 分钟
237
有些读者可能会像曾经的笔者一样,认为操作系统是"一种图形界面";在学习了Linux操作系统后,认为操作系统也可以是"一种命令行"。而不同种类,不同版本的操作系统,则是"不同的图形界面",或是"不同的命令行语法"。