第一章 Linux内核简介
1.1Unix的历史
①Unix是一个强大、健壮和稳定的操作系统。
②.Unix的特点:第一,Unix很简洁,没有不明确的系统,仅仅提供几百个系统调用并且有一个非常明确的设计目的。第二,在Unix中,所有的东西都被当做文件对待。第三,Unix的内核和相关的系统工具软件是用C语言编写的,具有强大的移植能力。第四,Unix的进程创建非常迅速,并且有一个非常独特的fork()系统调用。
③Unix成为一个支持抢占式多任务、多线程。虚拟内存、换页、动态链接和TCP/IP网络。
1.2LINUX简介
Linux是类Unix系统,但不是Unix。但Linux没有直接使用Unix的源代码,它的实现可能和其他各种Unix的实现大相径庭,但它没有抛弃Unix的设计目标并且保证了应用程序编程接口的一致。
1.3操作系统和内核简介
①操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分。
②内核独立于普通应用程序,一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和被保护起来的内存空间,统称为内核空间。在系统中运行的应用程序通过系统调用来与内核通信。
1.4Linux内核和传统UNIX内核的比较
Linux内核和传统UNIX内核特点的比较:1.Linux支持动态加载内核模块;
2.Linux支持对称多处理(SMP)机制;3.Linux内核可以抢占;4.Linux内核并不区分线程和其他的一般进程;5.Linux提供具有设备类的面向对象的设备模型,热插拔事件,以及用户空间的设备文件系统。
单内核和微内核设计的比较
①单内核(比如大多数Unix及Linux):把内核整体上作为一个大的单独的过程来实现,同时运行在一个单独的地址空间上,十分简单,性能高。
②微内核(比如Windows NT):微内核的功能被划分为多个独立的功能,每个过程叫做一个服务器;便于处理内核间通信,还使用了IPC机制;
1.5Linux内核版本
第二章 从内核出发
2.1获取内核源码
①使用git获取源码:git clone git: //git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
②更新分支到Linux的最新分支:git pull
③安装解压:tar xvjf linux-x.y.z.tar.bz2或者tar xvzf linux-x.y.z.tar.gz
④打补丁:patch -p1 < ../patch-x.y.z
2.2内核源码树
2.3编译内核
1.配置内核
前提:可以配置的各种变量都以CONFIG_前缀表示。有二选一(yes or no)和三选一
①字符页面的命令行工具:make config
②图形界面工具:make menuconfig
③其他的几种配置:make defconfig //基于默认配置;make oldconfig //验证和更新配置
2.编译内核
make
①减少编译的垃圾信息——对输出进行重定向。
make > .. /detritus # 重定向到这个文件里了;
make > /dev/null # 把无用的输出信息重定向到永无返回值的黑洞里。
3.安装新内核
以root身份运行 make modules_install即可,所有已编译的模块都会安装到lib/modules下。
2.4内核开发的特点
①无lib库或者标准头文件,不能直接使用标准C函数库
②内核编程时使用GNU C,比如内联函数、内联汇编等
③没有内存保护机制。如果一个用户程序试图进行一次非法的内存访问,内核会发现这个错误,发送 SIGSEGV,并结束整个进程。内核中发生的内存错误会导致oops,这是内核中出现的最常见的一类错误。
④容积小而固定的栈。内核栈的准确大小随体系结构而变。在x86上,栈的大小在编译时配置,可以是4KB也可以是8KB。
⑤不要轻易在内核中使用浮点数。在执行浮点指令时到底会做些什么,因体系结构不同,内核的选择也不同,但是,内核通常捕获陷阱并做相应处理。
⑥同步和并发。Linux是抢占多任务操作系统。内核的进程调度程序即兴对进程进行调度和重新调度。内核必须对这些任务同步。
⑦可移植性的重要性。必须把体系结构相关的代码从内核代码树的特定目录中适当地分离出来。