3.3 Linux内核的组成
3.3.1 Linux内核源代码的目录结构
Linux内核源代码包含如下目录。
arch
: 包含和硬件体系结构相关的代码, 每种平台占一个相应的目录, 如i386、 arm、 arm64、 powerpc、 mips等。 Linux内核目前已经支持30种左右的体系结构。 在arch目录下, 存放的是各个平台以及各个平台的芯片对Linux内核进程调度、 内存管理、 中断等的支持, 以及每个具体的SoC和电路板的板级支持代码。block
: 块设备驱动程序I/O调度。crypto
: 常用加密和散列算法(如AES、 SHA等) , 还有一些压缩和CRC校验算法。documentation
: 内核各部分的通用解释和注释。drivers
: 设备驱动程序, 每个不同的驱动占用一个子目录, 如char、 block、 net、 mtd、 i2c等。fs
: 所支持的各种文件系统, 如EXT、 FAT、 NTFS、 JFFS2等。include
: 头文件, 与系统相关的头文件放置在include/linux子目录下。init
: 内核初始化代码。 著名的start_kernel() 就位于init/main.c文件中。ipc
: 进程间通信的代码。kernel
: 内核最核心的部分, 包括进程调度、 定时器等, 而和平台相关的一部分代码放在arch/*/kernel目录下。lib
: 库文件代码。mm
: 内存管理代码, 和平台相关的一部分代码放在arch/*/mm目录下。net
: 网络相关代码, 实现各种常见的网络协议。scripts
: 用于配置内核的脚本文件。security
: 主要是一个SELinux的模块。sound
: ALSA、 OSS音频设备的驱动核心代码和常用设备驱动。usr
: 实现用于打包和压缩的cpio等。include
: 内核API级别头文件。
内核一般要做到drivers与arch的软件架构分离, 驱动中不包含板级信息, 让驱动跨平台。 同时内核的通用部分
(如kernel、 fs、 ipc、 net等) 则与具体的硬件(arch和drivers) 剥离。
3.3.2
2.内存管理
内存管理的主要作用是控制多个进程安全地共享主内存区域。 当CPU提供内存管理单元(MMU) 时, Linux内存管理对于每个进程完成从虚拟内存到物理内存的转换。 Linux 2.6引入了对无MMU CPU的支持。
如图3.5所示, 一般而言, 32位处理器的Linux的每个进程享有4GB的内存空间, 0~3GB属于用户空间, 3~4GB属于内核空间, 内核空间对常规内存、 I/O设备内存以及高端内存有不同的处理方式。 当然, 内核空间和用户空间的具体界限是可以调整的, 在内核配置选项KernelFeatures→Memory split
下, 可以设置界限为2GB或者3GB。