Linux操作系统类的内容
我将在即将到来的学期担任操作系统课的助教。 实验室将专门处理Linux内核。
- 你认为什么样的Linux内核的概念/组件是课堂上最重要的?
- 你希望在你的学习中被忽略的是什么?
任何有关Linux内核或整体操作系统devise的build议都将不胜感激。
我的列表 :
- 操作系统的关注点是: 物理机器和资源pipe理的 抽象和扩展 。
- 构build过程如何工作,即架构特定/机器代码内容如何植入
- 系统调用如何工作以及模块如何连接
- 内存pipe理 /虚拟内存/寻呼等等
- 过程如何在POSIX和其他系统中诞生,生存和死亡
- 用户空间与内核线程以及进程/线程之间有什么区别
- 为什么单一的内核devise越来越令人厌烦 ,有什么select
- 调度(以及一些替代/域特定的调度程序)
- I / O , 驱动程序开发以及它们如何dynamic加载
- 引导的早期阶段以及内核设置环境的过程
- 时钟,毫无问题的系统等问题
- 我可以继续…
- 我几乎忘了IPC和Unix的“一切都是文件”的devise决定
- 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位,这意味着什么,为什么以及历史和为什么是不存在的。