已经写了一篇文章介绍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 的头文件目录<arch/arm/include/asm/> |
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 | 看门狗驱动 ,包括软件看门狗 和各种硬件看门狗 驱动实现 |
还有其他一些内核目录没介绍,需要的时候可以网上找资料。
希望与诸君共同学习进步!加油!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)