操作系统

操作系统本质上是一个程序,由很多个源文件构成,需要编译连接成操作系统,操作系统的作用是管理计算机硬件,给应用程序提供一个运行环境。

重要概念

  1. 分时:由于CPU只有一个(当时没有多核心CPU),可以使所有进程轮流执行一个很短的时间,使用户觉得自己的程序一直在执行。为了实现此功能,操作系统必须具有调度进程,管理进程的功能,此外CPU必须定时的执行操作系统的调度功能。进程调度是内核最重要的功能。
  2. 中断:CPU在收到硬件(比如时钟,触控屏触摸,鼠标点击)的通知时会暂停执行当前的程序, 跳转到对应的中断处理程序上,而这个程序是内核的一部分。执行部分指令也会产生中断,根据产生的原因又分为异常(程序遇到问题不能继续执行)和陷阱(程序主动的发起)。中断处理程序的入口,存储在被称为中断向量表的数据结构中。管理硬件资源和异常也是内核很重要的功能。
  3. 内存保护:CPU执行的指令,读取的数据都来自内存,是所有硬件资源中最重要的。为了“同时”运行多个程序,同时阻止恶意或者故障的程序读取、修改其他进程的内存,CPU和操作系统具有限制内存访问的功能。为了实现这一点,CPU提供了虚拟内存的功能,所有指令只能访问虚拟的内存地址,由CPU的内存管理单元(MMU)将其转换为实际的内存地址,操作系统需要管理一种叫页表的数据结构,记录了映射规则和读、写、执行的权限。所有进程都有自己独有的页表,其中只包含此进程能访问的内存地址,访问不存在的地址时就会报错(x86上即通用保护异常).

Linux内核——概述 - 图1
试图写入不能写的地址,Windows就直接关闭了此程序
4. 特权级与系统调用:许多指令,比如设置页表或者中断向量表的地址,修改CPU的工作模式,都属于特权指令,普通程序禁止执行, CPU使用特权级(又称RING或者异常级别)表示当前正在执行的进程的权限.低权限的程序执行高权限的指令或者访问高权限的内存会触发异常.
Linux内核——概述 - 图2

核心功能

内存管理

操作系统负责管控所有的内存,所有的应用程序需要使用到内存时都要向操作系统去申请和注册,由操作系统的内存管理模块来分配内存给应用程序。

进程调度

操作系统下支持多个应用程序同时并行运行,实际上在单核CPU上是不能并行的,操作系统提供了分时复用机制,操作系统的进程调度模块负责在各个进程之间进行切换

硬件设备管理

操作系统操控各个计算机硬件设备,应用程序不用关心硬件的具体细节。操作系统的硬件管理模块就是驱动模块

文件系统

文件系统是管理存储设备的一种方式,存储设备是有很多扇区组成的,每个扇区由512/1024/2048/4096字节,存储设备要以扇区进行读写。如果没有文件系统程序需要自己去读写扇区,就得记录哪个文件在哪个扇区,有了操作系统之后我们不要关注扇区,只需要知道文件系统中的目录和文件名

宏内核&微内核

宏内核:简单来说,就是把很多东西都集成进内核,例如linux内核,除了最基本的进程、线程管理、内存管理外,文件系统,驱动,网络协议等等都在内核里面。优点是效率高。缺点是稳定性差,开发过程中的bug经常会导致整个系统挂掉。做驱动开发的应该经常有按电源键强行关机的经历。
微内核:内核中只有最基本的调度、内存管理。驱动、文件系统等都是用户态的守护进程去实现的。优点是超级稳定,驱动等的错误只会导致相应进程死掉,不会导致整个系统都崩溃,做驱动开发时,发现错误,只需要kill掉进程,修正后重启进程就行了,比较方便。缺点是效率低。典型代表QNX,QNX的文件系统是跑在用户态的进程,称为resmgr的东西,是订阅发布机制,文件系统的错误只会导致这个守护进程挂掉。不过数据吞吐量就比较不乐观了。

Linux内核

内核是操作系统系统内核的简称,内核负责操作系统的核心功能,内核不包括应用程序,所以只要内核普通用户是无法使用的。操作系统是把内核和一些常用的 应用程序打包在一起提供给普通用户,这就是操作系统的发行版本。
Linux 官方网站https://www.kernel.org
Linux内核Git下载地址:https://github.com/torvalds/linux
Linux0.11 内核https://github.com/loveveryday/linux0.11

结构

图片.png
https://linux.cn/article-8290-1.html
image.png

源码结构

image.png

(1)arch。arch是architecture的缩写,意思是架构。arch目录下是好多个不同架构的CPU的子目录,譬如arm这种cpu的所有文件都在arch/arm目录下,X86的CPU的所有文件都在arch/x86目录下。
(2)block。英文是块的意思,在linux中block表示块设备(以块(多个字节组成的整体,类似于扇区)为单位来整体访问),譬如说SD卡、iNand、Nand、硬盘等都是块设备。你几乎可以认为块设备就是存储设备。block目录下放的是一些linux存储体系中关于块设备管理的代码。
(3)crypto。英文意思是加密。这个目录下放了一些各种常见的加密算法的C语言代码实现。譬如crc32、md5、sha1等。
(4)Documentation。里面放了一些文档。
(5)drivers。驱动目录,里面分门别类的列出了linux内核支持的所有硬件设备的驱动源代码。
(6)firmware。固件。什么是固件?固件其实是软件,不过这个软件是固话到IC里面运行的叫固件。就像S5PV210里的iROM代码。
(7)fs。fs就是file system,文件系统,里面列出了linux支持的各种文件系统的实现。
(8)include。头文件目录,公共的(各种CPU架构共用的)头文件都在这里。每种CPU架构特有的一些头文件在arch/arm/include目录及其子目录下。
(9)init。init是初始化的意思,这个目录下的代码就是linux内核启动时初始化内核的代码。
(10)ipc。ipc就是inter process commuication,进程间通信,里面都是linux支持的IPC的代码实现。
(11)kernel。kernel就是内核,就是linux内核,所以这个文件夹下放的就是内核本身需要的一些代码文件。
(12)lib。lib是库的意思,这里面都是一些公用的有用的库函数,注意这里的库函数和C语言的库函数不一样的。在内核编程中是不能用C语言标准库函数,这里的lib目录下的库函数就是用来替代那些标准库函数的。譬如在内核中要把字符串转成数字用atoi,但是内核编程中只能用lib目录下的atoi函数,不能用标准C语言库中的atoi。譬如在内核中要打印信息时不能用printf,而要用printk,这个个目录下的代码就是linux内核启动时初始化内核的代码。
(10)ipc。ipc就是inter process commuication,进程间通信,里面都是linux支持的IPC的代码实现。
(11)kernel。kernel就是内核,就是linux内核,所以这个文件夹下放的就是内核本身需要的一些代码文件。
(12)lib。lib是库的意思,这里面都是一些公用的有用的库函数,注意这里的库函数和C语言的库函数不一样的。在内核编程中是不能用C语言标准库函数,这里的lib目录下的库函数就是用来替代那些标准库函数的。譬如在内核中要把字符串转成数字用atoi,但是内核编程中只能用lib目录下的atoi函数,不能用标准C语言库中的atoi。譬如在内核中要打印信息时不能用printf,而要用printk,这个用工具
(19)usr。目录下是initramfs相关的,和linux内核的启动有关,暂时不用去管。
(20)virt。内核虚拟机相关的,暂时不用管。

查看内核版本

  1. name -r
  2. 4.15.0-54-generic

调试工具

https://www.qemu.org/
https://www.cnblogs.com/int80/p/10340282.html

参考文章

什么是微内核https://www.zhihu.com/question/339638625/answer/784544135
为什么华为鸿蒙OS要采用微内核技术,微内核操作系统的前世今身
https://linuxtools-rst.readthedocs.io/zh_CN/latest/index.html