35

在即将到来的学期,我将成为操作系统课程的助教。这些实验室将专门处理 Linux 内核。

  1. 你认为 Linux 内核的哪些概念/组件在课堂上最重要?
  2. 你希望在你的学习中被忽略的内容是什么?

任何有关 Linux 内核或整体操作系统设计的建议都将不胜感激。

4

9 回答 9

21

我的清单

  1. 操作系统的关注点是:物理机器资源管理的抽象和扩展。
  2. 构建过程是如何工作的,即如何植入特定于架构/机器代码的东西
  3. 系统调用如何工作以及模块如何链接
  4. 内存管理/虚拟内存/分页等等
  5. 流程在 POSIX 和其他系统中是如何诞生、生存和消亡的
  6. 用户空间与内核线程以及进程/线程之间的区别
  7. 为什么单片内核设计越来越令人厌烦,还有哪些替代方案
  8. 调度(以及一些替代/特定领域的调度器)
  9. I/O驱动程序开发以及如何动态加载它们
  10. 引导的早期阶段以及内核为设置环境所做的工作
  11. 时钟、无 mmu 系统等问题
  12. ...我可以继续...
  13. 我几乎忘记了IPC 和 Unix 的“一切都是文件”的设计决策
  14. POSIX,为什么存在,为什么不应该

最后,让他们通过tanenbaum 的现代操作系统,并对其他一些内核进行案例研究,比如 Mach/Hurd 的微内核设置,也许还有一些分布式和外内核的东西。

给出过去 Linux 的广阔视野,我认为

对于那些超级极客,操作系统的历史以及它们为什么会这样。

于 2009-06-15T14:55:55.540 回答
13

虚拟文件系统层对于任何 Linux 操作系统类都是绝对必要的。

我在大学上过类似的课。最令人沮丧但同时也很有帮助的项目是为 Linux 操作系统编写一个小文件系统。4 人一组需要大约 2-3 周的时间才能完成这项工作,并且真正教会了您内核的来龙去脉。

于 2009-06-15T15:05:05.503 回答
6

我最近参加了一个操作系统课程,我发现这些项目具有挑战性,但对于理解课堂上的概念至关重要。这些项目也很有趣,因为它们让我们实际使用Linux 源代码(版本 2.6.12 或更高版本)。

以下是我认为任何操作系统类都应该涵盖的一些非常好的项目/概念的列表:

  • 用户空间和内核空间的区别
  • 流程管理(即fork(),exec()等)
  • 编写一个小 shell 来展示fork()exec()
  • 系统调用如何工作,即我们如何从用户模式切换到内核模式
  • 向 Linux 内核添加一个简单的系统调用,编写一个调用系统调用的测试应用程序来演示它的工作原理。
  • 同步进出内核
  • 在用户空间实现同步原语
  • 了解同步原语如何在内核空间中工作
  • 了解单 CPU 架构和 SMP 之间的同步原语有何不同
  • 向 Linux 内核添加一个简单的系统调用,展示如何在 Linux 内核中使用同步原语的知识(即必须获取的东西,比如说,任务列表锁等,但也让它成为你必须使用 kmalloc 的东西,这不能在持有锁时完成(除非你是 GFP_ATOMIC,但你不应该,真的))
  • 调度算法,以及如何在 Linux 内核中进行调度
  • 通过添加自己的调度策略来修改 Linux 任务调度器
  • 什么是分页?它是如何工作的?为什么我们有分页?它在 Linux 内核中是如何工作的?
  • 向 Linux 内核添加一个系统调用,给定一个地址,它会告诉您该地址是否存在或它是否已被换出(或其他一些涉及分页的分配)。
  • 文件系统——它们是什么?它们为什么存在?它们在 Linux 内核中是如何工作的?
  • 磁盘调度算法——它们为什么存在?这些是什么?
  • 将 VFS 添加到 Linux 内核
于 2009-06-17T14:34:59.590 回答
4

对于实验室来说,可能很酷的一件事是向他们展示实际代码并讨论它,询问他们认为事情是以这种方式完成的,而不是另一种方式等问题。

如果我再次在大学里,我肯定会更深入地了解有关同步原语、并发性等的课程……这些都是困难的问题,如果没有适当的指导,就更难处理。我记得我参加了 Paul “Rusty” Russell 关于自旋锁和其他绝对是 rad 的同步原语的演讲,也许你可以在 youtube 上找到它并借用一些想法。

于 2009-06-15T15:12:58.230 回答
4

Another good topic (or possibly exercise for the students) would be looking at virtualisation. Especially Rusty Russel's "lguest" which is designed as a simple introduction to what is required to virtualise an operating system. The docs are good reading too.

于 2009-06-16T11:23:24.710 回答
4

实际上,我刚刚在春季上了一门完全符合您描述的课程(使用 linux 的 OS 设计)。实际上,我对此感到非常沮丧,因为我觉得老师对项目的关注过于狭隘,而不是给予更广泛的理解。例如,我们的上一个项目围绕 futexes 展开。我和我的搭档几乎不知道它们是什么,让它工作(有点)然后把它交出来。我离开时对那个项目的任何东西一无所知。我希望其中一个项目是编写一个简单的设备驱动程序或类似的东西。

换句话说,我认为最好确保提供一个良好的广泛概述,尽可能多地提供细节,但最终要广泛。我觉得我的老师挑剔了这些微小的领域,让我们非常专注于这些领域,而最终我并没有对 Linux 的内部运作有那么大的了解。

我想指出的另一件事是我没有保留课堂知识的很多原因是缺乏组织。任何给定的一周,主题都是突然冒出来的,也没有路线图。给材料一个合乎逻辑的流程。心理组织是保留知识的关键。

于 2009-06-17T14:02:27.393 回答
4

嗯,我这学期刚完成我的操作系统课程,所以我想我会插话的。

我有点沮丧,因为我们实际上并没有玩弄实际的操作系统本身,而是我们只是进行了系统编程。我建议将实验室放在操作系统本身的东西上,这听起来像是你想做的事情。

我确实喜欢并发现有用的一个实验室是编写我们自己的 malloc/free 例程。这很困难,但也很有趣。

也许还包括将程序加载到内存和/或设置内存管理器(例如分页)。

于 2009-06-15T14:56:34.213 回答
3

网络子系统也很有趣。您可以跟踪一个数据包,因为它从套接字系统调用到线路,反之亦然。

有趣的作业可能是:

  • 使用 netfilter 创建状态完整的防火墙
  • 创建 HTTP 负载均衡器
  • 设计和实现一个简单的隧道协议
于 2009-06-15T15:15:07.540 回答
1

内存映射 I/O 以及 32 位操作系统中内核地址空间和用户可寻址空间之间的 1g/3g 与 2g/2g 拆分。

32 位架构对硬盘大小的限制以及这对文件系统的设计意味着什么。

实际上只是使用 64 位的所有优点和缺点,它意味着什么,为什么以及历史和为什么还没有。

于 2009-06-15T15:12:30.277 回答