Linux操作系统类的内容

我将在即将到来的学期担任操作系统课的助教。 实验室将专门处理Linux内核。

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

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

我的列表

  1. 操作系统的关注点是: 物理机器资源pipe理的 抽象和扩展
  2. 构build过程如何工作,即架构特定/机器代码内容如何植入
  3. 系统调用如何工作以及模块如何连接
  4. 内存pipe理 /虚拟内存/寻呼等等
  5. 过程如何在POSIX和其他系统中诞生,生存和死亡
  6. 用户空间与内核线程以及进程/线程之间有什么区别
  7. 为什么单一的内核devise越来越令人厌烦 ,有什么select
  8. 调度(以及一些替代/域特定的调度程序)
  9. I / O驱动程序开发以及它们如何dynamic加载
  10. 引导早期阶段以及内核设置环境的过程
  11. 时钟,毫无问题的系统等问题
  12. 我可以继续…
  13. 我几乎忘了IPC和Unix的“一切都是文件”的devise决定
  14. POSIX,为什么它存在,为什么它不应该

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

给我一个宽泛的观点,过去Linux,我重新审视

对于那些超级怪胎 ,操作系统的历史和为什么他们是这样的。

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

我在大学里上了类似的课。 最令人沮丧的是,与此同时,有用的项目是为Linux操作系统编写一个小文件系统。 让这个工作需要2-3个星期的时间,一群4人,真的教你内核的来龙去脉。

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

这里列出了一些我觉得应该在任何操作系统类中介绍的很好的项目/概念:

  • 用户空间和内核空间的区别
  • 进程pipe理(即fork()exec()等)
  • 写一个小的shell来展示fork()exec()
  • 系统调用如何工作,即如何从用户切换到内核模式
  • 给Linux内核添加一个简单的系统调用,编写一个调用系统调用的testing应用程序来演示它的工作原理。
  • 同步进出内核
  • 在用户空间中实现同步原语
  • 了解同步原语如何在内核空间中工作
  • 了解单CPU体系结构和SMP之间的同步原语是如何不同的
  • 向Linux内核添加一个简单的系统调用,该调用展示了如何在Linux内核中使用同步原语的知识(即必须获取任务列表锁等的知识,同时也使其成为需要kmalloc的地方)locking时无法完成(除非你是GFP_ATOMIC,但你不应该))
  • 调度algorithm,以及如何在Linux内核中进行调度
  • 通过添加您自己的调度策略来修改Linux任务调度程序
  • 什么是分页? 它是如何工作的? 为什么我们要分页? 它在Linux内核中如何工作?
  • 给Linux内核添加一个系统调用,给定一个地址,它会告诉你这个地址是否存在,或者是否已经被换出(或者其他一些涉及分页的分配)。
  • 文件系统 – 它们是什么? 他们为什么存在? 他们如何在Linux内核中工作?
  • 磁盘调度algorithm – 为什么它们存在? 他们是什么?
  • 添加一个VFS到Linux内核

那么这个学期我刚刚完成了我的操作系统课程,所以我想我会在这里。

我有点不高兴,实际上我们并没有真正使用操作系统本身,而只是做了系统编程。 我build议让实验室使用操作系统本身的东西,这就是你想要做的事情。

我做的一个实验室享受和发现有用,但是写我们自己的malloc /免费例程。 这很困难,但也很有趣。

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

对于实验室来说,一件可能很酷的事情就是向他们展示实际的代码并讨论它,提出有关他们认为事情是以什么方式而不是另一种方式进行的问题。

如果我再次进入大学的话,我将会更加深入地了解同步原语,并发等方面的经验教训……如果没有适当的指导,那些难以接近的难题。 我记得我去了Paul“Rusty”Russell发表关于自旋锁和其他同步原语的演讲,也许你可以在YouTube上find并借鉴一些想法。

另一个好主题(或者可能为学生练习)将会看虚拟化。 尤其是Rusty Russel的“lguest”,它被devise成简单介绍虚拟化操作系统所需的东西。 该文档也是很好的阅读。

实际上,我在spring刚刚完成了一个完全符合你的描述的类(使用linux的OS Design)。 其实我感到非常沮丧,因为我觉得老师对项目的关注太狭隘,而不是给予更广泛的理解。 例如,我们最后的项目围绕futexes。 我的伙伴和我几乎不知道他们是什么,把它工作(有点),然后把它交给我。我从这个项目中没有真正的知识。 我希望其中一个项目是写一个简单的设备驱动程序或类似的东西。

换句话说,我认为确保提供一个良好的广泛的概述是很好的,尽可能多的细节,但最终是广泛的。 我觉得我的老师挑剔了这些微小的领域,使我们非常关注这些领域,而最终我没有对Linux的内部工作有一个大体的了解。

另一件我想说的是,为什么我没有保留来自class级的知识是缺乏组织的。 话题在任何一个星期都没有出现,没有路线图。 给材料一个合乎逻辑的stream程。 精神组织是保持知识的关键。

networking子系统也很有趣。 你可以从套接字系统调用到电线,反过来一个包。

有趣的作业可能是:

  • 使用netfilter创build一个完全状态的防火墙
  • 创build一个HTTP负载平衡器
  • devise和实现一个简单的隧道协议

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

32位体系结构对硬盘大小的限制,这对文件系统的devise意味着什么。

其实只是所有的优点和缺点,去64位,这意味着什么,为什么以及历史和为什么是不存在的。