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初始化等
其它非核心代码,例如库文件(因为Linux内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、KVM(虚拟机技术)等
编译脚本、配置文件、帮助文档、版权说明等辅助性文件
一般在每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助。有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解。
Linux内核源代码包含如下目录:
arch
: 包含和硬件体系结构相关的代码
block
:包含块设备驱动程序的代码。
crypto
:英文意思是加密。目录下放了一些各种常见的加密算法的C语言代码实现。
documentation
:内核各部分的通用解释和注释。
drivers
:设备驱动程序,每个不同的驱动占用一个子目录。
fireware
:包含了让计算机读取和理解从设备发来的信号的代码。
举例来说,一个摄像头管理它自己的硬件,但计算机必须了解摄像头给计算机发送的信号。Linux系统会使用vicam固件(firmware)来理解摄像头的通讯。
否则,没有了固件,Linux系统将不知道如何处理摄像头发来的信息。另外,固件同样有助于将Linux系统发送消息给该设备。这样Linux系统可以告诉摄像头重新调整或关闭摄像头。
fs
:fs是file system,所支持的各种文件系统
如EXT、FAT、NTFS、JFFS2等。
fs文件夹内,开发者会看到一些不在文件夹中的文件。这些文件用来控制整个文件系统。例如,mount.h中会包含挂载文件系统的代码。
文件系统是以结构化的方式来存储和管理的存储设备上的文件和目录。每个文件系统都有自己的优点和缺点。这是由文件系统的设计决定的。
举例来说,NTFS文件系统支持的透明压缩(当启用时,会在用户不知道的情况下自动压缩存储文件)。大多数文件系统缺乏此功能,但如果在fs文件夹里编入相应的文件,它们也有这种能力。
include
:存放内核所需、与平台无关的头文件
init
:内核初始化代码。
ipc
:进程间通信的代码。
kernel
:内核最核心的部分,包括进程调度、定时器等
lib
:库文件代码。
mm
:(memory management)内存管理代码
net
:网络相关代码
samples
:
scripts
:用于配置内核的脚本文件。
security
:主要是一个SELinux的模块。
sound
:声卡驱动
tools
:编译过程中一些主机必要工具,这个文件夹中包含了和内核交互的工具。
usr
:早期用户空间代码(所谓的initramfs)
virt
:内核虚拟机KVM
内核一般要做到drivers与arch的软件架构分离,驱动中不包含板级信息,让驱动跨平台。同时内核的通用部分(如kernel、fs、ipc、net等)则与具体的硬件(arch和drivers)剥离。
与内核移植紧密的目录是arch和drivers,有点相关的是include、block、mm、net、lib等目录。
还有一些文件在源代码的根目录下:
COPYING
:许可和授权信息。CREDITS
: 贡献者列表Kbuild
: 这是一个设置一些内核设定的脚本。Kconfig
: 这个脚本会在开发人员配置内核的时候用到,这会在以后的文章中讨论。MAINTAINERS
: 这是一个目前维护者列表,他们的电子邮件地址,主页,和他们负责开发和维护的内核的特定部分或文件。当一个开发者在内核中发现一个问题,并希望能够报告给能够处理这个问题的维护者时,这是是很有用的。Makefile
: linux内核的总Makefile,整个内核工程是用这个Makefile来管理的。README
:提供给开发者想要知道的如何编译内核的信息。REPORTING-BUGS
:这个文档提供如何报告问题的信息。Kconfig文件,它用于设置这个目录里的源代码编译所需的一系列设定。每个支持的处理器架构都在它相应的文件夹中,如arm64、arm32、x86、mips等。
/arch/boot
:
/arch/boot/dts:设备树文件
/arch/kernel:用于存放特定体系结构特有信号量的实现代码和对称多处理器(Symmetric MultiProccessing,简称SMP)相关模块。
/lib:通用函数在特定体系结构的文件,如利用当前体系结构特性实现的strlen和memcpy内存操作函数;与通用的实现方法相比,他们的开销小、更加高效。
/math-emu:模拟FPU的代码,在ARM中,使用/math-xxx代替
/arch/mm:特定体系结构的内存管理文件
/arch/include:特定体系的头文件
Linux内核驱动开发工程师来说,最常接触的就是driver目录驱动程序
是使内核能够沟通和操作硬件或协议(规则和标准)的小程序。没有驱动程序,内核不知道如何与硬件沟通或者处理协议(内核实际上先发送指令给BIOS,然后BIOS传给硬件)。
许多驱动程序是通用驱动程序
,这意味着一个通用键盘驱动可以使内核可以处理几乎所有的键盘。
有些驱动是专用驱动程序
,像苹果和Commodore就分别为苹果电脑和Amiga系统制造了专门的硬件。
Linux内核中已经包含了许多诸如智能手机、苹果、Amiga系统、PS3、Android平板,和许多其他设备的驱动程序。
注意:有些设备的驱动不在本目录中。比如,射频驱动在net和media文件夹下。
acpi : 高级配置和电源接口(ACPI : Advanced Configuration and Power Interface)驱动用来管理电源使用。
amba : 高级微控制器总线架构(AMBA : Advanced Microcontroller Bus Architecture)是与片上系统(SoC)的管理和互连的协议。
ata : 该目录包含PATA和SATA设备的驱动程序。
atm : 异步通信模式(ATM : Asynchronous Transfer Mode)是一种通信标准。
auxdisplay - 这个文件夹提供了三个驱动。LCD 帧缓存(framebuffer)驱动、LCD控制器驱动和一个LCD驱动。
base : 这是个重要的目录包含了固件、系统总线、虚拟化能力等基本的驱动。
bcma : 这些驱动用于使用基于AMBA协议的总线。AMBA是由博通公司开发。
block
: 这些驱动提供对块设备的支持,
bluetooth : 蓝牙是一种安全的无线个人区域网络标准(PANs)。蓝牙驱动就在这个文件夹,它允许系统使用各种蓝牙设备。
bus - 这个目录包含了三个驱动。
cdrom - 这个目录包含两个驱动。
char
- 字符设备驱动。
clk - 这些驱动用于系统时钟。
clocksource - 这些驱动用于作为定时器的时钟。
connector
- 这些驱动使内核知道当进程fork并使用proc连接器更改UID(用户ID)、GID(组ID)和SID(会话ID)
cpufreq - 这些驱动改变CPU的电源能耗。
cpuidle
- 这些驱动用来管理空闲的CPU。一些系统使用多个CPU,其中一个驱动可以让这些CPU负载相当。
crypto - 这些驱动提供加密功能。
dca
- 直接缓存访问(DCA : Direct Cache Access)驱动允许内核访问CPU缓存。
devfreq - 这个驱动程序提供了一个通用的动态电压和频率调整(DVFS : Generic Dynamic Voltage and Frequency Scaling)框架,
dio - 数字输入/输出(DIO :Digital Input/Output)总线驱动允许内核可以使用DIO总线。
dma - 直接内存访问(DMA)驱动允许设备无需CPU直接访问内存。这减少了CPU的负载。
edac - 错误检测和校正( Error Detection And Correction)驱动帮助减少和纠正错误。
eisa - 扩展工业标准结构总线(Extended Industry Standard Architecture)驱动提供内核对EISA总线的支持。
extcon - 外部连接器(EXTernal CONnectors)驱动用于检测设备插入时的变化。例如,extcon会检测用户是否插入了USB驱动器。
firewire - 这些驱动用于控制苹果制造的类似于USB的火线设备。
firmware
- 这些驱动用于和像BIOS(计算机的基本输入输出系统固件)这样的设备的固件通信。
BIOS
用于启动操作系统和控制硬件与设备的固件。gpio
- 通用输入/输出(GPIO :General Purpose Input/Output)是可由用户控制行为的芯片的管脚。
gpu - 这些驱动控制VGA、GPU和直接渲染管理(DRM :Direct Rendering Manager )。
hid - 这驱动用于对USB人机界面设备的支持。
hsi - 这个驱动用于内核访问像Nokia N900这样的蜂窝式调制解调器。
hv - 这个驱动用于提供Linux中的键值对(KVP :Key Value Pair)功能。
hwmon - 硬件监控驱动用于内核读取硬件传感器上的信息。
hwspinlock - 硬件转锁驱动允许系统同时使用两个或者更多的处理器,或使用一个处理器上的两个或更多的核心。
i2c - I2C驱动可以使计算机用I2C协议处理主板上的低速外设。
ide - 这些驱动用来处理像CDROM和硬盘这些PATA/IDE设备。
idle - 这个驱动用来管理Intel处理器的空闲功能。
iio - 工业I/O核心驱动程序用来处理数模转换器或模数转换器。
infiniband
- Infiniband是在企业数据中心和一些超级计算机中使用的一种高性能的端口。
input
- 这里包含了很多驱动,这些驱动都用于输入处理,
iommu
- 输入/输出内存管理单元
(IOMMU :Input/Output Memory Management Unit)驱动用来管理内存管理单元中的IOMMU。
IOMMU
是设备在没有CPU帮助下直接访问内存的桥梁。这有助于减少处理器的负载。ipack - Ipack代表的是IndustryPack。
irqchip
- 这些驱动程序允许硬件的中断请求(IRQ)发送到处理器,暂时挂起一个正在运行的程序而去运行一个特殊的程序(称为一个中断处理程序)。
isdn - 这些驱动用于支持综合业务数字网(ISDN),这是用于同步数字传输语音、视频、数据和其他网络服务使用传统电话网络的电路的通信标准。
leds - 用于LED的驱动。
lguest - lguest用于管理客户机系统的中断。中断是CPU被重要任务打断的硬件或软件信号。CPU接着给硬件或软件一些处理资源。
macintosh - 苹果设备的驱动在这个文件夹里。
mailbox - 这个文件夹(pl320-pci)中的驱动用于管理邮箱系统的连接。
md
- 多设备驱动用于支持磁盘阵列
,一种多块硬盘间共享或复制数据的系统。
media - 媒体驱动提供了对收音机、调谐器、视频捕捉卡、DVB标准的数字电视等等的支持。
memory
- 支持内存的重要驱动。
memstick - 这个驱动用于支持Sony记忆棒。
message - 这些驱动用于运行LSI Fusion MPT(一种消息传递技术)固件的LSI PCI芯片/适配器。
mfd - 多用途设备(MFD)驱动提供了对可以提供诸如电子邮件、传真、复印机、扫描仪、打印机功能的多用途设备的支持。
misc
- 这个目录包含了不适合在其他目录的各种驱动。就像光线传感器驱动。
mmc - MMC卡驱动用于处理用于MMC标准的闪存卡。
mtd
- 内存技术设备(MTD :Memory technology devices)驱动程序用于Linux和闪存的交互,这就就像一层闪存转换层。
新型闪存设备的通用闪存驱动器驱动
。net - 网络驱动提供像AppleTalk、TCP和其他的网络协议。
nfc - 这个驱动是德州仪器的共享传输层之间的接口和NCI核心。
ntb - 不透明的桥接驱动提供了在PCIe系统的不透明桥接。PCIe是一种高速扩展总线标准。
nubus - NuBus是一种32位并行计算总线。用于支持苹果设备。
of
- 此驱动程序提供设备树中创建、访问和解释程序的OF助手。设备树
是一种数据结构,用于描述硬件。
oprofile
- 这个驱动用于从驱动到用户空间进程(运行在用户态下的应用)评测整个系统。
parisc - 这些驱动用于HP生产的PA-RISC架构设备。
parport - 并口驱动提供了Linux下的并口支持。
pci
- 这些驱动提供了PCI总线服务。
pcmcia - 这些是笔记本的pc卡驱动
pinctrl
- 这些驱动用来处理引脚控制设备。引脚控制器可以禁用或启用I/O设备。
platform
-这个文件夹包含了不同的计算机平台的驱动像Acer、Dell、Toshiba、IBM、Intel、Chrombooks等等。
pnp - 即插即用驱动允许用户在插入一个像USB的设备后可以立即使用而不必手动配置设备。
power
- 电源驱动使内核可以测量电池电量,检测充电器和进行电源管理。
pps - Pulse-Per-Second驱动用来控制电流脉冲速率。这用于计时。
ps3 - 这是Sony的游戏控制台驱动- PlayStation3。
ptp - 图片传输协议(PTP)驱动支持一种从数码相机中传输图片的协议。
pwm
- 脉宽调制(PWM)驱动用于控制设备的电流脉冲。主要用于控制像CPU风扇。
rapidio - RapidIO驱动用于管理RapidIO架构,它是一种高性能分组交换,用于电路板上交互芯片的交互技术,也用于互相使用底板的电路板。
regulator
- 校准驱动用于校准电流、温度、或其他可能系统存在的校准硬件。—-用于控制系统中某些设备的电压电流供应
remoteproc - 这些驱动用来管理远程处理器。
rpmsg - 这个驱动用来控制支持大量驱动的远程处理器通讯总线(rpmsg)。
rtc - 实时时钟(RTC)驱动使内核可以读取时钟。
s390 - 用于31/32位的大型机架构的驱动。
sbus - 用于管理基于SPARC的总线驱动。
scsi
- 允许内核使用SCSI标准外围设备。例如,Linux将在与SCSI硬件传输数据时使用SCSI驱动。
sfi -简单固件接口(SFI)驱动允许固件发送信息表给操作系统。这些表的数据称为SFI表。
sh - 该驱动用于支持SuperHway总线。
sn - 该驱动用于支持IOC3串口。
spi
- 这些驱动处理串行设备接口总线(SPI),它是一个在在全双工下运行的同步串行数据链路标准。设备在主/从模式下通信(取决于设备配置)。
ssb - ssb(Sonics Silicon Backplane)驱动提供对在不同博通芯片和嵌入式设备上使用的迷你总线的支持。
staging - 该目录含有许多子目录。这里所有的驱动还需要在加入主内核前经过更多的开发工作。
target
- SCSI设备驱动
tc - 这些驱动用于TURBOchannel,TURBOchannel是数字设备公司开发的32位开放总线。这主要用于DEC工作站。
thermal - thermal驱动使CPU保持较低温度。—Linux温控框架
tty - tty驱动用于管理物理终端连接。
uio
- 该驱动允许用户编译运行在用户空间而不是内核空间的驱动。这使用户驱动不会导致内核崩溃。
运行在用户空间的IO技术
usb - USB设备允许内核使用USB端口。闪存驱动和记忆卡已经包含了固件和控制器,所以这些驱动程序允许内核使用USB接口和与USB设备。
uwb - Ultra-WideBand驱动用来管理短距离,高带宽通信的超低功耗的射频设备
vfio
- 允许设备访问用户空间的VFIO驱动。—-用户态驱动框架
vhost - 这是用于宿主内核中的virtio服务器驱动。用于虚拟化中。
video - 这是用来管理显卡和监视器的视频驱动。
virt - 这些驱动用来虚拟化。
virtio - 这个驱动用来在虚拟PCI设备上使用virtio设备。用于虚拟化中。
vlynq - 这个驱动控制着由德州仪器开发的专有接口。这些都是宽带产品,像WLAN和调制解调器,VOIP处理器,音频和数字媒体信号处理芯片。
vme - WMEbus最初是为摩托罗拉68000系列处理器开发的总线标准
w1 - 这些驱动用来控制one-wire总线。
watchdog - 该驱动管理看门狗定时器,这是一个可以用来检测和恢复异常的定时器。
xen - 该驱动是Xen管理程序系统。这是个允许用户运行多个操作系统在一台计算机的软件或硬件。这意味着xen的代码将允许用户在同一时间的一台计算机上运行两个或更多的Linux系统。用户也可以在Linux上运行Windows、Solaris、FreeBSD、或其他操作系统。
zorro - 该驱动提供Zorro Amiga总线支持。
Linux的内核代码在驱动程序文件夹中以源代码的形式包含了许多驱动程序。
驱动文件夹中的每个文件夹会在下面说明。在配置和 编译内核时,这样有助于你了解驱动程序。否则,用户可能会在编译时加入不必要的或者漏掉重要的驱动。
驱动代码通常会包含一个单行注释来指出驱动的目的。比如,tc的驱动代码,有一行的注释说是用于TURBOchannel总线。由于这些文档,用户应该看驱动前几行的注释来了解它们的用途。
《Linux设备驱动开发详解:基于最新的Linux4.0内核》
Linux内核目录结构介绍(超详细)
LINUX内核目录文件说明以及配置并编译内核的方法
linux内核源码目录结构
Update your browser to view this website correctly. Update my browser now