Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信
1.进程调度(SCHED):控制进程对CPU的访问。
2.内存管理(MM):允许多个进程安全的共享主内存区域。
3.虚拟文件系统(VFS):隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
4.网络接口(NET):提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可以分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相同的设备驱动程序。
5.进程间的通讯(IPC):支持进程间各种通信机制
系统数据结构
在Linux的内核视线中,有一些数据结构使用频度较高,它们是:task_struct.
Linux内核利用一个数据结构(task_struct)代表一个进程,代表进程的数据结构指针向成了一个task数组。这个数组的大小由NR_TASKS(默认为512),表明Linux系统中最多能同时运行的进程数。
Mm_struct
每个进程的虚拟内存由一个mm_struct结构体代表,该结构实际上包含了当前执行映像的有关信息,并且包含了一组指向vm_area_struct结构的指针,vw_area_struct结构描述了虚拟内存的一个区域
Inode
虚拟文件系统中的文件,目录等均由对应的索引节点(inode)代表。每个VFS索引节点中的内容由文件系统专属的例程提供。VFS索引节点只存在与内核内存中,实际保存于VFS的索引节点高速缓存中。
关于源代码的阅读
Linux 内核源代码的结构
Linux内核源代码位于/usr/src/linux目录下。
/include子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。
/init 子目录包含了内核的初始化代码,这是内核工作的开始的起点。
/arch子目录包含了所有硬件结构特定的内核代码。如:i386,alpha
/drivers子目录包含了内核中所有的设备驱动程序,如块设备和SCSI设备。
/fs子目录包含了所有的文件系统的代码。如:ext2,vfat等。
/net子目录包含了内核的连网代码。
/mm子目录包含了所有内存管理代码。
/ipc子目录包含了进程间通信代码。
/kernel子目录包含了主内核代码。
下面给出阅读源代码的线索:
系统的启动和初始化:
在基于Intel的系统上,当loadlin.exe或LILO把内核装入到内存并把控制权传递给内核时,内核开始启动。关于这一部分请看,arch/i386/kernel/head.S,head.S进行特定结构的设置,然后跳转到init/main.c的main()例程。
内存管理:
内存管理的代码主要在/mm,但是特定结构的代码在archkernel,调度程序在kernel/sched.c,fork的代码在kernel/fork.c,内核例程处理程序在include/linux/interrupt.h,task_struct数据结构在inlucde/linux/sched.h中。
PCI:
PCI伪驱动程序在drivers/pci/pci.c,其定义在inclulde/linux/pci.h。每一种结构都有一些特定的PCI BIOS代码,Intel的在arch/alpha/kernel/bios32.c中。
进程间通信:
所有的SystemVIPC对象权限都包含在ipc_perm数据结构中,这可以在include/linux/ipc.h中找到。SystemV消息是在ipc/msg.c中实现。共享内存在ipc/shm.c中实现。信号量在ipc/sem.c中,管道在/ipc/pipe.c中实现。
中断处理:
内核的中断处理代码几乎所有的微处理器特有的。中断处理代码在arch/i386/kernel/irq.c中,其定义在include/asm-i386/irq.h中。

