已经写了一篇文章介绍Linux 系统源码目录的:https://blog.csdn.net/weixin_38715577/article/details/101033419
现在介绍一下Linux 内核(kernel)的目录结构。
内核在系统目录下的路径,一般为:/usr/src/(我的 ubuntu 下测试的)
你也可以自己在 / home 目录下创建一个文件夹命名为 work,作为自己开发内核的工作目录,然后去https://www.kernel.org/pub/linux/kernel/下载一个内核到 / home/work / 下,在这上面做相应开发比较好。
内核源码的目录结构和系统目录结构类似,也是一个树状结构。
下图是我的 ubuntu16 的内核源码路径和内核源码目录的样子。

第一级目录:
| 序号 | 第一级目录 | 第二级目录和文件 |
|---|---|---|
| 1 | **arch** |
这个文件夹包含了一个 Kconfig 文件,它用于设置这个目录里的源代码编译所需的一系列设定。
每个支持的处理器架构都在它相应的文件夹中,如arm64、arm32、``x86、mips等。/boot:内核需要的特定平台代码/boot/dts:设备树文件/lib:通用函数在特定体系结构的文件/math-emu:模拟 FPU的代码,在 ARM 中,使用/math-xxx代替/mm:特定体系结构的内存管理文件/include:特定体系的头文件
|
| 2 | **block** | 此文件夹包含块设备驱动程序的代码,该目录用于实现块设备的基本框架和块设备的 I/O 调度算法。块设备是以数据块方式接收和发送的数据的设备。数据块都是一块一块的数据而不是持续的数据流。 |
| 3 | **crypto** | 这个文件夹包含许多加密算法的源代码。例如,“sha1_generic.c” 这个文件包含了 SHA1 加密算法的代码。存放**加密**、**压缩**、**CRC 校验**等算法相关代码 |
| 4 | **Documentation** | 存放相关说明**文档**,很多实用文档,包括驱动编写等 |
| 5 | **drivers** | 存放 Linux 内核设备**驱动程序**源码。驱动源码在 Linux 内核源码中站了很大比例,常见外设几乎都有可参考源码,对驱动开发而言,该目录非常重要。该目录包含**众多驱动**,目录按照设备类别进行分类,如**char**、**block**、**input**、**i2c**、**spi**、**pci**、**usb**等 |
| 6 | **firmware** | 保存用于驱动第三方设备的固件**。** |
| 7 | **fs** | 这是文件系统的文件夹。理解和使用的文件系统所需要的所有的代码就在这里。在这个文件夹里,每种文件系统都有自己的文件夹。例如,ext4 文件系统的代码在 ext4 文件夹内。 在 fs 文件夹内,开发者会看到一些不在文件夹中的文件。这些文件用来控制整个文件系统。例如,mount.h 中会包含挂载文件系统的代码。文件系统是以结构化的方式来存储和管理的存储设备上的文件和目录。每个文件系统都有自己的优点和缺点。这是由文件系统的设计决定的。 |
| 8 | **include** | 存放内核所需、与平台无关的头文件,与平台相关的头文件已经被移动到 arch 平台的 include 目录,如 ARM 的头文件目录
| 9 | **init** | 包含**内核初始化**代码,init 文件夹包含了内核启动的处理代码 (INITiation)。main.c 是内核的核心文件,这是用来衔接所有的其他文件的源代码主文件。 |
| 10 | **ipc** | 存放**进程间通信**代码, 此文件夹中的代码是作为内核与进程之间的通信层。内核控制着硬件,因此程序只能请求内核来执行任务。假设用户有一个打开 DVD 托盘的程序。程序不直接打开托盘,该程序通知内核,然后,内核给硬件发送一个信号去打开托盘。 |
| 11 | **kernel** | 这个文件夹中的代码控制内核本身,在该文件夹下有个 “power” 文件夹,这里的代码可以使计算机重新启动、关机和挂起。 |
| 12 | **lib** | 这个文件夹包含了内核需要引用的一系列内核库文件代码。 |
| 13 | **mm** | mm 文件夹中包含了内存管理代码。内存并不是任意存储在 RAM 芯片上的。相反,内核小心地将数据放在 RAM 芯片上。内核不会覆盖任何正在使用或保存重要数据的内存区域。 |
| 14 | **net** | net 文件夹中包含了网络协议代码。这包括 IPv6、AppleTalk、以太网、WiFi、蓝牙等的代码,此外处理网桥和 DNS 解析的代码也在 net 目录。 |
| 15 | **samples** |
存放提供的一些内核编程**范例**,如**kfifo**;后者相关用户态编程**范例**,如**hidraw**
此文件夹包含了程序示例和正在编写中的模块代码。假设一个新的模块引入了一个想要的有用功能,但没有程序员说它已经可以正常运行在内核上。那么,这些模块就会移到这里。这给了新内核程序员一个机会通过这个文件夹来获得帮助,或者选择一个他们想要协助开发的模块。
|
| 16 | **srcipts** | 这个文件夹有内核编译所需的脚本。最好不要改变这个文件夹内的任何东西。否则,您可能无法配置或编译内核。 |
| 17 | **security** | 这个文件夹是有关内核安全的代码。它对计算机免于受到病毒和黑客的侵害很重要。否则,Linux 系统可能会遭到损坏。 |
| 18 | **sound** | 这个文件夹中包含了声卡驱动,存放声音系统架构相关代码和具体声卡的设备驱动程序 |
| 19 | **tools** | 编译过程中一些主机必要**工具,**这个文件夹中包含了和内核交互的工具。 |
| 20 | **usr** | 早期用户空间代码(所谓的 initramfs) |
| 21 | **virt** | 内核虚拟机**KVM** |
以上是Linux内核源码目录的结构,大致了解每个目录的左右,需要的时候知道在哪去找就行。
对于 Linux 内核驱动开发工程师来说,最常接触的就是driver目录,接下来就 driver 目录做一些说明!
先看张图:这是我虚拟机里面 内核源码下 drivers 的样子

好了忘记它。没什么卵用,只是看一看加深印象。
下面是driver目录下比较常用的驱动,本人才疏学浅,刚开始学习,怕有什么错漏,所以下图是借鉴了:https://blog.csdn.net/hongwei_1990/article/details/89716970
| 序号 | 目录 | 说明 |
|---|---|---|
| 1 | drivers**/gpio** |
系统**GPIO**子系统和驱动目录,包括处理器 **内部 GPIO**以及 **外扩 GPIO**驱动。遵循 **GPIO**子系统的驱动,可通过 **/sys/class/gpio**进行访问 |
| 2 | drivers**/hwmon** |
**硬件监测**相关驱动,如 **温度传感器**、 **风扇监测**等 |
| 3 | drivers**/i2c** |
**I2C 子系统**驱动。各 **I2C 控制器**的驱动在 **i2c/busses**目录下 |
| 4 | drivers**/input** |
**输入子系统**驱动目录 |
| 5 | drivers**/input/keyboard** |
非**HID 键盘**驱动,如 **GPIO 键盘**、 **矩阵键盘**等 |
| 6 | drivers**/input/touchscreen** |
**触摸屏驱动**,如 **处理器的触摸屏控制器**驱动、 **外扩串行触摸屏控制器**驱动、 **串口触摸屏控制器**驱动等 |
| 7 | drivers**/leds** |
**LED**子系统和驱动,如 **GPIO 驱动**的 **LED**。遵循 LED 子系统的驱动 ,可通过 **/sys/class/leds**进行访问 |
| 8 | drivers**/mfd** |
**多功能器件**( **Multi-Function Device**)驱动。如果一个器件能做多种用途,通常需要借助 **MFD**来完成。 |
| 9 | drivers**/misc** |
**杂项**( **Miscellaneous**)驱动。特别需要关注 **<drivers/misc/eeprom/>**目录,提供了 **i2c**和 **spi**接口的 **EEPROM 驱动**范例,所驱动的设备可通过 **/sys**系统访问 |
| 10 | drivers**/mmc** |
**SD**( **Secure Digital**)/ **MMC**( **Mutimedia Card**)卡驱动目录 |
| 11 | drivers**/mtd** |
**MTD**( **Memory Technology Device**)子系统和驱动,包括 **NAND**、 **oneNAND**等。注意, **UBI 的实现**也在 **MTD**中 |
| 12 | drivers**/mtd/nand** |
**NAND FALSH**的 **MTD**驱动目录,包括 **NAND**的 **基础驱动**和 **控制器接口驱动** |
| 13 | drivers**/net** |
**网络设备**驱动,包括 **MAC**、 **PHY**、 **CAN**、 **USB 网卡**、 **无线**、 **PPP 协议**等 |
| 14 | drivers**/net/can** |
**CAN 设备**驱动。Linux 已经将 **CAN**归类到 **网络中**,采用 **socket_CAN**接口 |
| 15 | drivers**/net/ethernet** |
所支持的**MAC 驱动**。常见厂家的 **MAC 驱动**都能找到,如 **broadcom**、 **davicom**、 **marvell**、 **micrel**、 **smsc**等厂家的 MAC, **处理器自带 MAC**的 **驱动**也在该目录下 |
| 16 | drivers**/net/phy** |
**PHY**驱动,像 **marvell**、 **micrel**和 **smsc**的一些 **PHY 驱动** |
| 17 | drivers**/rtc** |
**RTC 子系统**和 **RTC 芯片驱动** |
| 18 | drivers**/spi** |
**SPI 子系统**和 **SPI 控制器**驱动,含 **GPIO 模拟 SPI**的驱动 |
| 19 | drivers**/tty** |
tty 驱动用于管理物理终端连接。 |
| 20 | drivers**/tty/serial** |
**串口驱动**,包括 **8250 串口**以及各处理器 **内部串口**驱动实现 |
| 21 | drivers**/uio** |
**用户空间 IO 驱动** |
| 22 | drivers**/usb** |
**USB 驱动**,包括 **USB HOST**、 **Gadget**、 **USB 转串口**以及 **OTG**等支持 |
| 23 | drivers**/video** |
**Video 驱动**,包括 **Framebuffer 驱动**、 **显示控制器驱动**和 **背光驱动**等。 |
| 24 | drivers**/video/backlight** |
**背光控制**驱动 |
| 25 | drivers**/video/logo** |
Linux 内核启动**LOGO 图片**目录 |
| 26 | drivers**/watchdog** |
**看门狗驱动**,包括 **软件看门狗**和各种 **硬件看门狗**驱动实现 |
还有其他一些内核目录没介绍,需要的时候可以网上找资料。
希望与诸君共同学习进步!加油!
https://blog.csdn.net/weixin_38715577/article/details/101365039
