【奔跑吧!Linux 内核(第二版)】第1章:Linux 系统基础知识
笨叔 陈悦. 奔跑吧 Linux 内核(第2版) [M]. 北京: 人民邮电出版社, 2020.
文章目录
- Linux 系统的发展历史
- Linux 发行版
- Red Hat Linux
- Debian Linux
- SuSE Linux
- 优麒麟 Linux
- Linux 内核介绍
- 宏内核和微内核
- Linux 内核概貌
Linux 系统的发展历史
Linux 系统诞生于 1991 年 10 月 5 日,它的产生和开源运动有着密切的关系。
- 1983 年,Richard Stallman 发起 GNU(GUN’s Not UNIX)计划,他是美国自由软件的精神领袖,也是 GNU 计划和自由软件基金会的创立者,到了 1991 年,根据该计划已经完成了 Emacs 和 GCC 编译器等工具,但是唯独没有完成操作系统和和内核。GNU 在 1990 年发布了一个名为 Hurb 的内核开发计划,不过开发过程不顺利,后来逐步被 Linux 内核所替代。
- 1991 年,Linus Torvalds 在一台 386 计算机上学习 Minix 操作系统,并动手实现了一个新的操作系统,然后在 comp.os.minix 新闻组上发布了第一个版本的 Linux 内核。
- 1994 年,采用 GPL(General Public License)协议的 Linux 1.0 正式发布。GPL 协议最初由 Richard Stallman 撰写,是一个广泛使用的开源软件许可协议。
- 1995 年,Bob Young 创办了 Red Hat 公司,以 GNU/Linux 为核心,把当时大部分的开源软件打包成发行版,这就是 Red Hat Linux 发行版。
…
Linux 发行版
Linux 最早的应用就是个人计算机操作系统,也是我们常说的 Linux 发行版。
Red Hat Linux
Red Hat Linux 不是第一个制作 Linux 发行版的厂商,但它是在商业和技术上做得最好的 Linux 厂商。从 Red Hat 9.0 版本发布后,Red Hat 公司不再发行个人计算机的桌面 Linux 发行版,而是转向利润更高、发展前景更好的服务器版本开发上,也就是后来的 Red Hat Enterprise Linux(Red Hat 企业版 Linux,RHEL),原来的 Red Hat Linux 个人发行版和 Fedora 社区合并,成为 Fedora Linux 发行版。
1. Fedora Core
Fedora Core 发行版是 Red Hat 公司的新技术测试平台,很多新的技术首先会应用到 Fedore Core 中。经过性能测试才会加入 Red Hat 的 RHEL 版本中。Fedora Core 面向桌面应用,所以 Fedore Core 会提供最新的软件包。Fedore Core 由 Fedora Project 社区开发。
2. RHEL
面向服务器应用的 Linux 发行版,注重性能、稳定性和服务器端软件的支持。
3. CentOS Linux
CentOS 全称为 Community Enterprise Operating System,它根据 RHEL 的源代码重新编译而成。除此之外,CentOS 和 RHEL 的另一个不同之处是 CentOS 不包含封闭源代码的软件。因此,CentOS 可以免费使用,并由社区主导。
Debian Linux
因为 Debian 项目以 Linux 内核为主,所以 Debian 一般指的是 Debian GNU/Linux。Debian 能风靡全球的主要原因在于其特有的 apt-get/dpkg 软件包管理工具,该工具被誉为所有 Linux 软件包管理工具中最强大、最好用的一个。
目前有很多 Linux 发行版基于 Debian,如最流行的 Ubuntu Linux。
SuSE Linux
来自德国。
优麒麟 Linux
诞生于 2013 年,是由中国国防科技大学联合 Ubuntu、CSIP 开发的开源桌面 Linux 发行版,是 Ubuntu 的官方衍生版本。
Linux 内核介绍
宏内核和微内核
宏内核是指所有的内核代码都被编译成二进制文件,所有的内核代码都运行在一个大的内核地址空间里,内核代码可以直接访问和调用,效率高并且性能好。宏内核架构的优点是设计简洁且性能较好。
微内核是指把操作系统分成多个独立的功能模块,每个功能模块之间的访问需要通过消息来完成,因此效率相对较低。微内核架构的优势明显,比如稳定性和实时性等。微内核架构最大的问题就是高度模块化带来的交互的冗余和效率的损耗。
宏内核和微内核在系统实时性方面的设计差异
Linux 内核支持动态加载内核模块,模块是被编译成的目标文件,并且可以在运行时的内核中动态加载和卸载。和微内核实现的模块化不一样,它们不是作为独立模块执行的,而是和静态编译的内核函数一样,运行在内核态中。
Linux 内核概貌
1. 系统调用层
Linux 内核为内核态和用户态之间的切换设置了软件抽象层,叫做系统调用层,其实每个处理器的架构设计中都提供了一些特殊的指令来实现内核态和用户态之间的切换。
系统调用层最大的目的是让用户进程看不到真实的硬件信息。
用户进程大部分时间运行在用户态,当需要向内核请求服务时,它会调用系统提供的接口进入内核态。
2. arch 抽象层
Linux 内核支持多种架构,Linux 内核为不同架构的实现做了很好的抽象和隔离,也提供了统一的接口来实现。比如,在内存管理方面,Linux 内核把和架构相关的代码存放在 arch/xx/mm 目录里,把和架构不相干的代码都存放在 mm 目录里,实现了分层。
3. 进程管理
Linux 内核并没有严格区分进程和线程,而经常使用 task_struct 数据结构来描述。在 Linux 内核中,调度器的发展经历了好几代,从很早的 O(n) 调度器到 Linux 2.6 内核中的 O(1) 调度器,再到现在的完全公平调度器(CFS)算法。
目前比较热门的话题是关于性能和功耗的优化,比如 ARM 阵营提出了大小核架构,至今在 Linux 内核中还没有体现。因此,诸如绿色节能调度器(EAS)这样的调度算法是研究热点。
4. 内存管理
内存管理是 Linux 内核中最复杂的模块,涉及物理内存的管理和虚拟内存的管理。在一些小型嵌入式 RTOS 中,内存管理不涉及虚拟内存管理,比较简单和简洁。
在 Linux 内核中,关于虚拟内存的模块由反向映射、页面回收、内核同页合并、mmap、缺页中断、共享内存、进程虚拟地址空间管理等。
物理内存的管理也比较复杂,页面分配器是核心部件,它需要考虑当系统内存紧张时,如何回收页面和继续分配物理内存。其他比较重要的模块有交换分区管理、页面回收和 OOM (Out Of Memory) Killer 等。
5. 中断管理
中断管理包含处理器的异常处理和中断处理。
Linux 内核在中断管理方面有上半部和下半部之分。上半部是在关闭中断的情况下执行的,因此处理时间要求短、平、快;而下半部是在开启中断的情况下执行的,很多对执行时间要求不高的操作可以放到下半部来执行。Linux 内核为下半部提供了多种机制,如软中断、tasklet 和工作队列等。
6. 设备管理
Linux 内核的设备管理是一个很广泛的概念,包含的内容很多,如 ACPI、设备树、设备模型 kobject、设备总线(如 PCI 总线)、字符设备驱动、块设备驱动、网络设备驱动等。
7. 文件系统
为了支持各种各样的文件系统,Linux 抽象出名为虚拟文件系统层的软件层,这样 Linux 内核就可以很方便地集成多种文件系统。