type
Post
status
Published
slug
2022/12/11/wiki-osdev-org-linux-kernel-primer
summary
tags
osdev
Linux
category
osdev
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
1 Introduction
Linux 内核源码是一个现代化、实用且经过测试的操作系统设计案例。然而,它并不是作为一个教学工具而创建的。源代码通常没有注释,并提供非常少的指导。尽管如此,仍然有很多地方和东西可以学习。对 Linux 内核源码的全面描述可能需要多本书来完成。
2 Obtaining the Source
http://www.kernel.org 是所有 linux 内核源代码的主要来源。 http://lxr.free-electrons.com 可让您在线浏览源代码。它还有一个非常好的搜索引擎。
3 Version Numbers
主要功能变更的基本历史记录:
- 1.0 及之前版本 - 仅限 x86,a.out 二进制格式
- 1.2 - 添加了对更多 CPU 类型、ELF 二进制格式、模块的支持
- 2.0 - 添加对 SMP 的支持
在 2.2 版本功能达到一定水平,改进变得更加迭代。2.2 版内核实现了现代内核所需的大多数主要功能。使用低于 2.2 版本的内核作为参考或基础进行分叉,可能会对派生代码或设计造成严重的架构挑战。内核在 2.2 版后进行了核心改进,内核开发人员有充分的理由进行这些改进。
内核的大小可归因于过多的文件系统、设备驱动程序、体系结构支持以及内核服务和功能。虽然 2.6 是一个庞大的代码库,但删除非核心部分可以减少大小。驱动程序占用超过 100MB,非 i386 架构,大约 50MB,文件系统,大约 20MB。作为一般规则,您不需要冒险研究您不使用的各种子系统和驱动程序。
4 Browsing and Using The Source
最好不要尝试将整个 Linux 内核源代码作为一个单独的流程来跟踪。不同的体系结构以不同的方式启动,但通用部分可以在
init/
中找到。请记住,操作系统内核与用户空间程序有很大不同 - 内核响应并服务于用户空间请求。与其试图弄清楚整个内核的流程,不如试着弄清楚单个事件或系统调用的情况。通过搜索以
“sys_”
开头的函数的代码,可以很轻松地找到系统调用。这些通常具有与 C 库调用的内核要求相对应的描述性名称。查看 Linux 中的驱动程序源代码可以告诉您关于给定硬件功能的大量信息。请记住,Linux 内核源代码对于如何处理特定硬件并不总是“正确的”。许多驱动程序是在很少或没有文档或标准信息的情况下编写的。
除非您修改内核的大部分以使用与 Linux 内核相同的名称和约定,否则 Linux 内核源码不易移植到 Linux 以外的地方。此外,源代码是 GPL 授权,因此如果您使用任何东西,您的内核源代码将需要适当的许可。这个规则有一些例外,主要是在位于 Linux 内核树中的项目之间共享的代码中。
Linux 中用于基本系统任务的基础设施数量——中断处理程序、虚拟内存、交换、块
io——如果您刚刚开始,这些代码会使很多代码难以阅读。在查看 “真实” 内核如何执行操作之前,可能最好阅读其他教程,这样您就可以识别基础设施设置和执行给定任务所需的内容。有趣的副作用是,在其他小型示例内核中模糊的大型内核逻辑在 Linux 中变得非常清晰。例如,调度算法在单个源文件中相当可见,易于阅读,且没有太多的任务交换细节混淆其工作原理。
由于 Linux 内核已经为许多不同的任务提供了经过测试的机制,因此创建内核模块可以让您测试自己的内核代码。尝试这样做的缺点是您必须弄清楚如何 “良好搭配” 您尝试使用的 Linux 部分......
5 Important Source Files
这个列表并不完整。这些文件提供了任何操作系统内核都可能需要的通用功能。
- 锁定、同步
kernel/mutex.c
,include/linux/mutex.h
- 内核空间互斥体实现kernel/futex.c
- 内核级支持 “快速” 用户空间互斥kernel/spinlock.c
,include/linux/spinlock.h
- 内核自旋锁实现
- 块设备
block/elevator.c
- 支持各种 IO 调度算法block/noop-iosched.c
- 最容易读取和理解的 IO 调度程序 (noop)block/ll_rw_blk.c
- 块请求与块设备队列接触的地方
- 文件系统
fs/read_write.c
- read、write 系统调用fs/file.c
- 文件句柄的管理fs/inode.c
- inode 的功能 (文件信息结构,有时类似于内核文件句柄)fs/open.c
- 包含几个主要的文件操作fs/cramfs/inode.c
,fs/cramfs/uncompress.c
- 一个非常小的文件系统,易于阅读/查找代码*
- 进程管理
kernel/sched.c
- Linux 调度程序,schedule()
是这里要查看的函数kernel/workqueue.c
- 一个工作队列,提供了一种工作方式arch/i386/kernel/process.c
- x86 的大部分进程处理
- 二进制格式
fs/binfmt_elf.c
- ELF 加载
- 内存管理
mm/slab.c
- 缓存分配器,也是 kmalloc 的家mm/vmalloc.c
- 虚拟连续内存分配器mm/page_alloc.c
- 伙伴分配
6 Finding what you are looking for
arch/
目录包含体系结构相关文件。如果你想了解 x86
开发,最好的地方是 arch/i386
。大多数特定于硬件的功能都包含在 drivers/
. 请记住,诸如 PCI
之类的东西被多种体系结构使用,因此它们也位于 drivers/
下。 Sound 和 Networking 被区别对待,它们分别位于各自的目录 sound/
和 net/
下,驱动程序在子目录中。核心内核功能位于 kernel/
和 lib/
目录中。Documentation 目录中有“文档”。这个目录不是你想的那样。它更像是知识的零散片段,而不是关于内核的任何完整信息。
7 Resources
7.1 Websites:
- https://kernelnewbies.org/ - guides for new Linux kernel developers
- http://www.tldp.org/HOWTO/KernelAnalysis-HOWTO.html - guide to the Linux kernel organized by subsystems
- https://syscalls.kernelgrok.com/ - a reference list of Linux syscalls
7.2 Books:
- Linux Kernel Development, by Robert Love - a very decent 'overview' book of the Linux kernel. It doesn't go into too much detail, but provides enough of a big picture and detail view to really get started on a Linux kernel project.
- Understanding the Linux Kernel, David Bovet - more detailed than Linux Kernel Development. If you want to do more work than browsing the kernel, this has more of the detail required.
欢迎加入“喵星计算机技术研究院”,原创技术文章第一时间推送。
- 作者:tangcuyu
- 链接:https://expoli.tech/articles/2022/12/11/wiki-osdev-org-linux-kernel-primer
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章