Linux kernel 目录介绍
kernel 源码结构
arch/
包含各体系结构特定的代码,如 arm、x86、ia64、mips等,在每个体系结构目录下通常都有:
(1) /boot:内核需要的 特定平台代码
(2)/kernel:体系结构特有的代码
(3)/lib:通用函数在特定体系结构的实现
(4) /math-emu:模拟FPU的代码,在ARM中,使用/math-xxx代替
(5) /mm:特定体系结构的内存管理实现
(6) /include:特定体系的头文件
block/
存放块设备相关代码
crypto/
存放加密、压缩、CRC校验等算法相关代码
Documentation/
存放相关说明文档,很多 实用文档,包括 驱动编写等
drivers/
存放 Linux 内核设备驱动程序源码。驱动源码在 Linux 内核源码中站了很大比例,常见外设几乎都有 可参考源码,对驱动开发而言,该目录非常重要。该目录包含众多驱动,目录按照 设备类别 进行分类,如char、block、input、i2c、spi、pci、usb等
firmware/
存放处理器相关的一些特殊固件
fs/
存放所有文件系统代码,如fat、ext2、ext3、ext4、ubifs、nfs、sysfs等
include/
存放内核所需、与平台无关的头文件,与平台相关的头文件已经被移动到arch平台的include目录
init/
包含内核初始化代码
ipc/
存放进程间通信代码
kernel/
包含 Linux 内核管理代码
lib/
库文件代码实现
mm/
存放内存管理代码
net/
存放网络相关代码
samples/
存放提供的一些内核编程范例,如kfifo;后者相关用户态编程范例,如hidraw
scripts/
存放一些脚本文件,如menuconfig脚本
security/
存放系统安全性相关代码
sound/
存放声音、声卡相关驱动
tools/
编译过程中一些主机必要工具
usr/
cpio相关实现
virt/
内核虚拟机KVM
driver 子目录源码结构
drivers/gpio
系统GPIO子系统 和 驱动目录,包括处理器内部GPIO以及外扩GPIO驱动。遵循GPIO子系统的驱动,可通过/sys/class/gpio进行访问
drivers/hwmon
硬件监测相关驱动,如温度传感器、风扇监测等
drivers/i2c
I2C子系统驱动。各I2C控制器的驱动在i2c/busses目录下
drivers/input
输入子系统驱动目录
drivers/input/keyboard
非HID键盘驱动,如GPIO键盘、矩阵键盘等
drivers/input/touchscreen
触摸屏驱动,如处理器的触摸屏控制器驱动、外扩串行触摸屏控制器驱动、串口触摸屏控制器驱动等
drivers/leds
LED子系统和驱动,如GPIO驱动的LED。遵循 LED子系统的驱动 ,可通过/sys/class/leds进行访问
drivers/mfd
多功能器件(Multi-Function Device)驱动。如果一个器件能做多种用途,通常需要借助MFD来完成。
drivers/misc
杂项(Miscellaneous)驱动。特别需要关注<drivers/misc/eeprom/>目录,提供了i2c和spi接口的EEPROM驱动范例,所驱动的设备可通过/sys系统访问
drivers/mmc
SD(Secure Digital)/MMC(Mutimedia Card)卡驱动目录
drivers/mtd
MTD(Memory Technology Device)子系统和驱动,包括NAND、oneNAND等。
注意,UBI的实现也在MTD中
drivers/mtd/nand
NAND FALSH的MTD驱动目录,包括NAND的基础驱动和控制器接口驱动
drivers/net
网络设备驱动,包括MAC、PHY、CAN、USB 网卡、无线、PPP协议等
drivers/net/can
CAN设备驱动。
Linux已经将CAN归类到网络中,采用socket_CAN接口
drivers/net/ethernet
所支持的MAC驱动。
常见厂家的MAC驱动都能找到,如broadcom、davicom、marvell、micrel、smsc等厂家的MAC,处理器自带MAC的驱动也在该目录下
drivers/net/phy
PHY驱动
比如marvell、micrel和smsc的一些PHY驱动
drivers/rtc
RTC子系统和RTC芯片驱动
drivers/spi
SPI子系统和SPI控制器驱动,含GPIO 模拟SPI的驱动
drivers/tty
TTY 驱动
drivers/tty/serial
串口驱动,包括8250串口以及各处理器内部串口驱动实现
drivers/uio
用户空间IO驱动
drivers/usb
USB驱动,包括USB HOST、Gadget、USB转串口以及OTG等支持
drivers/video
Video驱动,包括Framebuffer驱动、显示控制器驱动和背光驱动等。
drivers/video/backlight
背光控制驱动
drivers/video/logo
Linux内核启动LOGO图片目录
drivers/watchdog
看门狗驱动,包括软件看门狗和各种硬件看门狗驱动实现
linux 系统目录
/sys
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| /sys/devices (/sys文件系统最重要的目录结构) 该目录下是全局设备结构体系,包含所有被发现的注册在各种总线上的各种物理设备。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外,即platform devices和system devices。platform devices一般是挂在芯片内部的高速或者低速总线上的各种控制器和外设,它们能被CPU直接寻址;system devices不是外设,而是芯片内部的核心结构,比如CPU,timer等,它们一般没有相关的驱动,但是会有一些体系结构相关的代码来配置它们。
/sys/dev 该目录下有字符设备(block)和块设备(char)两个子目录,里面全是以主次设备号(major:minor)命名的链接文件,链接到/sys/devices。
/sys/class (按功能分类设备) 该目录下包含所有注册在kernel里面的设备类型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下是具体设备的符号链接,这些链接指向/sys/devices/…下的具体设备。设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型;一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。(/sys/class也是构成linux统一设备模型的一部分)
/sys/block (从linux2.6.26版本开始已经移到了/sys/class/block) 代表着系统中当前被发现的所有块设备。按照功能来说防止在/sys/class下会更合适,但由于历史遗留因素而一直存在于/sys/block,但从linux2.6.22内核开始这部分就已经标记为过去时,只有打开了CONFIG_SYSFS_DEPRECATED配置编译才会有这个目录存在,并且其中的内容在从linux2.6.26版本开始已经正式移到了/sys/class/block,旧的接口/sys/block为了向后兼容而保留存在,但其中的内容已经变为了指向它们在/sys/devices/中真实设备的符号链接文件。
/sys/bus (按总线类型分类设备) 一般来说每个子目录(总线类型)下包含两个子目录,一个是devices,另一个是drivers;其中devices下是这个总线类型下的所有设备,这些设备都是符号链接,它们分别指向真正的设备(/sys/devices/…下);而drivers下是所有注册在这个总线上的驱动,每个driver子目录下 是一些可以观察和修改的driver参数。 (它也是构成linux统一设备模型的一部分)
/sys/module 该目录包含所有被载入Kernel的模块,无论这些模块是以内联(inlined)方式编译到内核映像文件中还是编译为外模块(.ko文件)
/sys/fs 该目录用来描述系统中所有的文件系统,包括文件系统本身和按照文件系统分类存放的已挂载点。
/sys/kernel 该目录下存放的是内核中所有可调整的参数
/sys/firmware 该目录下包含对固件对象(firmware object)和属性进行操作和观察的接口,即这里是系统加载固件机制的对用户空间的接口.(关于固件有专用于固件加载的一套API)
/sys/power 该目录下有几个属性文件可以用于控制整个机器的电源状态,如向其中写入控制命令让机器关机/重启等等。
|
/proc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| /proc下文件基本都是只读的,除了/proc/sys目录,它是可写的(查看和修改内核的运行参数)
/proc下数字命令的目录就是对于PID的进程目录
/proc/cmdline 启动时传递给kernel的参数信息(就是bootargs信息) /proc/cpuinfo cpu的信息 /proc/crypto 内核使用的所有已安装的加密密码及细节 /proc/devices 已经加载的设备并分类 /proc/dma 已注册使用的ISA DMA频道列表 /proc/execdomains Linux 内核当前支持的execution domains /proc/fb 帧缓冲设备列表,包括数量和控制它的驱动 /proc/filesystems 内核当前支持的文件系统类型 /proc/interrupts x86架构中的每个IRQ中断数 /proc/iomem 每个物理设备当前在系统内存中的映射 /proc/ioports 一个设备的输入输出所使用的注册端口范围 /proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb /proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理 /proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关 /proc/locks 内核锁住的文件列表 /proc/mdstat 多硬盘,RAID配置信息(md=multiple disks) /proc/meminfo RAM使用的相关信息 /proc/misc 其他的主要设备(设备号为10)上注册的驱动 /proc/modules 所有加载到内核的模块列表 /proc/mounts 系统中使用的所有挂载 /proc/partitions 分区中的块分配信息 /proc/pci 系统中的PCI设备列表 /proc/slabinfo 系统中所有活动的 slab 缓存信息 /proc/stat 所有的CPU活动信息 /proc/uptime 系统已经运行了多久 /proc/swaps 交换空间的使用情况 /proc/version Linux内核版本和gcc版本 /proc/bus 系统总线(Bus)信息,例如pci/usb等 /proc/driver 驱动信息 /proc/fs 文件系统信息 /proc/ide ide设备信息 /proc/irq 中断请求设备信息 /proc/net 网卡设备信息 /proc/scsi scsi设备信息 /proc/tty tty设备信息 /proc/net/dev 显示网络适配器及统计信息 /proc/vmstat 虚拟内存统计信息 /proc/vmcore 内核panic时的内存映像 /proc/diskstats 取得磁盘信息 /proc/schedstat kernel调度器的统计信息 /proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用
以下是/proc目录中进程N的信息 /proc/N/cmdline 进程启动命令 /proc/N/cwd 链接到进程当前工作目录 /proc/N/environ 进程环境变量列表 /proc/N/exe 链接到进程的执行命令文件 /proc/N/fd 包含进程相关的所有的文件描述符 (ls /proc//fd | wc -l 查看某个进程打开多少FD) /proc/N/maps 与进程相关的内存映射信息 /proc/N/mem 指代进程持有的内存,不可读 /proc/N/root 链接到进程的根目录 /proc/N/stat 进程的状态 /proc/N/statm 进程使用的内存的状态 /proc/N/status 进程状态信息,比stat/statm更具可读性 /proc/self 链接到当前正在运行的进程
|