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
Dec 11, 2022 08:10 AM
created days
Last edited time
Dec 11, 2022 08:10 AM

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.cinclude/linux/mutex.h - 内核空间互斥体实现
    • kernel/futex.c - 内核级支持 “快速” 用户空间互斥
    • kernel/spinlock.cinclude/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.cfs/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:

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.
 
欢迎加入喵星计算机技术研究院,原创技术文章第一时间推送。
notion image
 
wiki.osdev.org 系列之 - Category:Bare Bones (类别:基本教程)wiki.osdev.org 系列之 - OS theory