Linux内核--源代码的目录结构

提示:本系列文章重点学习Linux内核


简介

提示:在这里先对源代码的目录结构做一个概述,以便大家能更好的理解:

通常可以将Linux内核源代码分为三个主要部分,即内核核心代码、其他非核心代码和辅助性文件。


提示:以下是本篇文章将重点阐述Linux内核的源代码的目录结构

一、三个主要部分

下面对这三个部分进行更详细的说明:

(1) 内核核心代码:

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

*arch:* 特定体系结构的代码,如x86、ARM、PowerPC等。与体系结构相关 的代码。对应于每个支持的体系结构,有一个相应的子目录如x86、 arm等与之对应,相应目录下有对应的芯片与之对应

*lib:* 与体系结构无关的内核库代码,与系统调用相关与体系结构相关的内 核库代码在arch/arm/lib下

block: 块设备子系统的代码,用于处理块设备(硬盘、SSD等)。

*crypto*: 加密算法和模块的实现。常用加密及散列算法,和一些压缩及CRC校验算法。

*fs:* 文件系统实现的代码,包括ext4、Btrfs、FAT等。文件系统代码,每个 支持的文件系统有相应的子目录,如cramfs,yaffs,jffs2等

*include:* 头文件,定义了内核中使用的数据结构、宏等。

Ø 这里包括编译内核所需的大部分头文件

Ø 与平台无关的头文件放在include/linux子目录下

Ø 各类驱动或功能部件的头文件(/media、 /mtd、 /net等 )

Ø 与体系相关的头文件 arch/arm/include/

Ø 与平台相关的头文件路径arch/arm/mach-s5p6818/include/mach

*init:* 初始化代码,包括启动过程和初始化子系统的代码。内核初始化代码, 其中的main.c中的start_ _kernel函数是系统引导起来后运行的第1个 函数,这是研究内核工作过程的起点

*ipc:* 进程间通信机制的实现,如消息队列、信号量等。

*kernel*: 内核核心代码,包含调度程序、定时器、进程管理等。内核管理的核心 代码,此目录下的文件实现了大多数linux系统的内核函数,体系结构 相关的代码在arch/arm/kernel

*mm:* 内存管理子系统。与体系结构无关的内存管理代码与处理器体系结构 相关的代码在arch/arm/mm下

(2) 其他非核心代码:

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

*drivers:* 各种硬件设备的驱动程序,如网络接口、图形卡、声卡等。设备驱动 代码,占整个内核代码量的一半以上,里面的每个子目录对应一类驱动 程序,如:

block:块设备、char:字符设备、net:网络设备等

sound: 声音子系统的实现。

usb: USB设备的支持。

*net:* 网络协议栈的实现,如TCP/IP、UDP等。

(3) 辅助性文件:

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

*Documentation:* 包含内核的文档和说明。

*scripts:* 包含编译脚本、配置脚本等用于构建内核的脚本。

LICENSES: 许可证文件,指定内核代码的开源许可证。

Makefile: 用于构建内核的Makefile。

Kconfig: 配置文件,用于配置内核编译选项。

MAINTAINERS: 维护者文件,列出内核的不同部分的维护者。

CREDITS: 贡献者名单,列出对内核做出贡献的人员。

这样的划分更直观地反映了Linux内核源代码的结构,使不同类型的文件和目录更容易被理解和管理。

二、 顶层目录结构

使用ls命令看到的内核源代码的顶层目录结构,具体描述如下:

include/ ---- 内核头文件,需要提供给外部模块(例如用户空间代码)使用。
kernel/ ---- Linux内核的核心代码,包含了进程调度子系统,以及和进程调度相关的模块。
mm/ ---- 内存管理子系统。
fs/ ---- VFS子系统。
net/ ---- 不包括网络设备驱动的网络子系统。
ipc/ ---- IPC(进程间通信)子系统。
arch// ---- 体系结构相关的代码,例如arm, x86等等。
arch//mach- ---- 具体的machine/board相关的代码。
arch//include/asm ---- 体系结构相关的头文件。
arch//boot/dts ---- 设备树(Device Tree)文件。
init/ ---- Linux系统启动初始化相关的代码。
block/ ---- 提供块设备的层次。
sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。
drivers/ ---- 设备驱动(在Linux kernel 3.10中,设备驱动占了49.4的代码量)。
lib/ ---- 实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。
crypto/ ----- 加密、解密相关的库函数。
security/ ---- 提供安全特性(SELinux)。
virt/ ---- 提供虚拟机技术(KVM等)的支持。
usr/ ---- 用于生成initramfs的代码。
firmware/ ---- 保存用于驱动第三方设备的固件。
samples/ ---- 一些示例代码。
tools/ ---- 一些常用工具,如性能剖析、自测试等。
Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。
COPYING ---- 版权声明。
MAINTAINERS ----维护者名单。
CREDITS ---- Linux主要的贡献者名单。
REPORTING-BUGS ---- Bug上报的指南。
Documentation, README ---- 帮助、说明文档。

三、 代码占比

  • 第一的是内核的 drivers 部分,这个是针对不同硬件的驱动,达到 66% , 达到了721344K(大约704MB)。
  • 第二的是内核的 arch 部分,这个是针对不同体系结构的代码,比如X86, ARM,PowerPC等,达到12%, 135288K(大约132MB)
  • 第三的是内核的 sound (声音系统相关),include (头文件等),fs(文件系统,如XFS,ext4/3 等),tools(比如 bpf,perf等 ) 这几个部分。 它们占用基本接近,达到4%, 在46820K左右(大约46MB)。

四、补充说明

在使用命令“ls -al”查看嵌入式Linux内核源代码文件时,信息如下:

\1. drwxrwxr-x 26 lwguo2403 lwguo2403  4096 312 08:53 .  

\2. drwxr-xr-x  3 lwguo2403 lwguo2403  4096 311 19:58 ..  

\3. drwxrwxr-x 24 lwguo2403 lwguo2403  4096 511 2023 arch  

\4. -rw-rw-r--  1 lwguo2403 lwguo2403 272453 312 08:52 .config  

\5. ........  

(1) 解释:

ls -al 命令用于显示目录中所有文件和子目录的详细信息。其中:

\1. drwxrwxr-x 26 lwguo2403 lwguo2403  4096 312 08:53 .  

drwxrwxr-x: 表示这是一个目录(d),且拥有者(user)、组用户(group)和其他用户(others)有读(r)写(w)和执行(x)的权限。

26: 表示目录中的子项数(包括 . 和 …)。

lwguo2403: 表示拥有者的用户名。

lwguo2403: 表示所属用户组的组名。

4096: 表示目录的大小(以字节为单位)。

3月 12 08:53: 表示文件或目录的最后修改时间。

\1. -rw-rw-r--  1 lwguo2403 lwguo2403 272453 312 08:52 .config  

-rw-rw-r–: 表示这是一个普通文件,拥有者和组用户有读和写的权限,其他用户只有读的权限。

1: 表示链接数,即有多少个目录项链接到这个文件。

lwguo2403: 表示拥有者的用户名。

lwguo2403: 表示所属用户组的组名。

272453: 表示文件大小(以字节为单位)。

3月 12 08:52: 表示文件的最后修改时间。

.config: 文件的名称。

(2) 文件或目录的权限信息

文件或目录的权限信息以10个字符的形式表示。下面是这些权限字符的含义:

  • 第一个字符:文件类型
    d :目录
    - :普通文件
    l :符号链接(软链接)

  • 后九个字符(三组):权限

    每组包含三个字符,分别表示文件拥有者(user)、所属用户组(group)、其他用户(others)的权限。

    权限字符说明:

    r :读权限(Read)

    w :写权限(Write)

    x :执行权限(eXecute)

    每组权限的位置:

    第一组:文件拥有者的权限

    第二组:所属用户组的权限

    第三组:其他用户的权限

  • 以上提供的示例中每一组权限的解释:

    drwxrwxr-x:

    d: 目录

    rwx: 文件拥有者有读、写、执行权限

    rwx: 所属用户组有读、写、执行权限

    r-x: 其他用户有读、执行权限

    -rw-rw-r–:

    -: 普通文件

    rw-: 文件拥有者有读、写权限

    rw-: 所属用户组有读、写权限

    r–: 其他用户有读权限

我是将军我一直都在,。!

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本PDF电子书包含上下两册,共1576页,带目录,高清非扫描版本。 作者: 毛德操 胡希明 丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统调用 3.9 系统调用号与跳转表 第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 5.1 概述 5.2 从路径名到目标节点 5.3 访问权限与文件安全性 5.4 文件系统的安装和拆卸 5.5 文件的打开与关闭 5.6 文件的写与读 5.7 其他文件操作 5.8 特殊文件系统/proc 第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用socket() 7.2函数sys—socket()——创建插口 7.3函数sys—bind()——指定插口地址 7.4函数sys—listen()——设定server插口 7.5函数sys—accept()——接受连接请求 7.6函数sys—connect()——请求连接 7.7报文的接收与发送 7.8插口的关闭 7.9其他 第8章设备驱动 8.1概述 8.2系统调用mknod() 8.3可安装模块 8.4PCI总线 8.5块设备的驱动 8.6字符设备驱动概述 8.7终端设备与汉字信息处理 8.8控制台的驱动 8.9通用串行外部总线USB 8.10系统调用select()以及异步输入/输出 8.11设备文件系统devfs 第9章多处理器SMP系统结构 9.1概述 9.2SMP结构中的互斥问题 9.3高速缓存与内存的一致性 9.4SMP结构中的中断机制 9.5SMP结构中的进程调度 9.6SMP系统的引导 第10章系统引导和初始化 10.1系统引导过程概述 10.2系统初始化(第一阶段) 10.3系统初始化(第二阶段) 10.4系统初始化(第三阶段) 10.5系统的关闭和重引导

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值