(1)阅读sched.h源码文件,加深对进程管理概念的理解
(2)阅读Linux的fork.c源码文件,分析进程的创建过程
(3)阅读msg.c,sem.c和shm.c源码文件,熟悉Linux的三种通信机制。
Linux的内核源码可以通过许多途径得到。一般来讲,在完整安装的Linux系统下,/usr/src/linux目录下的文件就是内核源码。另外,还可以从Internet上下载,http://www.kernel.org/是比较权威的下载站点。展开的源码一般包括以下几个子目录:
u arch: 该目录包含了此内核源码所支持的硬件体系结构相关的内核源码。在这个目录下,针对不同体系结构所移植的版本都有三个子目录:kernel、lib和mm。kernel子目录包含以来于体系结构实现的一般内核功能,如信号处理、时钟处理等;lib子目录包含库函数的本地实现,如果从依赖于体系结构的源码编译,则运行更快;mm子目录包含存储管理实现的代码。
u kernel:许多最常调用的内核函数放在该目录下。调度器fork()和timer.c就放在这里,以及printk.c等。与处理器结构相关的代码放在arch/*/kernel目录下。
u lib:该目录放置内核其他部分经常所需要的代码,如inflate.c就放在这里,它能够在引导时解压内核并装入内存。与处理器结构相关的库代码放在arch/*/lib目录下。
u mm: 包含了所有Linux实现虚拟内存管理的源码。与具体硬件体协结构相关的内存管理代码位于arch/*/mm目录下,如对应X86的就是arch/i386/mm/fault.c
u drivers: 这个目录拥有50%以上的内核源码,系统中所有的设备驱动程序都位于该目录中。
u include: 包括了内核的大多数头文件,另外对每种支持的体系结构分别有一个子目录。
u init: 包含了所有系统的初始化源码,许多主要的文件,如main.c就位于该目录下。该文件还包含了许多核心代码——如实现fork()的代码和最常执行的代码——cpuidle()循环。
u ipc: 处理进程间通信的全部所需的代码都放在目录下。
u modules: 已编译好的可动态加载的模块。
u fs: Linux支持的文件系统代码。不同的文件系统有不同的子目录与之对应。
u net: 所有提供网络支持的代码,每个子目录对应网络的一个方面。
u scripts: 用于配置内核的脚本文件角用户开发和维护手册。
Linux内核源码包含的内容较多,2.4.20版本的内核源码大约有40万行。
如果用户需要修改Linux内核源码,那么一定要注意遵守下面的编码约定:
u 注释是/* */风格的,单行注释也是这样,不接受//风格的注释。
u 函数开始的大括号{}独占一行。
u if语句以下面方式编码:
if (str[0]>=’0’ && str[0]<=’9’){
strcpy (name, “abcd”);
strncpy (name+4, str, 1);
}else
printk (“error param”);
name [sizeof (name) -1]=0;
u 单行if语句是可以接受的:
if (!strcmp(str, “abc”)) strcpy(str, “abc”);
u 内核源码包含许多goto,差不多每80行代码就有一个goto,这是出于执行效率的考虑,如在一些while语句中,使用goto跳出代码块,而不是使用break。