linux4.14.98的内核目录结构如图:
- arch 与体系结构相关的代码放在这里,例如:arm、x86、powerpc。
- block 部分块设备驱动程序。
- crypto 内核本身所用的加密 API,实现了常用的加密和散列算法,还有一些压缩和 CRC 校验算法。
- Documentation 存放着内核的所有开发文档,其中的文件会随版本的演变发生变化,通过阅读这里的文件是获得内核最新的开发资料的最好的地方。
- drivers 此目录包括所有的驱动程序,下面又建立了多个目录,分别存放各个分类的驱动程序源代码,是内核中最大的源代码存放处,大约占整个内核的一多半。其中我们经常会用到的目录有:
- drivers/char
字符设备是 drivers 目录中最为常用,最为重要的目录,其中包含了大量的驱动程序代码。通用的 tty 层在这里实现,console.c 定义了 linux 终端类型,vt.c 中定义了虚拟控制台;lp.c 中实现了一个通用的并口打印机的驱动,并保持设备无关性;led 控制驱动;kerboard.c 实现高级键盘处理,它导出handle_scancode 函数,以便于其他与平台相关的键盘驱动使用。我们的大部分实验也是放在这个目录下。 - driver/block
其中存放所有的块设备驱动程序,保存了一些设备无关的代码。如 rd.c 实现了 RAM 磁盘,nbd.c 实现了网络块设备,loop.c 实现了回环块设备。 - drives/ide
专门存放针对 IDE 设备的驱动。 - drivers/scsi
存放 SCSI 设备的驱动程序,当前的 cd 刻录机、扫描仪、U 盘等设备都依赖这个 SCSI 的通用设备。 - drivers/net
存放网络接口适配器的驱动程序,还包括一些线路规程的实现,但不实现实际的通信协议,这部分在顶层目录的 net 目录中实现。 - drivers/video
这里保存了所有的帧缓冲区视频设备的驱动程序,整个目录实现了一个单独的字符设备
驱动。/dev/fb 设备的入口点在 fbmem.c 文件中,该文件注册主设备号并维护一个此设备的清单,其中记录了哪一个帧缓冲区设备负责哪个次设备号。 - Drivers/media
这里存放的代码主要是针对无线电和视频输入设备,比如目前流行的 usb 摄像头。
-
fs 此目录下包括了大量的文件系统的源代码,其中在嵌入式开发中要使用的包括:devfs、cramfs、ext4、jffs2、romfs、yaffs、vfat、nfs、proc 等。
文件系统是 Linux 中非常重要的子系统,这里实现了许多重要的系统调用,比如 exec.c 文件中实现了execve 系统调用;用于文件访问的系统调用在 open.c、read_write.c 等文件中定义,select.c 实现了 select 和poll 系统调用,pipe.c 和 fifo.c 实现了管道和命名管道, mkdir、rmdir、rename、link、symlink、mknod 等。
系统调用在 namei.c 中实现。
文件系统的挂装和卸载和用于临时根文件系统的 initrd 在 super.c 中实现。Devices.c 中实现了字符设备和块设备驱动程序的注册函数;
file.c、inode.c 实现了管理文件和索引节点内部数据结构的组织。
Ioctl.c 实现 ioctl 系统调用。* -
include 这里是内核的所有头文件存放的地方,其中的 linux 目录是头文件最多的地方,也是驱动程序经常要包含的目录。
-
initlinux 的 main.c 程序,通过这个比较简单的程序,我们可以理解 LINUX 的启动流程。
-
ipc 进程间通信的原语实现,包括信号量、共享内存。
-
kernel 这个目录下存放的是除网络、文件系统、内存管理之外的所有其他基础设施,其中至少包括进程调度 sched.c,进程建立 fork.c,定时器的管理 timer.c,中断处理,信号处理等。
-
lib 包括一些通用支持函数,类似于标准 C 的库函数。其中包括了最重要的 vsprintf 函数的实现,它是 printk 和 sprintf 函数的核心。还有将字符串转换为长整形数的 simple_atol 函数。
-
mm 这个目录包含实现内存管理的代码,包括所有与内存管理相关的数据结构,其中我们在驱动中需要使用的 kmalloc 和 kfree 函数在 slab.c 中实现,mmap 定义在 mmap.c 中的 do_mmap_pgoff 函数。将文件映射到内存的实现在 filemap.c 中,mprotect 在 mprotect.c,remap 在 remap.c 中实现;vmscan.c 中实现了kswapd 内核线程,它用于释放未使用和老化的页面到交换空间,这个文件对系统的性能起着关键的影响。
-
net 这个目录包含了套接字抽象和网络协议的实现,每一种协议都建立了一个目录,但是其中的 core、bridge、ethernet、sunrpc、khttpd 不是网络协议,我们使用最多的是 ipv4、ipv6、802、ipx 等。其中我们经常会用到的目录有:
-
net/core 目录中实现了通用的网络功能:设备处理、防火墙、组播、别名等。
-
net/ethernet 和 net/bridge 实现特定的底层功能:以太网相关的辅助函数以及网桥功能。
-
net/sunrpc 中提供了支持 NFS 服务器的函数。
-
samples 一些内核编程的范例。
-
script 这个目录存放许多脚本,主要用于配置内核。
-
sound 音频设备的驱动目录。
-
tools 工具文件夹。
-
usrcpio 命令的实现。
主要文件如下:
-
.config 内核里默认的隐藏配置文件,需要用 ls -a 查看。
-
config_uptech 裁剪好的配置文件,如果.config 损坏,可以将本文件拷贝成.config。
-
arch/arm64/configs/defconfig 默认官方 imx8 的配置,直接 make defconfig 或者拷贝到.config。
-
Makefile 编译时需要的主文件,各子目录也有类似的文件。
README 内核使用说明。 -
arch/arm64/boot/dts/freescale/fsl-imx8mm-evk.dts 设备树文件,是对 imx8mm 所有功能的配置,比
如 gpio、i2c 总线,串口等等。 -
arch/arm64/boot/dts/freescale/fsl-imx8mm-evk-rm67191.dts 设备树 mipi 显示配置文件。
-
arch/arm64/boot/Image 内核编译完生成的文件,主要用于系统烧写。
-
arch/arm64/boot/dts/freescale/fsl-imx8mm-evk-rm67191.dtb 内核设备树编译完生成的文件,主要用于系统烧写。