Linux内核系列(二) 如何阅读源码
现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序、网络等组成。linux内核源代码各个目录就可以大致了解对应哪些方面:
1)arch 这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于X86平台就是i386。
2)include 这个目录包括了核心的大多数include文件。另外对于每种支持的体系结构分别有一个子目录。
3)init 此目录包含核心启动代码。
4)mm 此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于archkernel目录下。
5)net 核心的网络部分代码。里面的每个子目录对应于网络的一个方面。
6)lib 此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/*/lib/目录下。
7)scripts此目录包含用于配置核心的脚本文件。
8)Documentation 此目录是一些文档,起参考作用
下面继续对阅读源码提供一些线索和指引:
1、内核
内核中,特定结构的代码在arch/*/kernel,调度程序在kernel/sched.c,fork的代码在kernel/fork.c,task_struct 数据结构在 include/linux/sched.h中;
2、内存管理
内存管理的代码主要在/mm,但特定结构的代码在arch/*/mm。缺页中断处理的代码在mm/memory.c ,而内存映射和页高速缓存器的代码在mm/filemap.c。缓冲器高速缓存是在mm/buffer.c 中实现,而交换高速缓存是在mm/swap_state.c 和mm/swapfile.c中实现;
3、进程间通信
所有System V IPC 对象权限都包含在 ipc_perm 数据结构中,这可以在 include/linux/ipc.h中找到。 System V 消息是在 ipc/msg.c中实现, 共享内存在 ipc/shm.c中,信号量在 ipc/sem.c中,管道在 ipc/pipe.c中实现;
4、中断处理
内核的中断处理代码是几乎所有的微处理器所特有的。中断处理代码在 arch/i386/kernel/irq.c中,其定义子在 include/asm-i386/irq.h中;
5、文件系统
EXT2 文件系统的源代码全部在 fs/ext2/ 目录下,而其数据结构的定义在 include/linux/ext2_fs.h, ext2_fs_i.h 及 ext2_fs_sb.h中。 虚拟文件系统的数据结构在 include/linux/fs.h中描述,而代码是在fs/*中。 缓冲区高速缓存与更新内核的守护进程的实现是在 fs/buffer.c中 ;
6、网络相关
网络代码保存在/net中,大部分的include文件在include/net下,BSD套节口代码在net/socket.c中,IP 第4版本的套节口代码在net/ipv4/af_inet.c。一般的协议支持代码(包括sk_buff 处理例程)在net/core下,TCP/IP联网代码在net/ipv4下,网络设备驱动程序在/drivers/net下;
7、模块相关
内核模块的代码部分在内核中,部分在模块包中,前者全部在kernel/modules.c中,而数据结构和内核守护进程kerneld的信息分别在include/linux/module.h和include/linux/kerneld.h 中。如果你想看ELF目标文件的结构,它位于include/linux/elf.h中。
8、设备驱动程序
Linux内核源代码的很多行是设备驱动程序。Linux设备驱动程序的所有源代码都保存在/driver,可以功能和类型可以进一步划分,这里暂不详述。