分类: LINUX
2011-10-31 15:44:50
内核的确是一头独一无二的猛兽:没有内存保护,没有靠得住的libc,小的堆栈,庞大的源码树。Linux内核遵循它自己的游戏规则,以大人物的架势运行,运行足够长的时间后才停止,打破了我们惯以为常的习俗。尽管如此,内核不外乎就是一个程序,它与我们司空见惯的程序没有多大区别。不必望而生畏:直面它、呼唤它、摆布它。
意识到内核并不像乍看起来那样使人畏惧,这就是良好的开端。不过,要梦想成真,必须全身心地投入,阅读源码、剖析源码,并毫不气馁。
1.内核简介
用户界面是操作系统的外在表象,内核才是操作系统的内在核心。
内核有时候被称作是超级管理者或者是操作系统核心。
应用程序被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中。
运行于内核空间,处于进程上下文,代表某个特定的进程执行。
运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。
运行于用户空间,执行用户进程。
Unix内核几乎毫无例外的都是一个不可分割的静态可执行块(文件)。
Linux是一个单内核。Linux内核运行在单独的内核地址空间 ,不过,Linux汲取了微内核的精华:其引以为豪的是模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力。
2.从内核出发
1)获取内核源码:
linux内核官方网站:
安装内核源代码:
tar xvjf linux-x.y.z.tar.bz2(压缩比例上有优势)
tar xvzf linux-x.y.z.tar.gz
使用补丁:
$ patch-p1 < ../patch-x.y.z(一般来说,一个给定版本的补丁都是打在前一个版本上)
2)内核源码树
3)编译内核
Makeflie是Makefile内核的基础,内核配置项要么是二选一,要么是三选一,驱动程序多支持三选一,可以以模块的方式编译。
内核配置的命令行工具推荐
make menuconfig(适用于文本模式和图形界面模式的图形界面工具)
make xconfig(基于X11的图形工具)
另外命令
make deconfig(为你的体系结构创建一个默认的配置,据说是linus配置的)
make oldconfig(用旧的配置文件配置新的代码树)
减少编译的垃圾信息,在编译时只能看到错误和警告信息,可以采用下面的命令编译内核:
make>../some_other_file
make>/dev/null(把无用的信息扔入永无返回值的黑洞/dev/null)
衍生多个编译作业,改善内核编译时间,可以采用命令:
$ make -jn(n是要衍生的作业数,如make -j4)
把所有以编译的模块安装到正确的主目录/lib下,使用命令:
make modules install
4)内核开发的特点
内核开发与用户空间应用程序开发的区别:
>内核编程时不能访问C库
对内核来说,完整的C库太大了------即便是从中抽取一个合适的子集,大小和效率都不 能接受,但大部分常用的C库函数在内核中都已经得到了实现。比如说操作字符串的函数 组就位于lib/string.c文件中。只要包含
>内核编程时必须使用GNU C
内核代码中所用到的C语言扩展中让感兴趣的那部分:内联函数,内联汇编,分支声明
>内核编程时缺乏像用户空间那样的内存保护机制
发生内核错误会导致oops,内核中的内存都不分页,每用掉一个字节,物理内存就减少一 个字节。
>内核编程时浮点数很难使用
不要在内核中使用浮点数
>容积小而固定的栈
>由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发
内核很容易产生竞争条件。和单线程的用户空间程序不同,内核的许多特性都要求能够并 发的访问共享数据,这就要求有同步机制保证不出现竞争条件,特别是:
* Linux是抢占多任务操作系统。内核的进程调度程序即兴对进程进行调度和重新调度。常用的解决竞争的办法是自旋锁和信号量
>考虑可移植性的重要性
linux是一个可移植性的操作系统