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

news/2024/7/7 20:16:37

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

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

  • 简介
  • 一、三个主要部分
    • (1) 内核核心代码:
    • (2) 其他非核心代码:
    • (3) 辅助性文件:
  • 二、 顶层目录结构
  • 三、 代码占比
  • 四、补充说明
    • (1) 解释:
    • (2) 文件或目录的权限信息
  • 我是将军我一直都在,。!


简介

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

通常可以将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–: 其他用户有读权限

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


http://lihuaxi.xjx100.cn/news/2102538.html

相关文章

python图形化编程turtle小乌龟

文章目录: 一:导入包(常用的) 二:布局 1.设置世界坐标系 2.窗体 3.画布屏幕screen 三:线条画笔海龟 1.运动 2.样式 3.外观 4.其他 四:颜色 五:文字 六:图…

rust 文件引用,父目录下的同级目录之间的引用

父目录下的同级目录之间的引用 例如有: src/component/aaa.rs src/component/mod.rs // 有 pub mod aaa; src/module/bbb.rs src/module/mod.rs // 有 pub mod bbb; src/main.rs // 有 mod module;如果 bbb.rs要引用aaa.rs: 在main.rs再加上mod compo…

RIPGeo参文44-47(扰动训练目标):泛化和鲁棒性

RIPGeo中有: 其中是一个常数。它证明了我们实际上优化了的上界,它确实涉及到数据分布的看不见的样本,从而保证了RIPGeo的通用性。 我们还注意到,我们的扰动训练目标是Lipschitz constraints[44]的一种特殊形式。由于正则化或Lipschitz constraints连续性对训练稳定性[45]和…

ArkTS 构建布局

目录 一、线性布局(Row、Column) 二、层叠布局(StackLayout) 三、弹性布局(Flex) 3.1 布局方向 3.2 布局换行 3.3 主轴对齐方式 3.4 交叉轴对齐方式 3.4.1 容器组件设置交叉轴对齐 3.4.2 子组件设…

UnityShader(十六)凹凸映射

前言: 纹理的一种常见应用就是凹凸映射(bump mapping)。凹凸映射目的就是用一张纹理图来修改模型表面的法线,让模型看起来更加细节,这种方法不会改变模型原本的顶点位置(也就是不会修改模型的形状&#xf…

盛最多水的容器 - LeetCode 热题 5

大家好!我是曾续缘😛 今天是《LeetCode 热题 100》系列 发车第 5 天 双指针第 2 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, …

基于Python的股票市场分析:趋势预测与策略制定

一、引言 股票市场作为投资领域的重要组成部分,其价格波动和趋势变化一直是投资者关注的焦点。准确预测股票市场的趋势对于制定有效的投资策略至关重要。本文将使用Python编程语言,结合时间序列分析和机器学习算法,对股票市场的历史数据进行…

python提取身份证中的生日和性别

1.代码 def sfzAnalysis(idNum):#检查身份证长度是否正确if len(idNum)!18:raise ValueError("身份证号码长度不正确,请输入一个18位的身份证号码。")#raise关键字在Python中有多种用途,主要涉及异常的抛出和错误处理#提取出生日期year idN…