Linux内核源码结构
阅读数:2052 评论数:0
跳转到新版页面分类
Linux
正文
一、官网
二、源代码结构
arch目录 |
包含了所有硬件体系结构特定的内核代码,每种硬件平台占一个相应的目录。在x86体系结构下,包括kernel、mm、lib等子目录,分别是与体系结构相关的核心、内存管理、库代码。 内核中90%以上的汇编源码在arch目录内,随着内核版本的更新,一些新的体系结构被支持,一些则已经被丢弃。 |
block目录 |
块设备驱动程序I/O调度。 块设备是以数据块方式接收和发送的数据的设备。 |
crypto目录 | 常用的加密和散列算法,还有一些压缩和CRC校验算法。 |
Documentation目录 | 内核各部分的通用解释和注释,内核文档,包括CodingStyle等。 |
drivers目录 | 包含了内核中所有设备驱动程序,各个不同的驱动占用一个子目录。 |
fs目录 | 包含了所有文件系统的代码,如ext2、vfat、proc。 |
include目录 | 包含了建立内核代码时所需的大部分包含文件,这个模块利用其它模块重建内核。每种体系结构都有相应的子目录 ,与系统相关的头文件位置放在include/linux子目录下。 |
init目录 | 包含了内核的初始化代码,这是内核开始工作的起点,著名的start_kernel()就位于init/main.c文件中。(main.c, function start_kernel) |
ipc目录 | 包含了进程间通信的代码 |
kernel目录 | 包含了主内核代码,内核最核心的部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/kernel下。 |
lib目录 | 包含了与体系结构无关的内核代码 |
mm目录 | 包含了所有内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下 |
modules目录 | 包含了可动态加载的模块。 |
net目录 | 包含了内核的网络代码 |
scripts目录 | 包含了配置核心的脚本文件。 |
security目录 | 主要是一个SELinux模块。 |
sound目录 | ALSA.OSS 音频设备的驱动核心代码和常用驱动设备 |
usr目录 | 用于打包和压缩的cpio等。 |
内核一般要做到driver和arch的软件架构分离,驱动中不包含板级信息,让驱动跨平台,同时kernel中通用的部分(如kernel, fs,net,ipc等)则与具体的硬件(arch和driver剥离)
1、头文件
头文件主要分为Linux内核标准头文件、与体系结构相关的头文件、与硬件相关的头文件。
Linux内核标准头文件位于顶层的include目录中,主要被C语言代码文件引用。
与体系结构相关的头文件位于arch目录下的子目录中,arch目录下的每个子目录对应着一种体系结构,此类头文件主要被汇编语言代码文件和C语言代码文件引用。
2、体系结构
arm体系 | 英国Acron公司所设计,它是RISC处理器,具有耗电少、功能强等特点,广泛应用 于移动通讯领域 |
x86体系 | intel公司设计,多用于PC领域 |
Mips体系 | MIPS公司开发,广泛应用于电子产品、数字娱乐、多媒体产品,具有高性能、功耗小、代码量少的特点。 |
arch目录用于存放系统结构的相关代码,其下的每个子目录都与一种体系结构对应,每个体系结构目录下包含的子目录一般至少有名为kernel、lib、mm、boot的子目录。
kernel子目录用于存放特定体系结构特有信号量的实现代码和对称处理器相关的模块。
lib子目录用于存储依赖当前体系结构的辅助功能的代码,与通用的实现方法相比,有开销小、更高效的特点。
mm子目录用于存储体系结构特定的内存管理模块。
boot子目录包含了当前平台上系统引导过程使用的部分或者全部代码,用于完成向系统内存装载内存镜像的工作。
三、Documentation目录
ABI目录 | 内核信息,用户空间ABI和相关接口稳定性。 |
CodingStyle/ | 指向process/coding-style.rst |
DMA-API.txt | DMA API、pci_API及非一致性内存机器的扩展。 |
DMA-API-HOWTO.txt | 动态DMA指南。 |
DMA-ISA-LPC.txt | 对于ISA(和LPC)设备怎么使用DMA。 |
DMA-attributes.txt | DMA域可以包含的各种属性 |
EDID/ | 自定义EDID for broken gfx/displays |
IPMI.txt | Linux Intelligent Platform Management Interface(IPMI,Linux智能平台管理接口)驱动信息。 |
IRQ-affinity.txt | 在SMP上确定哪一个CPU处理哪一种中断事件。 |
IRQ-domain.txt | 中断计数信息和设置IRQ域。 |
IRQ.txt | 描述什么是IRQ。 |
Intel-IOMMU.txt | Intel IOMMU虚拟化支持的基本信息。 |
Makefile | 如果不接触编译系统,可以不用关注。 |
PCI/ | PCI驱动的相关信息。 |
RCU/ | RCU信息(read-copy update)。 |
SAK.txt | Secure Attention Keys |
SM501.txt | Silicon Motion SM501多媒体协处理芯片。 |
accounting/ | accounting和taskstats文档。 |
acpi/ | 内核中ACPI相关的钩子信息 |
admin-guide/ | Linux用户和系统管理员的相关信息。 |
aoe/ | AoE(ATA over Ethernet)示例描述 |
arm/ | ARM体系架构的Linux相关信息。 |
arm64/ | 64位ARM体系架构Linux相关信息。 |
auxdisplay/ | misc LCD驱动文档。 |
backligth/ | 平板显示器中控制背景光的相关信息。 |
bcache.txt/ | 基于快速SSDs的Block-layer 缓存,用于提高slow或raid I/O性能。 |
block/ | 阻塞式I/O(BIO) 层相关信息。 |
blockdev/ | block 设备或驱动的信息。 |
bt8xxgpio.txt | 为了使用GPIO,怎么修改bt8xx显卡。 |
btmrv1.txt | Marvell 蓝牙驱动使用说明 |
bus-devices/ | TI GPMC(General Purpose Memory Controller) |
bus-virt-phys-mapping.txt | 怎样从设备驱动器访问IO内存。 |
cachetlb.txt | cache/TLB 刷新接口 |
cdrom/ | CD-ROM驱动信息 |
cgroup-v1/ | cgroups v1特性 |
cgroup-v2/ | cgroups v2特性 |
circular-buffers.txt | 怎么使用存在的环式缓存硬件。 |
clk.txt | common clock framework信息 |
cma/ | Continuous Memory Area (CMA) debugfs 接口 |
conf.py | 如果不接触编译系统,可以不用关注。 |
connector/ | 基于用户空间的网络连接,对应内核空间的communication 模块。 |
console/ | Linux控制台驱动文档。 |
core-api/ | 内核部分的文档。 |
cpu-freq/ | CPU频率和电压调制信息。 |
cpu-hotplug.txt | Linux内核对于CPU 热插拔描述的信息。 |
cpu-load.txt | 描述CPU是怎样加载收集到的统计信息。 |
cpuidle/ | CPU 空闲状态管理子系统信息 |
cputopology.txt | 描述CPU的拓扑信息是如何通过sysfs发布的 |
crc32.txt | CRC计算的简要教程。 |
crypto/ | Crypto API的信息。 |
dcdbas.txt | Dell 系统管理基本驱动信息。 |
debugging-modules.txt | Linux 2.6.3之后的调试模块 |
debugging-via-ohci1394.txt | 怎么使用硬件,像内存读取硬件调试器。 |
dell_rbu.txt | Dell 远程BIOS更新驱动的使用说明。 |
dev-tools/ | 内核开发工具的相关信息。 |
device-mapper/ | Device Mapper的相关信息。 |
dmaengine/ | DMA引擎和控制器API指南。 |
devicetree/ | OF/PowerPC/ARM使用的设备树文件信息。 |
digsig.txt | 数字签名验证API信息 |
dma-buf-sharing.txt | DMA 缓存共享API指南。 |
docutils.conf | docutils的配置文件 |
dontdiff | 永远不要diff的文件列表 |
driver-api/ | Linux驱动实现的API指南 |
driver-model/ | Linux驱动模型的信息。 |
early-userspace/ | initramfs , klibc和早期的用户空间。 |
efi-stub.txt.txt | 怎样使用EFI启动桩,传给GRUB或EFI系统的elilo。 |
eisa.txt | EISA总线支持信息。 |
extcon/ | Android内核切换驱动 |
isa.txt | EISA总线支持 |
fault-injection/ | 默认注入能力的硬件。 |
fb/ | frame buffer graphics abstraction layer. |
features/ | 不同架构下的特色实现。 |
filesystems/ | vfs和Linux支持的各种文件系统。 |
fireware_class/ | request_firmware() 热插拔接口信息。 |
flexible-arrays.txt | 怎样使用Linux强性大小的队列。 |
fmc/ | FMC总线抽象信息 |
fpga/ | FPGA管理内核 |
futex-requeue-pi.txt | 从一个non-pi futex到一个pi futex的任务队列重排。 |
gcc-plugins.txt | GCC插件 |
gpio/ | gpio相关文档 |
gpu/ | GPU驱动开发手册 |
hid/ | human interface devices信息 |
highuid.txt | 16位到32位user/group ids的改变 |
hwspinlock.txt | 硬件自旋锁 |
timers/ | 定时器主题信息 |
hw_random.txt | i8xx芯片生成随机数的支持。 |
hwmon/ | hardwae monitoring 驱动。 |
i2c/ | I2C 驱动/协议的信息 |
x86/i386/ | Intel 32位架构Linux信息 |
ia64/ | Intel 64位架构Linux信息 |
ide/ | 强化IDE驱动。 |
iio/ | 企业级IIO configfs支持 |
index.rst | 以ReST格式的文档主索引 |
infiniband/ | Linux InfiniBand支持文档 |
input/ | Linux输入设备的支持。 |
intel_txt.txt | intel trusted execution technology |
io-mapping.txt | 在linux/io-mapping.h中函数的描述 |
io_ordering.txt | I/O写入内存地址的排序。 |
ioctl/ | 各种IOCTL调用的描述文档 |
iostats.txt | Linux内核支持的各种I/O统计 |
irqflags-tracing.txt | 怎么使用中断标志追踪特性 |
isapnp.txt | Linux ISA Plug&Play支持 |
isdn/ | Linux ISDN支持,包括支持的网卡 |
kbuild/ | 内核编译进程的信息 |
kdump/ | 怎么获取crash dump code |
doc-guide/ | 怎样编写和格式化内核文档。 |
kernel-per-CPU-kthreads.txt | 每个CPU所有kthreads的列表,怎样把它们引入jitter中 |
kprobes.txt | 内核跟踪调度特性文档。 |
kref.txt | 为内核objects添加引用计数器(reference counters) |
laptops/ | 笔记本及驱动相关信息 |
ldm.txt | LDM(Windows Dynamic Disks)描述 |
leds/ | Linux下LED处理的信息。 |
livepatch/ | 内核在线补丁的信息 |
locking/ | 内核锁的基本信息 |
lockup-watchdogs.txt | 软硬件死锁检测器(aka nmi_watchdog) |
logo.gif | Linux logo图像 |
logo.txt | 创建log和获取log的网址 |
lsm.txt | Linux Security Modules:Linux通用的安全钩子 |
lzo.txt | 内核LZO解压缩输入格式 |
m68k/ | Motorala 68k架构的信息 |
mailbox.txt | 怎么写一个通用的邮箱框架(IPC)驱动 |
md/ | Linux Software RAID相关信息 |
media/ | 多媒体驱动信息(uAPI、kAPI和驱动) |
memory-barriers.txt | Linux内核内存屏障 |
memory-hotplug.txt | 热挺拔内存支持 |
memory-chameleon-bus.txt | MEN chameleon 总线 |
mic/ | Intel Many Integrated Core 架构设备驱动 |
mips/ | MIPS架构的信息 |
misc-devices/ | 使用misc设备子系统的设备信息。 |
mmc/ | MMC子系统的信息 |
mtd/ | memory technology devices(flash) 信息 |
namespaces/ | 命名空间的各种信息 |
netlabel/ | NetLabel子系统的信息 |
networking/ | Linux网络的各方面信息 |
nfc/ | Near Field Communications 支持 |
nios2/ | 在Nios II架构上的信息 |
nommu-mmap.txt | no-mmu memory mapping支持 |
numastat.txt | 怎样在sysfs中读取Numa policy hit/miss统计信息 |
ntb.txt | Non-Transparent Bridget 驱动。 |
nvdimm/ | non-volatile devices |
nvmem/ | non volatile 内存框架 |
output/ | html/LaTex/pdf文件默认存放目录 |
padata.txt | “padata”并行执行API |
parisc/ | PA-RISC架构下使用Linux信息 |
parport-lowlevel.txt | 底层并行端口函数使用说明 |
pcmcia/ | Linux PCMCIA驱动 |
percpu-rw-semaphore.txt | 基于读写信号量优化的RCU,用于读时锁 |
perf/ | APM X-Gene SoC Performance Monitoring Unit(PMU) |
phy/ | 三星USB2.0 物理适配层 |
phy.txt | 通知PHY框架 |
pi-futex.txt | 轻量优先级继承的futexes |
pinctrl.txt | pinctrl子系统、PINMUX/PINCONF和驱动 |
platform/ | compal和Dell笔记本支持的硬件列表 |
pnp.txt | Linux Plug和Play |
power/ | Linux PCI 电源管理 |
powerrpc/ | PowerPC的Linux |
prctl/ | priveledge(权限)控制子系统 |
preempt-locing.txt | 抢占式内核锁信息 |
process/ | 怎样进行主线内核开发 |
pps/ | pulse-per-second支持信息 |
pti/ | Intel MID PTI |
ptp/ | IEEE 1588 PTP锁支持 |
pwm.txt | pulse width dodulation 驱动子系统 |
rapidio/ | 基于包的连接的快速IO |
rbtree.txt | 红黑树及它们的用途 |
remoteproc.txt | 远程处理器的卸载和使用。 |
rfkill.txt | radio frequency kill ,切换子系统 |
robust-futex-ABI.txt | 健壮的futex ABI |
robust-futexes.txt | |
rpmsg.txt | Remote Processor Messaging Framework |
rtc.txt | Real Time Clock( aka CMOS clock)驱动 |
s390/ | IBM S390 |
scheduler/ | 调度器 |
scsi/ | scsi支持 |
security/ | 安全相关的信息 |
serial/ | 低级别序列化API |
sgi-ioc4.txt | SGI IOC4 PCI设备 |
sh/ | porting Linux to a new architecture |
smsc_ece1099.txt | smsc 键盘扫描或GPIO扩展设备 |
sound/ | 声卡 |
spi/ | Linux kernel Serial Peripheral Interface支持 |
sphinx/ | Sphinx toolchain需要的文件 |
sphinx-static/ | Sphinx toolchain需要的文件 |
static-keys.txt | how static keys allow debug code in hotpaths via patching |
svga.txt | 通过VGA BIOS启动时,指导如选择video模式 |
sync_file.txt | 同步文件API指南。 |
sysctl/ | /proc/sys/* 文件 |
target/ | 生成TCM v4 构成的.ko模块 |
tee.txt | TEE子系统和驱动 |
this_cpu_ops.txt | 使用this_cpu操作的方法 |
thermal/ | 管理thermal问题(CPU/temp) |
trace/ | linux跟踪技术的信息 |
translations/ | 其他语种的文档翻译(先从这里找中文文档看) |
unaligned-memory-access.txt | 怎样避免在代码中对内存进行非法访问 |
unshare.txt | Linux非共享系统调用 |
usb/ | Universal Serial Bus |
vfio.txt | Virtual Function I/O |
video-output.txt | sysfs class驱动接口,用于启用或禁用一个视频输出设备 |
virtual/ | 各种Linux虚拟化信息 |
vm/ | Linux vm代码 |
w1/ | 1-wire(w1)子系统 |
watchdog/ | 如果“fallen and can't get up”怎么自动重启Linux |
wimax/ | Intel Wireless Wimax Connection |
core-api/workqueue.rst | Concurrency Managed Workqueue实现 |
x86/x86_64 | AMD x86-64(Hammer) |
xillybus.txt | xillybus驱动的基本ui |
xtensa/ | xtensa架构的端口实现 |
xz.txt | linux内核中怎么使用XZ 数据压缩 |
zorro.txt | 在Amigas中怎么为Zorro总线设备编写驱动。 |
Linux内核大部分是由C语言写成的,一些体系统结构相关的代码用了汇编语言。Linux内核使用GNU C和GNU工具链开发,虽然遵循ISO C89标准,但也用到了一些标准没有定义的扩展,内核是自给自足的C环境,不依赖于标准C库的支持,所以并不支持C标准中的部分定义.Linux内核代码都是在GPL的保护下发布的,常见的GPL的问答:
http://www.gnu.org/licenses/gpl-faq.html
下面是内核代码中需要阅读的文档:
README |
简单要介绍Linux内核的背景,并且描述了如何配置和编译内核。内核的新用户应该从这里开始https://www.kernel.org/doc/html/latest/ |
Documentation/process/changes.rst | 文件给出了用来编译和使用内核所需要的最小软件包列表 |
Documentatin/process/coding-style.rst | 描述Linux内核的代码风格和理由。 |
Documentation/process/submitting-patches.rst,Documentation/process/submitting-drivers.rst | 这两份文档明确描述如何创建和发送补丁。 |
Documentation/process/stable-api-nonsense.rst | 论证内核为什么特意不包括稳定的内核内部API,也就是说不包括像这样的特性:-子系统中间层 , -在不同操作系统间易于植的驱动程序, -减缓(甚至阻止)内核代码的快速变化, 这篇文档对于理解Linux的开发哲学至关重要。对于将从开发平台从其他操作系统转移到Linux的人来说也很重要。 |
Documentation/admin-guide/security-bugs.rst | 如果你认为自己发现了Linux内核的安全性问题,请根据这篇文档中的步骤来提醒其他内核开发者并帮助解决这个问题。 |
Documentation/process/management-style.rst | 描述内核维护者的工作方法及其共有特点。 |
Documentation/process/stable-kernel-rules.rst | 解释了稳定版内核发布的规则,以及如何将改动放入这些版本的步骤。 |
Documentation/process/kernel-docs.rst | 如果你在内核自带的文档中没有找到你想找的内容,可以查看这些文档。 |
Documentation/process/applying-patches.rst | 关于补丁是什么以及如何将它打在不同内核开发分支上的介绍。 |
内核还拥有大量从代码自动生成的文档。这包含内核API的全面介绍以及如妥善处理加锁规则。生成的文档会放在Documentation/DocBook/目录下。在内核源代码的主目录中使用以不同命令将会分别生成PDF、Postscript、HTML和手岫页等不同格式的文档。
make pdfdocs
make htmlsdocs
四、查看Linux版本
在Linux内核的顶层MakeFile中,可以看到Linux内核版本。