之前在读《APUE》的时候,更多的是从上层去了解如何使用Linux系统的API,那个时候就十分喜欢Linux的设计,觉得一切都很奇妙。
最近有些迷茫,不知道自己以后更加具体的技术方向在哪,所以最近广泛阅读了很多方面的书——C++方面,服务端网络编程方面,多线程方面,操作系统内核方面。
在linux内核方面,目前打算阅读两本书,《Linux内核设计与实现》就是其中一本,另一本是《深入理解linux内核》。
接下来我也会做一系列的读书笔记,目的有二:
1.通过写笔记让自己的阅读慢下来,因为要总结,所以免不了要反复阅读;
2.写笔记的过程是一个总结的过程,实际上就是把书读薄——以后再回过头来看,也只需要看看自己的笔记,而不需要从内容繁多的书中去找。
本系列读书笔记会按照书中的章节来。
第一章 Linux内核简介
Unix的历史
Unix是从贝尔实验室的一个失败的多用户操作系统Multics中涅盘而生的。
1969年,Thompson首先在一台无人问津的PDP-7型机上实现了这个全新的操作系统。
1971年,Unix被移植到PDP-11型机中。
1973年,整个Unix用C语言进行了重写。
1977年,贝尔实验室综合各种变体推出了Unix System Ⅲ;
1983年,AT&T推出了System V。
由于Unix系统设计简洁并且在发布时提供源代码,所以许多其他组织和团体都对它进行了进一步的开发。加州大学伯克利分校便是其中影响最大的一个,他们推出的变体叫Berkeley Software Distributions(BSD)。
伯克利的第一个Unix演化版是1977年推出的1BSD系统。1978年推出了2BSD系统,其中包含了csh,vi等应用软件。1979年推出3BSD系统,引入了虚拟内存。
Unix几个特点:
1.很简洁:仅仅提供几百个系统调用并且有一个非常明确的设计目的。
2.基本所有的东西都被当做文件对待,这种抽象使得对数据和对设备的操作都是通过一套相同的系统调用接口来进行的:open(),read(),write(),lseek()和close()。
3.Unix的内核和相关的系统工具软件是用C语言编写而成的——这使得它在各种硬件体系架构面前具有很强的移植能力。
4.Unix的进程创建非常迅速。
5.Unix提供了一套非常简单但又很稳定的进程间通信原语,快速简洁的进程创建过程使Unix的程序把目标放在一次执行保质保量地完成一个任务上,而简单稳定的进程间通信机制又可以保证这些单一目的的简单程序可以方便地组合在一起。正是由于这种策略和机制分离的设计理念,确保了Unix系统具备清晰的层次化结构。
追寻Linus足迹:Linux简介
1991年,Linus Torvalds为当时新推出的,使用Intel 80386微处理器的计算机开发了一款全新的操作系统,Linux由此诞生。
Linus热衷于使用Minix,一种教学用的廉价Unix,但是他不能轻易修改和发布该系统的源代码(由于Minix的许可证)。于是他决定开发自己的操作系统。由于Linux的许可证条款的约定,Linux迅速成为多人的合作开发项目。
Linux是类Unix系统,但它不是Unix。尽管Linux借鉴了Unix的许多设计并且实现了Unix的API,但是Linux没有像其他Unix变种一样直接使用Unix的源代码。
尽管Linus被认为是Linux之父,但开发工作实际是由一个结构松散的工作组协力完成的,任何人都可以开发内核,其内核是*(公开)软件,它使用GPL 2.0作为限制条款——你可以*地获取内核代码并随意修改它,但如果你希望发布你修改过的内核,你也得保证让得到你内核的人同时享有你曾经享受过的所有权利,当然,也包括全部的源代码。
操作系统和内核简介
通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序,和网络、进程间通信等系统服务程序共同组成。
内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设计的所有权限。这种系统态和被保护起来的内存空间,统称为内核空间。
相对的,应用程序在用户空间执行,它们只能看到允许它们使用的部分系统资源,且只能使用某些特定的系统功能,不能直接访问硬件,也不能访问内核划给别人的内存范围。
在系统中运行的应用程序通过系统调用来与内核通信,当一个应用程序执行一条系统调用,我们说内核正在代其执行。
内核还要管理系统的硬件设备,当硬件设备想和系统通信时,首先要发出一个异步的中断信号去打断处理器的执行,继而打断内核的执行。中断通常对应一个中断号,内核通过这个中断号查找相应的中断服务程序,并调用这个程序相应和处理中断。
中断服务程序不在进程上下文中执行,而是在一个与进程无关的、专门的中断上下文中执行。使用这样一个专门的执行环境,是为了保证中断服务程序能够在第一时间相应和处理中断请求,然后快速地退出。
每个处理器在任何指定时间点上的活动可概况为以下三者之一:
1.运行于用户空间,执行用户进程。
2.运行于内核空间,处于进程上下文,代表某个特定的进程执行。
3.运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。
注:当CPU空闲时,内核就运行一个空进程,处于进程上下文,但运行于内核空间。
Linux内核和传统Unix内核的比较
操作系统内核两大阵营:单内核和微内核。
单内核
整个内核都在一个大内核地址空间上运行。
优点:
1.简单。
2.高效:所有内核都在一个大的地址空间上,所以内核各个功能之间的调用和调用函数类似,几乎没有性能开销。
缺点:
一个功能的崩溃会导致整个内核无法使用。
微内核
内核按功能被划分成各个独立的过程。每个过程独立的运行在自己的地址空间上。
优点:
安全:内核的各种服务独立运行,一种服务挂了不会影响其他服务。
可换出:允许一个服务器为了另一个服务器而换出。
缺点:
内核各个服务之间的调用涉及进程间的通信,比较复杂且效率低。
Linux内核
Linux是一个单内核,不过,Linux汲取了微内核的精华:模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力。(体现了Linux实用至上的原则)
Linux与传统Unix系统之间的显著差异:
1.支持动态加载内核模块;
2.支持对称多处理(SMP)机制;
3.内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力;
4.内核不区分线程和其他的一般进程。对于内核来说,所有的进程都一样——只不过是其中的一些共享资源而已。
Linux内核版本
内核的版本号主要由四个数字组成。比如版本号:2.6.26.1 其中,
2 - 主版本号
6 - 从版本号或副版本号
26 - 修订版本号
1 - 稳定版本号
副版本号表示这个版本是稳定版(偶数)还是开发版(奇数),上面例子中的版本号是稳定版。
稳定的版本可用于企业级环境。
修订版本号的升级包括BUG修正,新的驱动以及新的特性的追加。
稳定版本号主要是一些关键性BUG的修改。