内核源码很复杂,包含多级目录,形成一个庞大的树状结构,通常称为Linux源码目录树。

序号

目录

内容

1

arch/


包含各体系结构特定的代码,如 armx86ia64mips等,在每个体系结构目录下通常都有:
(1) /boot内核需要的 特定平台代码
(2)/kernel体系结构特有的代码
(3)/lib通用函数特定体系结构的实现
(4) /math-emu模拟FPU的代码,在ARM中,使用/math-xxx代替
(5) /mm:特定体系结构的内存管理实现
(6) /include:特定体系的头文件

2

block/

存放块设备相关代码

3

crypto/

存放加密压缩CRC校验等算法相关代码

4

Documentation/

存放相关说明文档,很多 实用文档,包括 驱动编写等

5

drivers/

存放 Linux 内核设备驱动程序源码。
驱动源码在 Linux 内核源码中站了很大比例,常见外设几乎都有 可参考源码,对驱动开发而言,该目录非常重要。
该目录包含众多驱动,目录按照 设备类别 进行分类,如charblockinputi2cspipciusb

6

firmware/

存放处理器相关的一些特殊固件

7

fs/

存放所有文件系统代码,如fatext2ext3ext4ubifsnfssysfs

8

include/

存放内核所需、与平台无关头文件,与平台相关的头文件已经被移动到arch平台的include目录,如 ARM 的头文件目录<arch/arm/include/asm/>

9

init/

包含内核初始化代码

10

ipc/

存放进程间通信代码

11

kernel/

包含 Linux 内核管理代码

12

lib/

库文件代码实现

13

mm/

存放内存管理代码

14

net/

存放网络相关代码

15

samples/

存放提供的一些内核编程范例,如kfifo;后者相关用户态编程范例,如hidraw

16

scripts/

存放一些脚本文件,如menuconfig脚本

17

security/

存放系统安全性相关代码

18

sound/

存放声音声卡相关驱动

19

tools/

编译过程中一些主机必要工具

20

usr/

cpio相关实现

21

virt/

内核虚拟机KVM


Linux 移植通常分为:

序号

分类

1

体系结构级别移植

2

处理器级别移植

3

板级移植

各级别移植难易程度差异很大,工作量和调试方式也各不相同。一般的产品开发人员所进行的内核移植,通常都是板级移植,这是几个级别中最简单的。

Linux内核源码接近一半的代码量是驱动,对某一个特定主板的系统而言,驱动也占据很大的比例,底层开发的很大一部分是驱动相关工作。掌握从众多驱动中找到正确的驱动源码文件,并根据产品的实际需求进行修改调整的方法,能有效促进产品开发的进度。

Linux内核源码树drivers目录很复杂,包含了各种外设驱动。对嵌入式Linux开发而言,通常需要关注的目录 如下表:

序号

目录

说明

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/>目录,提供了i2cspi接口的EEPROM驱动范例,所驱动的设备可通过/sys系统访问

10

drivers/mmc

SDSecure Digital)/MMCMutimedia Card)卡驱动目录

11

drivers/mtd

MTDMemory Technology Device)子系统和驱动,包括NANDoneNAND等。
注意,UBI的实现也在MTD

12

drivers/mtd/nand

NAND FALSHMTD驱动目录,包括NAND基础驱动控制器接口驱动

13

drivers/net

网络设备驱动,包括MACPHYCANUSB 网卡无线PPP协议

14

drivers/net/can

CAN设备驱动。
Linux已经将CAN归类到网络中,采用socket_CAN接口

15

drivers/net/ethernet

所支持的MAC驱动
常见厂家的MAC驱动都能找到,如broadcomdavicommarvellmicrelsmsc等厂家的MAC,处理器自带MAC驱动也在该目录下

16

drivers/net/phy

PHY驱动
比如marvellmicrelsmsc的一些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 HOSTGadgetUSB转串口以及OTG等支持

23

drivers/video

Video驱动,包括Framebuffer驱动显示控制器驱动背光驱动等。

24

drivers/video/backlight

背光控制驱动

25

drivers/video/logo

Linux内核启动LOGO图片目录

26

drivers/watchdog

看门狗驱动,包括软件看门狗和各种硬件看门狗驱动实现

熟悉各类驱动源码树中的大概位置,能帮助在开发过程中快速进行驱动源码查找和定位。一个系统到底用了哪些代码,与系统本身外设相关,也与主板配置文件相关。