课本第一、二章读书笔记
Linux内核简介
1.1 Unix的历史
1969年Unix诞生
1994年重写了虚拟内存子系统并推出了最终官方版
Unix系统设计简介并且在发布时提供源代码可以对其进行进一步的开发
Unix强大的根本原因
·Unix很简洁:提供设计目的明确的系统调用目的
·所有东西都被当做文件对待:使得对数据和对设备使用相同的系统调用接口
·Unix内核和相关系统工具都是用C语言编写而成的:使得具备惊人的移植能力
·进程创建迅速,有独特的fork()系统调用
·提供简单稳定的进程间通信原语,把目标放在一次执行保质保量的完成一个任务上
正是由于这种策略和机制分离的设计理念,确保了Unix系统具备清晰的层次化结构
现在,Unix已经发展成为一个支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统
1.2 Linux简介
1991年Linux诞生
Linux是类Unix系统,但他不是unix。因为没有直接使用Unix的源代码但是保证了应用程序编程接口的一致
Linux系统的基础是内核、C库,工具集和系统的基本工具
1.3 操作系统和内核简介
操作系统:是指在整个系统中负责完成最基本功能和系统管理的那些部分,包括内核,设备驱动程序,启动引导程序,命令行shell或其他种类的用户界面,基本的文件管理工具和系统工具。系统这个词其实包含了操作系统和所有运行在他之上的应用程序
内核:管理者或者操作系统的核心。
内核的组成
负责响应中断的中断服务程序
负责管理多个进程的从而分享处理器时间的调度程序
负责管理进程地址空间的内存管理程序和网络
进程间通信等系统服务程序
在系统中运行的应用程序通过系统调用来与内核通信
应用程序完成其工作的基本方式:应用程序被称通过系统调用在内核空间运行,而内核被称为运行于进程上下文中
处理器在任何指定时间上的活动必然为以下三者之一:
运行于用户空间,执行用户进程
运行于内核空间,处于进程上下文,代表某个特定的程序进程
运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断
1.4 Linux内核版本
稳定的和处于开发中的
从内核出发
2.1获取内核源码
官网http://www.kernel.org
2.1.1 Git
获取最新提交到Linux版本树的一个副本:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
更新
$ git pull
2.1.2安装内核源代码
内核的两种压缩形式:bzip2(默认和首选)和gzip
运行
$ tar xvjf linux-x.y.z.tar.bz2 (or gz)
2.1.3 使用补丁
$ patch -pl < ../patch-x.y.z
2.2 内核源码树
2.3编译内核
2.3.1 配置内核
配置选项
既可以决定哪些文件编译进内核,也可以通过预处理命令处理代码
可以是字符串也可以是整数(指定内核源码可以访问的值)
二选一
yes or no
三选一(驱动程序一般都选择该选项)
yes or no or module(该配置项被选定了但编译的时候这部分功能的实现代码是以模块的形式生成)
字符界面下的命令行工具
$ make config
基于ncurse库编制的图形界面工具
$ make menuconfig
基于gtk+的图形工具
$ make gconfig
基于默认的配置
$ make defconfig
2.3.2 减少编译的垃圾信息
$ make > ../detritus
$ make >dev/null
2.3.3 衍生多个编译作业
$ make -jn > dev/null
2.4 内核开发的特点
既不能访问C库也不能访问标准的C头文件
必须使用GUN C
缺乏像用户空间那样的内存保护机制
难以执行浮点运算
内核给每个进程只有一个很小的定长堆栈
由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发
要考虑可移植性的重要性
2.4.2 GNU C
1、内联函数:函数在他所调用的位置上展开。必须在使用之前就定义好,否则编译器无法展开
static inline void wolf(unsigned long tail_size)
2、内联汇编
3、分支声明
没有内存保护机制
不要轻易在内核中使用浮点数
容积小而固定的栈