第一章 Linux内核简介
1.1 Unix的历史
- Unix很简洁,仅仅提供几百个系统调用而且有一个很是明确的设计目的。
- 在Unix中,全部东西都被当作文件,这种抽象使对数据和对设备的操做是经过一套相同的系统调用接口来进行的:open()、read()、write()、lseek()、close()。
- Unix的内核和相关的系统工具软件都是使用C语言编写而成,使其在各类硬件体系架构面前都具有使人惊异的移植能力。
- Unix进程建立很是迅速,而且有一个独特的fork()系统调用。
- Unix提供了一套很是简单但又很稳定的进程间通讯元语,一次执行保质保量地完成一个任务。简单稳定的进程间通讯元语把单一目的的程序方便地组合在一块儿,这种策略和机制分离的理念确保了Unix系统具有清晰的层次化结构。
1.2 Linux简介
- Linux是类Unix系统,但不是Unix。Linux没有直接使用Unix的源代码,但它没有抛弃Unix的设计目标而且保证了应用程序编程接口的一致。
- Linux内核是自由公开软件。
- Linux用途普遍,Linux系统的基础是内核、C库、工具集和系统的基本工具。通常状况下Linux这个词汇主要仍是指内核。
1.3 操做系统和内核简介
- 操做系统的精肯定义并无一个统一标准。操做系统是整个系统中负责完成最基本功能和系统管理的部分,包括内核、设备驱动程序、启动引导程序、命令行Shell或者其余种类的用户界面、基本的文件管理工具和系统工具。
- 内核才是操做系统的内在核心,有时候被称做管理者或者是操做系统的核心。一般一个内核由负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理进程地址空间的内存管理程序和网络、进程之间通讯等系统服务程序共同组成。
- 系统态:拥有受保护的内存空间和访问硬件设备的全部权限。这种系统态和被保护起来的内存空间,称为内核空间。
- 用户态:执行普通用户程序时,系统以用户态进入用户空间执行。(应用程序在用户空间执行,只能看到容许它们使用的部分系统资源,并只使用某些特定的系统功能,不能直接访问系统硬件,也不能访问其余的内核划给别人的内存范围)
- 系统中运行的应用程序经过系统调用来与内核通讯。
- 中断机制:当硬件设备想和系统通讯的时候,首先发出一个异步的中断信号打断处理器的执行,继而打断内核的执行。中断一般对应一个中断号,内核经过中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。
- 咱们能够将每一个处理器在任何指定时间点上的活动必然归纳为如下三者之一:
- 运行于用户空间,执行用户进程
- 运行于内核空间,处于进程上下文,表明某个特定的进程执行
- 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断
1.4 Linux内核和传统Unix内核的比较
1.操做系统可分为两大阵营:单内核、微内核。第三大阵营是外内核(主要用于科研系统)。linux
2.Linux是一个单内核,至今Linux是模块化的、多线程的以及内核自己可调度的操做系统。git
3.Linux内核和传统Unix内核的差别:编程
- Linux支持动态加载内核模块。
- Linux支持对称多处理(SMP)机制,传统的Unix不支持。
- Linux内核能够抢占,容许内核运行的任务有优先执行的能力。
- Linux内核不区分线程和其余的通常进程。
- Linux提供具备设备类的面向对象的设备模型、热插拔事件,以及用户空间的设备文件系统。
- Linux忽略了一些被认为是设计的很拙劣的Unix特性和难以实现的过期标准。
- Linux体现了自由的精髓。
1.5 Linux内核版本
1.Linux内核有两种:稳定的(具备工业级的强度,能够普遍应用和部署)、处于开发中的。网络
2.Linux命名机制:多线程

若是版本号是偶数,则内核是稳定版;若是是奇数,内核就是开发版。架构
第二章 从内核出发
2.1 获取内核源码
-
使用Git并发
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
git pull # 更新分支到Linux的最新分支
-
安装内核源代码(若是使用git获取就不须要下载压缩文件。)异步
tar xvjf linux-x.y.z.tar.bz2
或者
tar xvzf linux-x.y.z.tar.gz
- 注意:内核源代码通常安装在/usr/src/linux目录下,即便在安装新内核时,/usr/src/linux目录应当保证原封不动。
-
使用补丁模块化
patch -p1 < ../patch-x.y.z
2.2 内核源码树

2.3 编译内核
2.3.1 配置内核
1.配置项函数
- 二选一:yes 或者 no
- 三选一:yes 或者 no 或者 module(module意味着该配置被选定了,以模块生成。驱动程序通常都用三选一的配置项)
字符页面的命令行工具:
make config
图形界面工具:
make menuconfig
基于默认配置为体系结构建立一个配置:
make defconfig
验证和更新配置:
make oldconfig
2.3.2 减小编译的垃圾信息
编译内核:
make
重定向到该文件中:
make > .. /detritus
把无用的输出信息重定向到永无返回值的黑洞dev/null中:
make > /dev/null
2.3.3 安装新内核
将全部已编译的模块安装到正确的主目录/lib/modules下
make modules_install
2.4 内核开发的特色
1.内核开发时既不能访问C库也不能访问标准的C头文件, include/linux文件夹中包含了所需的内核头文件。
2.内核编程时必须使用GNU C。
-
内联(inline)函数: 函数会在所调用的位置上展开。 定义时,须要使用static做为关键字,用inline限定它。 内联函数必须在使用以前就定义好,通常在头文件中定义。 内核中优先使用内联函数而不是宏。
-
内联汇编: 一般使用asm()指令嵌入汇编代码,用volatile表示不优化
-
分支声明: unlikely(x) - x不多出现,绝少发生,一般为假 likely(y) - y常常出现,一般为真
3.内核编程时缺少像用户空间那样的内存保护机制。
4.内核编程时难以执行浮点运算。
5.内核给每一个进程只有一个很小的定长堆栈。
6.因为内.核支持异步中断、抢占和SMP(对称多处理系统),必须时刻注意同步和并发。
7要考虑可移植性的重要性。