阅读Linux内核源码从何处着手


对Linux内核源码的分析,有两个很好的入口点:一个就是系统的引导和初始化,即从机器加电到系统核心的运行;另外一个就是系统调用,系统调用是用户程序或操作调用核心所提供的功能的接口。对于那些对硬件比较熟悉的爱好者,从系统的引导入手进行分析,可能来的容易一些;而从系统调用下口,则可能更合适于那些在dos或Uinx、Linux下有过C编程经验的高手。

  下面就以系统的引导和初始化为例,简要描述一下源代码的阅读线索:

  1、系统的启动和初始化:
  在基于Intel的系统上,当loadlin.exe或LILO把内核装入到内存并把控制权传递给内核时,内核开始启动。关于这仪部分请看, arch/i386/kernel/head.S,head.S进行特定结构的设置,然后跳转到init/main.c的main()例程。

  2、内存管理:
  内存管理的代码主要在/mm,但是特定结构的代码在arch/*/mm。缺页中断处理的代码在/mm/memory.c ,而内存映射和页高速缓存器的代码在/mm/filemap.c 。缓冲器高速缓存是在/mm/buffer.c 中实现,而交换高速缓存是在mm/swap_state.c和mm/swapfile.c。

  3、内核:
  内核中,特定结构的代码在arch/*/kernel,调度程序在kernel/sched.c,fork的代码在kernel/fork.c,内核例程处理程序在include/linux/interrupt.h,task_struct数据结构在inlucde/linux/sched.h中。

  4、PCI:
  PCI伪驱动程序在drivers/pci/pci.c,其定义在inclulde/linux/pci.h。每一种结构都有一些特定的PCI BIOS代码,Intel的在arch/alpha/kernel/bios32.c中。

  另外再附加两条额外建议,以作补充:
  1、一般,在每个目录下,都有一个 .depend 文件和一个 Makefile 文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件这间的联系和依托关系很有帮助;而且,在有的目录下还有Readme 文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解;

  2、可以从start_kernel函数往下追,追完了在从你熟悉的系统调用往下追,再追完了从你不熟悉的系统调用往下追。

  start_kernel以前的部分是硬件相关的,你要追的话就从bootsect.S开始追起;系统调用的函数名称是sys_*。

相关内容