Linux内核源码结构

阅读数:2006 评论数:0

跳转到新版页面

分类

Linux

正文

一、官网

https://www.kernel.org/

二、源代码结构

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内核版本。

 




相关推荐

说明:这种方式只是用于方便阅读代码,因为可以在源代间快速索引跳跃。但是最后可能会有一些warning,可以不必关心,如果是强迫症,可以使用下面这种方式来去掉。

二进制内核接口 假设我们有一个稳定的内核内部使用的接口,那么就一定会出现一个二进制接口吗? 依赖于你使用的C编译器版本,不同的内核数据结构会包含不同的结构形式,也可能以多种形式包含函数(如是否内联)

一、安装内核源码 如果你安装全部的sources,把内核tarball放在你有权限的目录下,解压缩,不要使用/usr/src/linux这个目录,因为这是linux系统使用的目录。 xz -cd li

PGP帮助确保Linux内核社区的代码完整性,通过PGP签名邮件交换来在开发者间建立可信通信。 Linux内核代码发布成两种主要格式:   分布式源码库(git) 周期性发布的快照(tarballs

使用魔数来保护内核数据结构是一个非常好的主意,这就允许你在运行期检查一个结构是否已经被攻击,或者你已经给一个例行程序通过了一个错误的结构。 使用魔数值的方法是在结构的开始处声明的,如下: struct

C程序员通常认为volatile表示某个变量可以在当前执行的线程外被改变,因此在内核中用到共享数据结构时,常常会有C程序员使用volatile这类变量,然而在内核中使用volatile几乎总是错误的。

一、概述 Linux内核源码中的头文件非常多,它们定义了各种结构体、宏、函数原型等,以供内核自身以及内核模块使用。 二、主要头文件 : include/: 这是最主要的头文件目录,包含了大量的子目

一、概述 在 Linux 内核中,__setup 宏和 early_param 宏是用于设置内核启动参数(也称为内核命令行参数)的处理函数的。这些参数在系统启动时由引导加载程序(比如 GRUB)传递给

一、概述 在Linux内核开发中,BUG_ON 宏是一个非常有用的调试工具。它用于在内核代码中检测异常情况,当检测到某个条件为真时,它会导致内核崩溃(crash),这通常意味着出现了严重的错误,需要开

一、概述 在Linux内核源代码中,command_line是一个字符串,它包含了在引导时传递给内核的启动参数。这些参数可以在内核启动时由引导加载器(如GRUB)设置,也可以在编译内核时静态设置。 启