Linux Kernel Development 3rd Edition 读书笔记

该书有第二版中文版,第三版还没看到,这里记录下该书的要点,并翻译成中文以加深印象.欢迎指正Linux Kernel Development 3rd Edition 读书笔记
第一章 Introduction To The Linux Kernel
1. Linux内核类型Linux
Linux是单一的内核(monolithic kernel),就是说,Linux内核在单一的地址空间中运行,但是Linux借鉴了很多微内核(mircokernel)的优点. Linux使用了模块化设计,内核抢占,支持内核线程和动态加载不同的内核模块到内核映像空间.相反,Linux没有微内核设计的性能较差的缺点:一切都运行在内核模式,直接函数调用,没有消息传递.尽管如此,Linux是模块化,线程支持及内核自我调度的内核.

2. Linux与Unix的区别
(1) Linux支持动态加载内核模块,尽管Linux内核是单一型内核,它可以根据命令加载或者卸载模块.
(2) Linux支持对称多处理器架构(SMP),尽管多数商业Unix系统支持SMP,但传统的Unix 实现多数不支持.
(3) Linux内核是可抢占式的,不像传统的Unix内核,Linux可以抢占在内核运行的任务.商业Unix系统中Solaris and IRIX支持内核抢占,但多数Unix内核是非抢占式的.
(4) Linux的线程支持比较有趣,正常的进程和线程之间并没有什么区别,对于内核来说,所有的进程都一样,仅仅会有不同的共享资源.
(5) Linux提供面向对象的设备模型,该设备模型设备类,即插即用事件和用户空间的设备文件系统(sysfs).
(6) Linux忽略了Unix的一些内核开发者任务实现糟糕的通用特性,比如STREAMS,或者无法容易实现的标准.
(7) Linux的一切都是免费的.这样Linux的开发都是自由的,

第二章 Getting Started with the Kernel
1. git使用

使用GIt可以获得最近的linux版本:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
check out完成后,可以使用如下命令:
$ git pull
来更新Linux内核到最新的版本

2. The Kernel Source Tree
Linux Kernel Development 3rd Edition 读书笔记

3. 配置内核
(1)  配置选择有Boolean和tristates两种类型.Boolean类型可以选择yes或no.内核特性,比如 CONFIG_PREEMPT通常就是Boolean型.tristates类型有yes,no,module3个值可选.设置成module表示编译成模块(可动态加载的对象).tristates类型的数据中,yes表示将代码编译到内核映像中,而不是一个模块.驱动通常就是tristates类型来配置的.
(2) 配置内核命令
文本模式下: $ make config
该命令会一个选项一个选项的让用户选择,会花很多时间.因此最好使用图形化的配置.
$ make menuconfig 或者基于gtk+的工具: $ make gconfig
$ make defconfig 该命令创建一个基于默认配置的配置.
$ make oldconfig 当更新了配置,或者使用了配置文件到新的内核代码中,使用该命令进行验证并更新配置.在编译内核之前需要运行该命令.
配置选项CONFIG_IKCONFIG_PROC能够将配置文件保存并压缩到 /proc/config.gz中.可以使用如下命令将备份的配置文件恢复进行新的编译.
$ zcat /proc/config.gz > .config
$ make oldconfig
内核配置完成后,使用make命令就可以编译内核了.
$ make
如果不想看到过多的编译信息,而只想看到警告和错误,可以使用如下命令重定向到其他文件:
$ make > ../detritus
还可以使用如下命令将无价值的输出信息重定向到null,也就是丢弃.
$ make > /dev/null

4.安装新内核
这取决于系统架构和Bootloader, 如果是x86使用grub引导,只需复制arch/i386/boot/bzImage目录到 /boot,更名为 vmlinuz-version之类的名字,然后编辑 /boot/grub/grub.conf,为新内核添加一个新的entry.对于Lilo,则编辑/etc/lilo.conf然后重新运行Lilo.
使用% make modules_install命令来安装内核模块,该命令将编译好的模块放到 /lib/modules下.

5.内核区别与用户程序的特点
(1) 内核不能访问C库和标准头文件
常用的C库函数有在内核中的实现,如printk()代替printf(),用法基本一样,唯一的区别是printk可以添加一个表示信息优先级的宏(注意没有逗号),如:
printk(KERN_ERR "this is an error!\n");
(2) 内核由GNU C编写
支持内联函数;内嵌汇编;likely()和unlikely()来优化分支语句.
(3) 内核缺少像用户空间一样的内存保护机制
(4) 内核很难进行浮点运算
(5) 内核的每个进程都只有固定的很小的栈空间
x86架构上一般为4KB或者8KB.32bit系统8KB,64bit系统16KB.
(6) 因为内核有异步中断,可抢占,支持SMP,同步和并发运行是内核需要重点注意的方面
通常的解决办法是使用自旋锁和信号量.
(7) 可移植性非常重要

相关推荐