1 linux内核源码代码简介
1.1 前面的章节,已经对计算机系统和操作系统有了一个初步的了解,总结起来就是计算机有“3大法宝”
- 存储程序计算机
- 函数调用堆栈
- 中断
1.2 操作系统有“两把宝剑”
- 中断上下文
- 进程上下文
2 内核目录介绍
2.1 arch目录
- arch目录是与体系结构相关的子目录列表,里面存放了许多CPU体系结构的相关代码,比如arm,x86等。arch目录中的代码在linux内核代码中占比相当庞大,主要原因是arch目录中的代码可以使linux内核支持不同的CPU和体系结构。a’lpha,arm,arm64等不同目录分别支持不同的CPU。
2.2 block目录
- block:存放linux存储体系中关于块设备管理的代码。
2.3 crypto目录
- crypto:存放常见的加密算法的C语言代码,譬如crc32,md5,sha1等。
2.4 Documentation目录
- Documentation:存放一些文档。
2.5 drivers目录
- drivers:驱动目录,里面分门别类地存放了linux内核支持的所有硬件设备的驱动源码。
2.6 firmware目录
- firmware:固件
2.7 fs目录
- fs:文件系统(file system),里面列出啦linux支持的各种文件系统的实现。
2.8 include目录
- include:头文件目录,存放公共的(各种CPU体系结构共用的)头文件。比如ARM架构特有的一些头文件在arch/arm/include目录及其子目录下。
2.9 init目录
- init:init是初始化的意思,存放linux内核启动时的初始化代码。
2.10 ipc目录
- ipc:ipc就是进程间通信(inter-process communication),ipc目录里面是linux支持的ipc的代码实现。
2.11 kernel目录
- kernel:kernel的意思是内核,就是linux内核,这个文件夹存放内核本身需要的一些核心代码文件。其中有很多关键代码,包括pid——进程号等。
2.12 lib目录
- lib:公用的库文件,里面是一些公用的库函数。注意这里的库函数和C语言的库函数是不一样的,在内核编程中不能用C语言标准库函数,这里的lib目录下的库函数就是用来替代na’xie 标准库函数的。譬如把字符串转成数字要用atoi函数,但是内核编程中只能用lib目录下的atoi函数,不能用标准C语言库中的a’toi函数:譬如在内核中要打印信息时不能用printf,而要用printk,这个printk就是lib目录下的。
2.13 mm目录
- mm:是memory management,即内存管理,存放linux的内存管理代码。
2.14 net目录
- net:该目录下是网络相关代码,譬如TCP/IP协议栈等。
2.15 此外还有一些与声音,安全,脚本,工具相关的目录。
3 编译安装内核大概步骤
- 安装开发包组
- 下载源码
- .config:准备配置文件
- make menuconfig:配置内核选项
- make [-j #]
- make modules_install:安装模块
- make install:安装内核相关文件
- 安装bzImage为/boot/vmlinuz-VERSION-RELEASE(去boot目录下查看)
- 生成initramfs文件
- 编辑grub的配置文件
4 编译配置选项介绍
4.1 支持“更新”模式进行配置:make help
- make config:基于命令行以遍历的方式去配置内核中配置的每个选项。
- make menuconfig:基于curses的文本窗口界面。
- make gconfig:基于GTK(GNOME)环境窗口界面。
- make xconfig:基于QT(KDE)环境的窗口界面。
4.2 支持“全新配置”模式
- make defconfig:基于内核为目标平台提供的“默认”配置进行配置。
- make allyesconfig:所有选项均回答为“yes”
- make allnoconfig:所有选线均回答为“no”