第一章 Linux内核简介
一、Unix
1、Unix的特点
- 简洁
- 绝大部分东西都被当做文件对待。这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open(),read(),write(),lseek()和close()
- 出色的平台可移植性——内核和相关的系统工具软件用C语言编写而成
- 进程创建迅速
- 进程间通信原语简单稳定
2、Unix的现状
发展成为支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。
3、linux简介
- 被广泛移植到Alpha、ARM、PowerPC、SPARC、x86-64等许多其他体系结构上。
- Linux是类Unix系统,但他不是Unix。
- Linux系统的基础是内核、C库、工具集和系统的基本工具。
二、操作系统和内核简介
1、操作系统
指在整个系统中负责完成最基本功能和系统管理的那些部分。包括内核、设备驱动程序、启动引导程序、命令行Shell或者其他种类的用户界面、基本的文件管理工具和系统工具。
2、内核
- 独立于普通应用程序,一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和被保护起来的内存空间,统称为内核空间。
- 在系统中运行的应用程序通过系统调用来与内核通信。
3、应用程序完成其工作的基本行为方式:
应用程序通过系统调用界面陷入内核。
4、处理器的活动必然其下三者之一:
- 运行于用户空间,执行用户进程
- 运行于内核空间,处于进程上下文,代表某个特定的进程执行
- 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断
5、单内核与微内核
- 单内核:内核通常以单个静态二进制文件的形式存放于磁盘中所有内核服务都运行在内核态并身处同一地址空间,内核可以直接调用函数。特点是简单,性能高。
- 微内核:不同的功能被划分为独立的过程,每个过程叫做一个服务器,通过消息传递处理微内核通信,采用了进程间通信(IPC)机制。
6、Linux内核与Unix系统的差异
- Linux支持动态加载模块
- Linux支持对称多处理(SMP)机制
- Linux内核可以抢占
- Linux内核不区分线程和其他一般进程
- Linux提供具有设备类的面向对象的设备模型、热拔插事件、以及用户空间的设备文件系统
- Linux忽略一些被认为设计很拙劣的Unix特性
- Linux体现了自由
第二章 从内核出发
一、内核源码
1、获取内核源码
http://www.kernel.org
2、使用Git来获取最新版本源代码
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
3、更新到Linux的最新分支
$ git pull
4、解压并安装内核源代码
$ tar xvjf linux-x.y.z.tar.bz2
$ tar xvjf linux-x.y.z.tar.gz (压缩形式是GUN的zip)
5、使用补丁
$ patch -p1 < ../patch-x.y.z
二、内核源码树
三、编译内核
1、Linux中可以配置的选项其前缀均为CONFIG。
配置项二选一:yes 或 no
配置项三选一:yes 、no 或 module(以模块形式生成,为独立代码段)
2、简化内核配置工具:
- 字符界面下的Linux工具:逐一遍历所有的配置项,要求用户逐一选择,耗时长。
- 基于ncurse库编制的图形界面工具:
- 基于gtk+的图形工具:
- 基于默认配置为体系结构创建一个配置:
- 验证和更新配置:
$ make config
$ make menuconfig
$ make gconfig
$ make defconfig
$ make oldconfig
一旦内核配置好,就可以利用一个简单的命令来编译它。
$ make
四、内核开发的特点
- 内核开发时既不能访问C库也不能访问标准的C头文件
- 内核编程时必须使用GNU C
- 内联函数必须在使用之前就定义好,一般在头文件中定义。
- 内核编程时缺乏像用户空间那样的内存保护机制
- 内核中内存不分页。
- 内核编程时难以执行浮点运算
- 内核给每个进程只有一个很小的定长堆栈
- 由于内核支持异步中断、抢占和SMP,必须时刻注意同步和并发
- 要考虑可移植性的重要性