Linux内核目录文件说明 - STEMHA's Blog

Linux内核目录文件说明

前言

Linux内核也是一个抢占式多任务内核。这意味该内核可以暂停一些任务来保证任何应用都有机会来使用CPU。比如:

如果一个应用正在运行但是正在等待一些数据,内核会把这个应用暂停并允许其他的程序使用新释放的CPU资源,直到数据到来。
否则的话,系统就会浪费资源给那些正在等待数据或者其他程序执行的的任务。
内核将会强制程序去等待或者停止使用CPU。没有内核的允许,应用程序不能脱离暂停或者使用CPU。

Linux设计思想是“一切皆文件”:

设备作为文件显示在/dev文件夹下,如果一个用户想要访问在存储卡上的数据,他们能通过设备文件访问这些数据。

已编译的Linux内核:

在引导文件夹(/boot),用户会看到诸如“vmlinux”或者“vmlinuz”的文件。这两者都是已编译的Linux内核。
以“z”结尾的是已压缩的。“vm”代表虚拟内存。
SPARC处理器的系统上,用户可以看见一个zImage文件。部分用户可以发现一个bzImage文件,这是一个已压缩的Linux内核。
这些引导文件都是不能更改的,除非用户知道他们正在做什么。否则系统会变成无法引导,启动不了。

Linux内核是所有Linux系统的核心。如果有任何恶意代码控制或破害了内核的任何一部分,那么系统会严重受损,文件可能被删除或损坏,私人信息可能被盗等等。

注意事项: 绝不在内核源代码内移动文件,除非你知道你在做什么。否则,编译会由于丢失文件失败。

内核在操作系统目录下的路径一般为:/usr/src/

Linux内核源代码划分

Linux内核的文件夹结构保持相对稳定。内核开发者会做一些修改,但总体来说,这些设置对整个内核版本都是一样。驱动程序文件夹的布局也基本保持一样。
Linux内核源代码包括三个主要部分:

  1. 内核核心代码,各个子系统和子模块,以及其它的支撑子系统,例如电源管理、Linux初始化等

  2. 其它非核心代码,例如库文件(因为Linux内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、KVM(虚拟机技术)等

  3. 编译脚本、配置文件、帮助文档、版权说明等辅助性文件

一般在每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助。有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解。

Linux内核源代码一级目录

目录文件

Linux内核源代码包含如下目录:

  1. arch: 包含和硬件体系结构相关的代码

    • 每种平台占一个相应的目录,如i386、arm、arm64、powerpc、mips等。Linux内核目前已经支持30种左右的体系结构。
    • 在arch目录下,存放的是各个平台以及各个平台的芯片对Linux内核进程调度、内存管理、中断等的支持,以及每个具体的SoC和电路板的板级支持代码。
    • 随着时间的推移,一些新的处理器将被支持,有些会被放弃。
    • /arch/boot包含了系统启动的相关信息和make之后生成的启动镜像文件bzImage。
  2. block:包含块设备驱动程序的代码。

    • 该目录用于实现块设备的基本框架和块设备的I/O调度算法
    • 块设备是以数据块方式接收和发送的数据的设备。数据块都是一块一块的数据而不是持续的数据流。
  3. crypto:英文意思是加密。目录下放了一些各种常见的加密算法的C语言代码实现。

    • 常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
  4. documentation:内核各部分的通用解释和注释。

  5. drivers:设备驱动程序,每个不同的驱动占用一个子目录。

    • 每个文件夹都以硬件的种类或者型号命名。
    • 如char、block、net、mtd、i2c等。
    • 键盘和鼠标驱动也在这个input文件夹中
  6. fireware:包含了让计算机读取和理解从设备发来的信号的代码。

    举例来说,一个摄像头管理它自己的硬件,但计算机必须了解摄像头给计算机发送的信号。Linux系统会使用vicam固件(firmware)来理解摄像头的通讯。
    否则,没有了固件,Linux系统将不知道如何处理摄像头发来的信息。另外,固件同样有助于将Linux系统发送消息给该设备。这样Linux系统可以告诉摄像头重新调整或关闭摄像头。
  7. fs:fs是file system,所支持的各种文件系统

    • 如EXT、FAT、NTFS、JFFS2等。

    • fs文件夹内,开发者会看到一些不在文件夹中的文件。这些文件用来控制整个文件系统。例如,mount.h中会包含挂载文件系统的代码。

    • 文件系统是以结构化的方式来存储和管理的存储设备上的文件和目录。每个文件系统都有自己的优点和缺点。这是由文件系统的设计决定的。

      举例来说,NTFS文件系统支持的透明压缩(当启用时,会在用户不知道的情况下自动压缩存储文件)。大多数文件系统缺乏此功能,但如果在fs文件夹里编入相应的文件,它们也有这种能力。
  8. include:存放内核所需、与平台无关的头文件

    • 内核API级别头文件。
    • 与系统相关的头文件放置在include/linux子目录下。
    • 与平台相关的头文件已经被移动到 arch 平台的include 目录,如 ARM 的头文件目录<arch/arm/include/asm/>
  9. init:内核初始化代码。

    • 包含了内核启动的处理代码(INITiation)main.c是内核的核心文件,这是用来衔接所有的其他文件的源代码主文件。
    • 著名的start_kernel()就位于init/main.c文件中。
  10. ipc:进程间通信的代码。

    • 用于实现System V的进程间通信(Inter Process Communication,IPC)模块 .
    • 此文件夹中的代码是作为内核与进程之间的通信层。内核控制着硬件,因此程序只能请求内核来执行任务。
    • 假设用户有一个打开DVD托盘的程序。程序不直接打开托盘,该程序通知内核,然后,内核给硬件发送一个信号去打开托盘。
    • 这里的代码同样管理kill信号。
      • 举例来说,当系统管理员打开进程管理器去关闭一个已经锁死的程序,这个关闭程序的信号被称为kill信号。
      • 内核接收到信号,然后内核会要求程序停止或直接把进程从内存和CPU中移除(取决于kill的类型)。
    • 命令行中的管道同样用于进程间通信。
      • 管道会告诉内核在某个内存页上写入输出数据。程序或者命令得到的数据是来自内存页上的某个给定的指针。
  11. kernel:内核最核心的部分,包括进程调度、定时器等

    • 和平台相关的一部分代码放在arch/*/kernel目录下。
    • 这个文件夹中的代码控制内核本身
    • 在该文件夹下有个”power”文件夹,这里的代码可以使计算机重新启动、关机和挂起。
  12. lib:库文件代码。

    • 这里的库函数和C语言的库函数不一样。在内核编程中是不能用C语言标准库函数,此处lib目录下的库函数就是用来替代那些标准库函数的。
    • 例如在内核中要打印信息不能用printf,而要用printk,这个printk就是这个lib目录下的。
  13. mm:(memory management)内存管理代码

    • 和平台相关的一部分代码放在arch/*/mm目录下。
    • 内存并不是任意存储在RAM芯片上的。相反,内核小心地将数据放在RAM芯片上。内核不会覆盖任何正在使用或保存重要数据的内存区域。
  14. net:网络相关代码

    • 实现各种常见的网络协议。
  15. samples:

    • 存放提供的一些内核编程范例,如kfifo;后者相关用户态编程范例,如hidraw
    • 此文件夹包含了程序示例和正在编写中的模块代码。
      • 假设一个新的模块引入了一个想要的有用功能,但没有程序员说它已经可以正常运行在内核上。那么,这些模块就会移到这里。这给了新内核程序员一个机会通过这个文件夹来获得帮助,或者选择一个他们想要协助开发的模块。
  16. scripts:用于配置内核的脚本文件。

    • 这些脚本文件不是linux内核工作时使用的,而是用来辅助linux内核的配置和编译。
    • 这个目录下的脚本不需要详细的分析,只需要通过外围来重点学会配置和编译linux内核即可。
    • 最好不要改变这个文件夹内的任何东西。否则,可能无法配置或编译内核。
  17. security:主要是一个SELinux的模块。

  18. sound:声卡驱动

    • ALSA、OSS音频设备的驱动核心代码和常用设备驱动。
  19. tools:编译过程中一些主机必要工具,这个文件夹中包含了和内核交互的工具。

  20. usr:早期用户空间代码(所谓的initramfs)

    • 实现用于打包和压缩的cpio等。
    • 对于vmlinuz和其他类似的文件,usr文件夹中的代码在内核编译完成后创建这些文件。
    • 该目录中的代码为内核尚未完全启动时执行用户空间代码提供了支持
  21. virt:内核虚拟机KVM

内核一般要做到drivers与arch的软件架构分离,驱动中不包含板级信息,让驱动跨平台。同时内核的通用部分(如kernel、fs、ipc、net等)则与具体的硬件(arch和drivers)剥离。
与内核移植紧密的目录是arch和drivers,有点相关的是include、block、mm、net、lib等目录。

普通文件

还有一些文件在源代码的根目录下:

  1. COPYING :许可和授权信息。
    • Linux内核在GPLv2许可证下授权。该许可证授予任何人有权免费去使用、修改、分发和共享源代码和编译代码。然而,没有人可以出售源代码。
  2. CREDITS : 贡献者列表
  3. Kbuild : 这是一个设置一些内核设定的脚本。
    • Kbuild是Kernel build(内核编译)的意思,这个文件就是linux内核特有的内核编译体系需要用到的文件。
    • 打个比方,这个脚本设定一个ARCH变量,这是开发者想要生成的内核支持的处理器类型。
  4. Kconfig : 这个脚本会在开发人员配置内核的时候用到,这会在以后的文章中讨论。
  5. MAINTAINERS : 这是一个目前维护者列表,他们的电子邮件地址,主页,和他们负责开发和维护的内核的特定部分或文件。当一个开发者在内核中发现一个问题,并希望能够报告给能够处理这个问题的维护者时,这是是很有用的。
  6. Makefile : linux内核的总Makefile,整个内核工程是用这个Makefile来管理的。
    • 这个脚本是编译内核的主要文件。这个文件将编译参数和编译所需的文件和必要的信息传给编译器。
    • 用来组织内核的各模块,记录了个模块间的相互这间的联系和依托关系
    • 仔细阅读各子目录下的Makefile文件对弄清各个文件这间的联系和依托关系很有帮助。
  7. README :提供给开发者想要知道的如何编译内核的信息。
  8. REPORTING-BUGS :这个文档提供如何报告问题的信息。

Linux内核源代码二级目录

arch目录

Kconfig文件,它用于设置这个目录里的源代码编译所需的一系列设定。每个支持的处理器架构都在它相应的文件夹中,如arm64、arm32、x86、mips等。

/arch/boot

  • 内核需要的特定平台代码,包含了当前平台上系统引导过程使用的部分或全部代码。这部分代码应用于对应平台,用于完成向系统内存装载内核镜像的工作。
  • 包含了系统启动的相关信息和make之后生成的启动镜像文件bzImage

/arch/boot/dts:设备树文件
/arch/kernel:用于存放特定体系结构特有信号量的实现代码和对称多处理器(Symmetric MultiProccessing,简称SMP)相关模块。
/lib:通用函数在特定体系结构的文件,如利用当前体系结构特性实现的strlen和memcpy内存操作函数;与通用的实现方法相比,他们的开销小、更加高效。
/math-emu:模拟FPU的代码,在ARM中,使用/math-xxx代替
/arch/mm:特定体系结构的内存管理文件
/arch/include:特定体系的头文件

driver目录

Linux内核驱动开发工程师来说,最常接触的就是driver目录
驱动程序是使内核能够沟通和操作硬件或协议(规则和标准)的小程序。没有驱动程序,内核不知道如何与硬件沟通或者处理协议(内核实际上先发送指令给BIOS,然后BIOS传给硬件)。

通用驱动程序与专用驱动程序

许多驱动程序是通用驱动程序,这意味着一个通用键盘驱动可以使内核可以处理几乎所有的键盘。
有些驱动是专用驱动程序,像苹果和Commodore就分别为苹果电脑和Amiga系统制造了专门的硬件。
Linux内核中已经包含了许多诸如智能手机、苹果、Amiga系统、PS3、Android平板,和许多其他设备的驱动程序。

注意:有些设备的驱动不在本目录中。比如,射频驱动在net和media文件夹下。

目录与文件

  1. accessibility :这些驱动提供支持一些辅助设备。
  • 在Linux 3.9.4中,这个文件夹中只有一个驱动就是盲文设备驱动。
  1. acpi : 高级配置和电源接口(ACPI : Advanced Configuration and Power Interface)驱动用来管理电源使用。

  2. amba : 高级微控制器总线架构(AMBA : Advanced Microcontroller Bus Architecture)是与片上系统(SoC)的管理和互连的协议。

    • SoC是一块包含许多或所有必要的计算机组件的芯片。这里的AMBA驱动让内核能够运行在这上面。
  3. ata : 该目录包含PATA和SATA设备的驱动程序。

    • 串行ATA(SATA)是一种连接主机总线适配器到像硬盘那样的存储器的计算机总线接口。
    • 并行ATA(PATA)用于连接存储设备,如硬盘驱动器,软盘驱动器,光盘驱动器的标准。PATA就是我们所说的IDE。
  4. atm : 异步通信模式(ATM : Asynchronous Transfer Mode)是一种通信标准。

    • 这里有各种接到PCI桥的驱动(他们连接到PCI总线)和以太网控制器(控制以太网通信的集成电路芯片)。
  5. auxdisplay - 这个文件夹提供了三个驱动。LCD 帧缓存(framebuffer)驱动、LCD控制器驱动和一个LCD驱动。

    • 这些驱动用于管理液晶显示器。
  6. base : 这是个重要的目录包含了固件、系统总线、虚拟化能力等基本的驱动。

  7. bcma : 这些驱动用于使用基于AMBA协议的总线。AMBA是由博通公司开发。

  8. block : 这些驱动提供对块设备的支持,

    • 像软驱、SCSI磁带、TCP网络块设备等等。
  9. bluetooth : 蓝牙是一种安全的无线个人区域网络标准(PANs)。蓝牙驱动就在这个文件夹,它允许系统使用各种蓝牙设备。

    • 例如,一个蓝牙鼠标不用电缆,并且计算机有一个电子狗(小型USB接收器)。Linux系统必须能够知道进入电子狗的信号,否则蓝牙设备无法工作。
  10. bus - 这个目录包含了三个驱动。

    • 第一个转换ocp接口协议到scp协议
    • 第二个是设备间的互联驱动
    • 第三个是用于处理互联中的错误处理
  11. cdrom - 这个目录包含两个驱动。

    • 一个是cd-rom,包括DVD和CD的读写。
    • 第二个是gd-rom(只读GB光盘),GD光盘是1.2GB容量的光盘,这像一个更大的CD或者更小的DVD。GD通常用于世嘉游戏机中。
  12. char - 字符设备驱动。

    • 字符设备每次传输数据传输一个字符。
    • 这个文件夹里的驱动包括打印机、PS3闪存驱动、东芝SMM驱动和随机数发生器驱动等。
  13. clk - 这些驱动用于系统时钟。

  14. clocksource - 这些驱动用于作为定时器的时钟。

  15. connector- 这些驱动使内核知道当进程fork并使用proc连接器更改UID(用户ID)、GID(组ID)和SID(会话ID)

    • 内核需要知道什么时候进程fork(CPU中运行多个任务)并执行。否则,内核可能会低效管理资源。
  16. cpufreq - 这些驱动改变CPU的电源能耗。

  17. cpuidle - 这些驱动用来管理空闲的CPU。一些系统使用多个CPU,其中一个驱动可以让这些CPU负载相当。

  18. crypto - 这些驱动提供加密功能。

  19. dca - 直接缓存访问(DCA : Direct Cache Access)驱动允许内核访问CPU缓存。

    • CPU缓存就像CPU内置的RAM。CPU缓存的速度比RAM更快。然而,CPU缓存的容量比RAM小得多。CPU在这个缓存系统上存储了最重要的和执行的代码。
  20. devfreq - 这个驱动程序提供了一个通用的动态电压和频率调整(DVFS : Generic Dynamic Voltage and Frequency Scaling)框架,

    • 可以根据需要改变CPU频率来节约能源。也就是CPU节能。
  21. dio - 数字输入/输出(DIO :Digital Input/Output)总线驱动允许内核可以使用DIO总线。

  22. dma - 直接内存访问(DMA)驱动允许设备无需CPU直接访问内存。这减少了CPU的负载。

  23. edac - 错误检测和校正( Error Detection And Correction)驱动帮助减少和纠正错误。

  24. eisa - 扩展工业标准结构总线(Extended Industry Standard Architecture)驱动提供内核对EISA总线的支持。

  25. extcon - 外部连接器(EXTernal CONnectors)驱动用于检测设备插入时的变化。例如,extcon会检测用户是否插入了USB驱动器。

  26. firewire - 这些驱动用于控制苹果制造的类似于USB的火线设备。

  27. firmware - 这些驱动用于和像BIOS(计算机的基本输入输出系统固件)这样的设备的固件通信。

    • BIOS用于启动操作系统和控制硬件与设备的固件。
    • 一些BIOS允许用户超频CPU。
  28. gpio - 通用输入/输出(GPIO :General Purpose Input/Output)是可由用户控制行为的芯片的管脚。

    • 这里的驱动就是控制GPIO。
  29. gpu - 这些驱动控制VGA、GPU和直接渲染管理(DRM :Direct Rendering Manager )。

    • VGA是640*480的模拟计算机显示器或是简化的分辨率标准。DRM是一个Unix渲染系统。
  30. hid - 这驱动用于对USB人机界面设备的支持。

  31. hsi - 这个驱动用于内核访问像Nokia N900这样的蜂窝式调制解调器。

  32. hv - 这个驱动用于提供Linux中的键值对(KVP :Key Value Pair)功能。

  33. hwmon - 硬件监控驱动用于内核读取硬件传感器上的信息。

    • 比如,CPU上有个温度传感器。那么内核就可以追踪温度的变化并相应地调节风扇的速度。
  34. hwspinlock - 硬件转锁驱动允许系统同时使用两个或者更多的处理器,或使用一个处理器上的两个或更多的核心。

  35. i2c - I2C驱动可以使计算机用I2C协议处理主板上的低速外设。

    • 系统管理总线(SMBus :System Management Bus)驱动管理SMBus,这是一种用于轻量级通信的two-wire总线。
  36. ide - 这些驱动用来处理像CDROM和硬盘这些PATA/IDE设备。

  37. idle - 这个驱动用来管理Intel处理器的空闲功能。

  38. iio - 工业I/O核心驱动程序用来处理数模转换器或模数转换器。

  39. infiniband - Infiniband是在企业数据中心和一些超级计算机中使用的一种高性能的端口。

    • 这个目录中的驱动用来支持Infiniband硬件。
  40. input - 这里包含了很多驱动,这些驱动都用于输入处理,

    • 包括游戏杆、鼠标、键盘、游戏端口(旧式的游戏杆接口)、遥控器、触控、耳麦按钮和许多其他的驱动。
    • 如今的操纵杆使用USB端口,但是在上世纪80、90年代,操纵杆是插在游戏端口的。
  41. iommu - 输入/输出内存管理单元(IOMMU :Input/Output Memory Management Unit)驱动用来管理内存管理单元中的IOMMU。

    • IOMMU连接DMA IO总线到内存上。IOMMU是设备在没有CPU帮助下直接访问内存的桥梁。这有助于减少处理器的负载。
  42. ipack - Ipack代表的是IndustryPack。

    • 这个驱动是一个虚拟总线,允许在载体和夹板之间操作。
  43. irqchip - 这些驱动程序允许硬件的中断请求(IRQ)发送到处理器,暂时挂起一个正在运行的程序而去运行一个特殊的程序(称为一个中断处理程序)。

  44. isdn - 这些驱动用于支持综合业务数字网(ISDN),这是用于同步数字传输语音、视频、数据和其他网络服务使用传统电话网络的电路的通信标准。

  45. leds - 用于LED的驱动。

  46. lguest - lguest用于管理客户机系统的中断。中断是CPU被重要任务打断的硬件或软件信号。CPU接着给硬件或软件一些处理资源。

  47. macintosh - 苹果设备的驱动在这个文件夹里。

  48. mailbox - 这个文件夹(pl320-pci)中的驱动用于管理邮箱系统的连接。

  49. md- 多设备驱动用于支持磁盘阵列,一种多块硬盘间共享或复制数据的系统。

  50. media - 媒体驱动提供了对收音机、调谐器、视频捕捉卡、DVB标准的数字电视等等的支持。

    • 驱动还提供了对不同通过USB或火线端口插入的多媒体设备的支持。
  51. memory - 支持内存的重要驱动。

  52. memstick - 这个驱动用于支持Sony记忆棒。

  53. message - 这些驱动用于运行LSI Fusion MPT(一种消息传递技术)固件的LSI PCI芯片/适配器。

    • LSI大规模集成,这代表每片芯片上集成了几万晶体管、
  54. mfd - 多用途设备(MFD)驱动提供了对可以提供诸如电子邮件、传真、复印机、扫描仪、打印机功能的多用途设备的支持。

    • 这里的驱动还给MFD设备提供了一个通用多媒体通信端口(MCP)层。
  55. misc - 这个目录包含了不适合在其他目录的各种驱动。就像光线传感器驱动。

  56. mmc - MMC卡驱动用于处理用于MMC标准的闪存卡。

  57. mtd- 内存技术设备(MTD :Memory technology devices)驱动程序用于Linux和闪存的交互,这就就像一层闪存转换层。

    • 其他块设备和字符设备的驱动程序不会以闪存设备的操作方式来做映射。尽管USB记忆卡和SD卡是闪存设备,但它们不使用这个驱动,因为他们隐藏在系统的块设备接口后。
    • 这个驱动用于新型闪存设备的通用闪存驱动器驱动
  58. net - 网络驱动提供像AppleTalk、TCP和其他的网络协议。

    • 这些驱动也提供对调制解调器、USB 2.0的网络设备、和射频设备的支持。
  59. nfc - 这个驱动是德州仪器的共享传输层之间的接口和NCI核心。

  60. ntb - 不透明的桥接驱动提供了在PCIe系统的不透明桥接。PCIe是一种高速扩展总线标准。

  61. nubus - NuBus是一种32位并行计算总线。用于支持苹果设备。

  62. of - 此驱动程序提供设备树中创建、访问和解释程序的OF助手。设备树是一种数据结构,用于描述硬件。

  63. oprofile - 这个驱动用于从驱动到用户空间进程(运行在用户态下的应用)评测整个系统。

    • 这帮助开发人员找到性能问题—-性能分析机制-是用于 Linux 的若干种评测和性能监控工具中的一种
  64. parisc - 这些驱动用于HP生产的PA-RISC架构设备。

    • PA-RISC是一种特殊指令集的处理器。
  65. parport - 并口驱动提供了Linux下的并口支持。

  66. pci - 这些驱动提供了PCI总线服务。

  67. pcmcia - 这些是笔记本的pc卡驱动

  68. pinctrl - 这些驱动用来处理引脚控制设备。引脚控制器可以禁用或启用I/O设备。

  69. platform -这个文件夹包含了不同的计算机平台的驱动像Acer、Dell、Toshiba、IBM、Intel、Chrombooks等等。

  70. pnp - 即插即用驱动允许用户在插入一个像USB的设备后可以立即使用而不必手动配置设备。

  71. power - 电源驱动使内核可以测量电池电量,检测充电器和进行电源管理。

  72. pps - Pulse-Per-Second驱动用来控制电流脉冲速率。这用于计时。

  73. ps3 - 这是Sony的游戏控制台驱动- PlayStation3。

  74. ptp - 图片传输协议(PTP)驱动支持一种从数码相机中传输图片的协议。

  75. pwm - 脉宽调制(PWM)驱动用于控制设备的电流脉冲。主要用于控制像CPU风扇。

  76. rapidio - RapidIO驱动用于管理RapidIO架构,它是一种高性能分组交换,用于电路板上交互芯片的交互技术,也用于互相使用底板的电路板。

  77. regulator - 校准驱动用于校准电流、温度、或其他可能系统存在的校准硬件。—-用于控制系统中某些设备的电压电流供应

  78. remoteproc - 这些驱动用来管理远程处理器。

  79. rpmsg - 这个驱动用来控制支持大量驱动的远程处理器通讯总线(rpmsg)。

    • 这些总线提供消息传递设施,促进客户端驱动程序编写自己的连接协议消息。
    • 该基础架构允许主处理器上的 Linux 操作系统管理远程处理器上远程软件环境的生命周期和通信-用于在 AMP 环境中的操作系统之间实现 IPC 的 rpmsg 组件和 API
  80. rtc - 实时时钟(RTC)驱动使内核可以读取时钟。

  81. s390 - 用于31/32位的大型机架构的驱动。

  82. sbus - 用于管理基于SPARC的总线驱动。

  83. scsi - 允许内核使用SCSI标准外围设备。例如,Linux将在与SCSI硬件传输数据时使用SCSI驱动。

  84. sfi -简单固件接口(SFI)驱动允许固件发送信息表给操作系统。这些表的数据称为SFI表。

  85. sh - 该驱动用于支持SuperHway总线。

  86. sn - 该驱动用于支持IOC3串口。

  87. spi - 这些驱动处理串行设备接口总线(SPI),它是一个在在全双工下运行的同步串行数据链路标准。设备在主/从模式下通信(取决于设备配置)。

  88. ssb - ssb(Sonics Silicon Backplane)驱动提供对在不同博通芯片和嵌入式设备上使用的迷你总线的支持。

  89. staging - 该目录含有许多子目录。这里所有的驱动还需要在加入主内核前经过更多的开发工作。

  90. target - SCSI设备驱动

  91. tc - 这些驱动用于TURBOchannel,TURBOchannel是数字设备公司开发的32位开放总线。这主要用于DEC工作站。

  92. thermal - thermal驱动使CPU保持较低温度。—Linux温控框架

  93. tty - tty驱动用于管理物理终端连接。

  94. uio - 该驱动允许用户编译运行在用户空间而不是内核空间的驱动。这使用户驱动不会导致内核崩溃。

    • 运行在用户空间的IO技术
  95. usb - USB设备允许内核使用USB端口。闪存驱动和记忆卡已经包含了固件和控制器,所以这些驱动程序允许内核使用USB接口和与USB设备。

  96. uwb - Ultra-WideBand驱动用来管理短距离,高带宽通信的超低功耗的射频设备

  97. vfio - 允许设备访问用户空间的VFIO驱动。—-用户态驱动框架

  98. vhost - 这是用于宿主内核中的virtio服务器驱动。用于虚拟化中。

  99. video - 这是用来管理显卡和监视器的视频驱动。

  100. virt - 这些驱动用来虚拟化。

  101. virtio - 这个驱动用来在虚拟PCI设备上使用virtio设备。用于虚拟化中。

  102. vlynq - 这个驱动控制着由德州仪器开发的专有接口。这些都是宽带产品,像WLAN和调制解调器,VOIP处理器,音频和数字媒体信号处理芯片。

  103. vme - WMEbus最初是为摩托罗拉68000系列处理器开发的总线标准

  104. w1 - 这些驱动用来控制one-wire总线。

  105. watchdog - 该驱动管理看门狗定时器,这是一个可以用来检测和恢复异常的定时器。

  106. xen - 该驱动是Xen管理程序系统。这是个允许用户运行多个操作系统在一台计算机的软件或硬件。这意味着xen的代码将允许用户在同一时间的一台计算机上运行两个或更多的Linux系统。用户也可以在Linux上运行Windows、Solaris、FreeBSD、或其他操作系统。

  107. zorro - 该驱动提供Zorro Amiga总线支持。

阅读驱动代码的说明 

Linux的内核代码在驱动程序文件夹中以源代码的形式包含了许多驱动程序。
驱动文件夹中的每个文件夹会在下面说明。在配置和 编译内核时,这样有助于你了解驱动程序。否则,用户可能会在编译时加入不必要的或者漏掉重要的驱动。
驱动代码通常会包含一个单行注释来指出驱动的目的。比如,tc的驱动代码,有一行的注释说是用于TURBOchannel总线。由于这些文档,用户应该看驱动前几行的注释来了解它们的用途。

参考资料

《Linux设备驱动开发详解:基于最新的Linux4.0内核》
Linux内核目录结构介绍(超详细)
LINUX内核目录文件说明以及配置并编译内核的方法
linux内核源码目录结构

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×