Linux内核之概观

目录

1.    Linux开发模式

2.    维护者层级

3.    Linux 源代码布局

4.    Linux 内核架构

4.1     arch(architecture)

4.2     设备驱动

4.3     进程管理

4.4     内存管理

4.5     块  I/O  管理

4.6     虚拟文件系统开关(Virtual Filesystem Switch)

4.7     网络栈

4.8     Linux 安全模块


1.    Linux开发模式

        Linux 内核是全球最大的开源项目之一,拥有数千名贡献代码的开发者,且每次发布版本都会涉及数百万行代码的变更。

    该项目基于 GPLv2 许可证发布简而言之,该许可证要求:如果包含内核修改的软件被交付给客户,则必须向客户提供相应的修改内容(尽管在实际操作中,大多数公司都会直接公开源代码)。

    许多公司(其中不乏竞争对手)以及学术界人士和独立开发者,都在为 Linux 内核贡献代码。

    目前的开发模式基于固定的发布周期(通常为 3 到 4 个月)。新功能会在为期一到两周的“合并窗口期”内合入内核。合并窗口期结束后,项目会按周发布候选版本(如 rc1、rc2 等)。

2.    维护者层级

    为了扩展开发流程,Linux 采用了分层维护模式:

●    Linus Torvalds 是 Linux 内核的维护者,负责合并来自子系统维护者的拉取请求( pull requests )。

●    每个子系统都有一名或多名维护者,负责接收来自开发者或设备驱动程序维护者的补丁(patch)或拉取请求(pull request)。

●    每位维护者都有自己的 Git 树,例如:

(1)  Linux Torvalds:

git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

(2) 

David Miller (networking):

git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/

●   每个子系统都可以维护一个“-next”树,供开发人员提交针对下一个合并窗口的补丁。

由于合并窗口最长仅为两周,大多数维护者都维护着一个“-next”分支(tree);即便在合并窗口关闭期间,他们也能通过该分支接收来自开发者或下游维护者提交的新功能。

    值得注意的是,即使在合并窗口关闭期间,维护者的分支仍会接受错误修复;上游维护者会针对每一个发布候选版本(release candidate),定期从这些分支中拉取(pull)这些修复内容。

3.    Linux 源代码布局

这些是 Linux 源代码文件夹的顶层目录

●    arch(architecture) —— 包含具体架构的代码;每种架构都在指定的子文件夹(例如 arm,arm64,x86)中实现。

●    block —— 包含处理块设备数据读写的块子系统代码:创建块 I/O 请求、调度请求(有多种 I/O 调度器可供选择)、合并请求,以及将请求通过 I/O 栈向下传递给块设备驱动程序。

●    certs —— 实现对使用证书进行签名验证的支持。

●    crypto —— 各种密码学算法的软件实现,以及支持将此类算法卸载至硬件执行的框架。

●   Documentation —— 各类子系统的文档、Linux 内核命令行选项、sysfs 文件及其格式的说明、设备树绑定(支持的设备树节点及格式)。

●   drivers —— 针对各种设备的驱动程序,以及 Linux 驱动程序模型实现(一种描述驱动程序、设备、总线及其连接方式的抽象)。

●   firmware —— 由各种设备驱动程序使用的二进制或十六进制固件文件 。

●   fs —— 虚拟文件系统切换层(通用文件系统代码)及各种文件系统驱动程序存放处。

●   include —— 头文件。

●   init —— 在引导期间运行的通用(即非特定于架构的)初始化代码。

●   ipc —— 针对消息队列、信号量、共享内存等各种进程间通信(IPC)系统调用的实现。

●   kernel —— 进程管理代码(包括对内核线程和工作队列的支持)、调度器、追踪、时间管理、通用中断(IRQ)代码、锁机制。

●   lib  —— 各种通用功能,如排序、校验和、压缩与解压缩、位图操作等。

●   mm  —— 涉及物理内存与虚拟内存的内存管理代码,包括页(page)、SL*B 和 CMA 分配器、交换(swapping)、虚拟内存映射、进程地址空间操作等。

●   net  —— 针对包括 IPv4 和 IPv6 在内的各种网络协议栈的实现;BSD 套接字实现、路由、过滤、数据包调度、桥接等。

●   samples  —— 各种驱动的例子。

●   scripts  —— 构建系统组件、用于构建模块的脚本、Linux 内核配置工具 kconfig,以及其他各类脚本( 例如用于检查补丁是否符合 Linux 内核编码风格的 checkpatch.pl )。

●   security    —— 这里是 Linux 安全模块( Linux Security Module )框架的存放处,该框架允许扩展默认的(Unix)安全模型,同时也包含了 SELinux、Smack、AppArmor、Tomoyo 等多种此类扩展的实现。

●   sound   —— ALSA(高级 Linux 声音系统)及旧版 Linux 声音框架(OSS)存放处。

●   tools —— 用于测试 Linux 内核子系统或与其交互的各种用户空间工具。

●   usr —— 支持将 initrd 文件嵌入到内核镜像中。

●   virt —— KVM(内核虚拟机) hypervisor 的发源地。

4.    Linux 内核架构

4.1     arch(architecture)

●    架构相关代码。

●    可能进一步细分为机器相关代码。

●    与引导加载程序交互以及架构相关初始化。

●    访问各种架构或机器特定的硬件位,例如中断控制器、SMP 控制器、总线控制器、异常和中断设置、虚拟内存处理。

●     架构优化函数(例如 memcpy、字符串操作等)。

Linux 内核的这一部分包含特定于架构的代码,并且可能针对某些架构(例如 ARM)进一步细分为特定于机器的代码。

“Linux 最初是为基于 32 位 x86 架构的个人电脑( 386 或更高版本 )开发的。如今,它至少可以在 Compaq Alpha AXP、Sun SPARC 和 UltraSPARC、Motorola 68000、PowerPC、PowerPC64、ARM、Hitachi SuperH、IBM S/390、MIPS、HP PA-RISC、Intel IA-64、DEC VAX、AMD x86-64 和 CRIS 架构上运行。”

         它实现了对各种特定于架构或机器的硬件位的访问,例如中断控制器、SMP 控制器、总线控制器、异常处理和中断建立、虚拟内存处理。

         它还实现了针对特定架构优化的功能(例如 memcpy、字符串操作等)。

4.2     设备驱动

    Linux 内核使用统一设备模型,其目的是维护反映系统状态和结构的内部数据结构。这些信息包括哪些设备存在、它们的状态、它们连接到哪个总线、它们连接到哪个驱动程序等等。这些信息对于实现系统级电源管理、设备发现和动态设备移除至关重要。

    每个子系统都有其特定的驱动程序接口,这些接口针对其所代表的设备进行了定制,以便于编写正确的驱动程序并减少代码重复。

    Linux 支持种类繁多的设备驱动程序,例如:TTY、串口、SCSI、文件系统、以太网、USB、帧缓冲区、输入、声音等等。

4.3     程管理

Linux 实现了标准的 Unix 进程管理 API,例如 fork()、exec() 和 wait(),以及标准的 POSIX 线程。

    然而,Linux 进程和线程的实现方式与其他内核截然不同。Linux 没有内部结构来实现进程或线程,而是使用一个名为 task_struct 的结构体来描述一个名为 task 的抽象调度单元

    一个 task 拥有指向资源的指针,例如地址空间、文件描述符、IPC ID 等。属于同一进程的任务的资源指针指向相同的资源,而不同进程的任务的资源指针则指向不同的资源。

这种特性,结合 clone() 和 unshare() 系统调用,使得 Linux 能够实现命名空间等新特性。

    命名空间与控制组 ( cgroup ) 结合使用,在 Linux 中实现操作系统虚拟化。

    cgroup 是一种以可控且可配置的方式,将进程分层组织并沿层次结构分配系统资源的机制。

4.4     内存管理

    Linux 内存管理是一个复杂的子系统,它处理以下问题:

●  物理内存管理:内存分配和释放。

●  虚拟内存管理:分页、交换、按需分页、写时复制。

●  用户服务:用户地址空间管理(例如 mmap()、brk()、共享内存)。

●  内核服务:SL*B 分配器、vmalloc 。

4.5       I/O  管理

    Linux 块 I/O 子系统处理从块设备读取和写入数据:创建块 I/O 请求、转换块 I/O 请求(例如,用于软件 RAID 或 LVM)、合并和排序请求,并通过各种 I/O 调度程序将它们调度到块设备驱动程序。

4.6     虚拟文件系统开关(Virtual Filesystem Switch)

    Linux虚拟文件系统开关实现了通用文件系统代码,以减少文件系统驱动程序中的重复代码。它引入了一些文件系统抽象概念,例如:

●  inode —— 描述磁盘上的文件(属性、数据块在磁盘上的位置)。

●  dentry —— 将 inode 与文件名关联起来(目录项)。

●  file ——  描述已打开文件的属性(例如文件指针)。

●  superblock ——  描述已格式化文件系统的属性(例如块数、块大小、根目录在磁盘上的位置、加密方式等)。

    Linux VFS 还实现了一种复杂的缓存机制,其中包括以下内容:

●  inode 缓存 —— 缓存文件属性和内部文件元数据。

●  dentry 缓存 —— 缓存文件系统的目录层次结构。

●  page 缓存 —— 缓存内存中的文件数据块。

4.7     网络栈

4.8     Linux 安全模块

●    用于扩展默认 Linux 安全模型的钩子。

●    被多个 Linux 安全扩展程序使用:

(1)  安全增强型 Linux

(2)  AppArmor

(3)  Tomoyo

(4)  Smack

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值