Chapter 1: Introduction to the Linux Kernel
本书为 《Linux Kernel Development 3rd Edition》的学习笔记
本章从 Unix 的发展历史开始, 介绍 Linux Kernel 和 Linux 操作系统, 要理解 Linux, 我们必须首先讨论 Unix 操作系统.
Unix 历史
Unix 起源于 Multics, Multics 是由 Bell 实验室参与的失败的多用户操作系统, 这个项目结束后, Bell 实验室的计算机科学家们发现, 他们没有一个能够方便稳定的操作系统, 因此在 1969 年夏天, Bell 实验室的程序员们构建了一款操作系统, 最终被称为 Unix. 1971 年, Unix 被移植到 PDP-11 上, 在 1973 年, Unix 被使用 C 语言重写, 被使用 C 语言重写, 是 Unix 发展史上重要的一步. 第一个被广泛使用的 Unix 系统是 Unix 第 6 版, 即 Unix V6.
其他公司将 Unix 移植到其他新机器上, 同时增加了其他许多增强功能, 导致了 Unix 的几种变体. 1977 年 Bell 实验室发布了一款集合了这些变体的系统版本, 叫做 Unix System III; 1982 年, AT&T 公司发布了 System V.
Unix 设计简洁, 并且在发布时同时包括了源代码, 所以极大的促进了后续的发展. 最有影响力的是 University of California at Berkeley 的贡献, 其 Unix 变体叫做 Berkeley Software Distributions (BSD).
- 其首个版本是于 1977 年所发布的 1BSD, 基于 Bell 实验室版本的 Unix 增加了一些补丁和额外的软件.
- 1978 年发布了 2BSD 版本, 添加了
csh
和vi
组件, 这两项组件一直使用到了现在. - 1979 年发布了 3BSD 版本, 这是 Berkeley Unix 的第一个独立版本, 添加了 virtual memory 的功能.
- 之后发布了一系列 4BSD 版本, 包括 4.0BSD, 4.1BSD, 4.2BSD 以及 4.3BSD. 这些版本中添加了 job control, demand paging 以及 TCP/IP.
- 1994 年, 发布了 4.4 Berkeley Unix 版本, 重写了 VM 子系统.
因为 BSD 的宽容的许可协议, 才有了后来的 Darwin, FreeBSD, NetBSD 以及 OpenBSD 系统.
20 世纪 80 年代到 90 年代, 许多的工作站以及服务器公司开发了自己的商业版 Unix 系统. 这些系统基于 AT&T 或者 Berkeley 的发行版. 这些系统包括: Digital's Tru64, Hewlett Packard's HP-UX, IBM's AIX, Sequent's DYNIX/ptx, SGI's IRIX, 以及 Sun 公司的 Solaris & SunOS.
经过多年的发展, Unix 有以下的优点:
- Unix 非常简单, Unix 只有几百个系统调用, 并且设计上非常直白, 基础.
- Everything is a file.
- Unix 内核以及相关的系统工具都使用 C 语言编写, 使得其可移植性很强.
- Unix 快速的进程创建时间, 使用唯一的
fork()
系统调用. - 使用简洁但是强壮的进程间通信 (interprocess communication, IPC).
现如今, Unix 是一个现代的操作系统, 拥有先进的多任务 (multitasking), 多线程 (multithreading), 虚拟内存 (virtual memory), 需求分页 (demand paging), 共享库 (shared libraries), 需求加载 (demand loading) 以及 TCP/IP 网络等功能.
Unix 成功与其简洁性及其设计的优雅, 这得益于其最初的开发者 Dennis Ritchie, Ken Thompson 等人所作的决定.
接下来, 就有了 Linux
1991 年, Linus Torvalds 开发了第一个版本的 Linux, 基于 Intel 80386 处理器. 当时 Linus 是 University of Helsinki 的学生.
因为其开源性, 其在网上发布之后, 迅速吸引了一大批用户和开发者, 促进了其迅速发展.
Linux 的最有趣的特性是其非商业项目, 其是由网上的开发者们共同开发的. Linux 内核是免费和开源的, Linux 使用 GNU General Public License (GPL) version 2.0 许可协议.
Linux 系统最基础的包括 kernel, C library, toolchain 以及基本的系统工具.
操作系统和内核
因为不断增长的特性和一些现代操作系统不完善的设计, 很难精准的对操作系统下一个通用的定义. 在书中提到的操作系统 (operating system), 顺从包括 kernel, device drivers, boot loader, command shell 或其他的 user interface, basic file system utilities. 系统 (system) 为包括应用程序在内的整个系统.
本书主要研究的是系统内核, 内核是一个最基础的软件系统, 为系统的其他部分提供最基础的服务, 包括:
硬件管理 (manages hardware)
系统资源调度 (distributes system resources).
内核的传统组成部分包括:
- 终端管理器 (interrupt handlers)
- 用来管理进程地址空间 (manage process address spaces)的内存管理系统 (a memory management system)
- 网络服务 (networking service)
- 进程间通信 (IPC, interprocess communication).
现代操作系统拥有受保护的内存管理单元, 内核通常运行于一个高于普通用户应用程序的系统状态之中, 使得内核处于一个受保护的内存空间 (protected memory space), 并且内核可以完全的操作硬件 (full access to the hardware), 这个系统状态嗯哼内存空间通常被统称为内核空间 (kernel-space); 与之相对的是, 用户的应用程序运行在用户空间 (user-space) 中.
应用与内核通过系统调用 (system calls) 完成通信. 应用调用库函数, 例如 C 程序库, 然后 C 程序库去调用系统调用接口 (system call interface), 来向内核下达指令, 来完成各种行为. 当一个应用执行系统调用时, 我们称内核代表应用完成了一些操作, 内核运行在进程上下文中 (process context), 进一步的, 我们称应用在内核空间执行了系统调用 (executing a system call in kernel-space). 这是一个应用程序完成任务同内核基本的交互形式.
内核同时管理系统硬件. 几乎所有的架构, 包括 Linux 所支持的所有架构都提供了中断 (interrupt)的概念. 当硬件想要同系统进行通信时, 它发出一个中断, 立即中断处理器, 进而中断内核. 每个中断通过一个数字来区分, 内核根据不同的数字来执行不同的中断处理程序 (interrupt handller) 来响应中断. 例如, 当你在键盘上敲击时, 键盘控制器发起中断, 中断处理程序执行键盘数据并告知键盘控制器可以接收更多数据. 如果需要同步执行时, 内核可以屏蔽中断, 可以关闭所有中断, 也可以关闭部分中断. 在包括 Linux 的许多操作系统中, 中断处理程序并不运行在进程上下文中, 而是运行在中断上下文 (interrupt context) 中, 该上下文不与任何进程相关. 这个特殊的上下文仅仅用来快速的响应中断, 然后退出.
在 Linux 中, 处理器在某一时刻, 将工作在以下三个状态中的一个:
- 用户空间, 在进程中执行用户代码.
- 内核空间, 在进程上下文中, 代表一些进程来执行一些操作.
- 内核空间, 在终端上下文中, 不和任何一个进程相关, 执行中断.
Linux 内核版本
Linux 内核版本分为四部分:
- 主版本号
- 小版本号
- 修改版本号
- 稳定版本号