本文转载自微信公众号《编程技术宇宙》,作者轩辕志峰。转载本文请联系编程技术宇宙公众号。操作系统的文章你可能看了很多,但是很多都是讲操作系统的理论技术,很少讨论现代操作系统的实际实现。你可能知道线程的几种状态和状态变化,但是你知道Linux中线程是如何进行调度的吗?你可能知道线程栈是如何进入和退出的,但你知道Linux线程栈是如何分配和管理的。底部是否隐藏着什么秘密?你可能对TCP/IP协议比较熟悉,但是你知道在Linux中是如何实现TCP协议的,它和RFC规范有什么不同吗?你可能知道Signal机制,但你知道内核是如何调度信号和执行信号处理函数的吗?你可能知道操作系统的内存管理技术,但是你知道Linux和Windows在x86架构下的实现有什么区别吗?·······学习一门技术,不能只是纸上谈兵,知其然,知其所以然,知其所为,才能达到最高境界等级。阅读操作系统的源代码是学习操作系统的必由之路。下面分别介绍最常见的Linux和Windows系统。LinuxLinux是一个开源系统,很容易得到源代码,不过这里轩辕推荐一个我私藏的网站。不用科学上网,不用下载源码,只要有电脑就可以在线阅读。网址:https://elixir.bootlin.com/这个网站有几个优点:在线阅读,免费下载,随处看版本。这对于理解某个技术细节在不同版本中的实现变化非常有用。支持函数、结构、变量搜索。所有这些源代码中出现的信息都可以直接点击链接,后台会自动在当前版本的Linux代码中搜索相关定义和引用。速度也很快。除了Linux之外,本站还可以支持包括glibc、qemu、dpdk等在内的很多其他项目代码的阅读:使用本站阅读源码比GitHub上的体验更好。窗户什么?Windows也能看到源代码?这是正确的。程序员之间存在鄙视链。使用Linux的人常常鄙视使用Windows的人,鄙视Windows系统不如Linux。我不知道这种蔑视是什么时候以及为什么产生的,但是如果你阅读过Windows操作系统的源代码,你一定会被微软工程师的编码能力和设计智慧所折服。阅读这些杰出工程师的C代码,就像欣赏一件艺术品一样令人愉悦。值得我们研究的宝藏太多了。Windows操作系统虽然是微软的商业产品,但这么多年了,还是有不少人想一窥其内核的秘密。其中,出现了源码泄露、逆向工程、正式发布等多个不同版本。尽管有些版本已经发布多年,但许多底层实现至今仍在使用。WindowsNT4.0&Windows20002004年2月,Windows内核源代码泄露,泄露了WindowsNT4.0/Windows2000源代码。然后迅速传播开来,多年来一直在GitHub上提供下载。但迫于微软的压力,GitHub删除了相关链接。WRK微软还是挺大手笔的。2006年左右,为了让大学生学习操作系统,基于WindowsServer2003内核,他们正式发布了一个名为WindowsResearchKernel的项目,简称WRK。WRK是Windows内核代码的“阉割版”,去除了Windows中的窗口实现、TCP/IP协议栈等多个功能模块。但保留了进程/线程管理、内存管理、I/O管理、对象管理等重要功能。虽然是“阉割版”,但还是很值得入手的一个版本,毕竟是官方出的。ReactOS官网:https://reactos.org/这里的React不是前端框架中的React,这是逆向工程中的杰作。这里简单介绍一下逆向工程。我们通常开发软件的过程是“正向”的,即编写源代码,然后用编译器编译链接生成CPU指令,最后集成形成可执行文件。逆向工程就是将上述过程逆向进行的过程,从一个可执行文件出发,通过分析文件中的代码指令,最终推导出原始源代码。你可能听说过对某个程序进行逆向工程,但你知道有人直接逆向了整个Windows操作系统吗?注意这是整个操作系统,不仅仅是底层的Kernel,还有一系列的驱动程序,以及上层的Windows服务程序、动态链接库,甚至是Windows内置的桌面资源管理器程序和IE浏览器等.ReactOS集成了很多伟大的劳动,相当于Windows的翻版,力求在各种数据结构的设计上与Windows保持一致。为了实现Windows上的程序也能在上面正确运行。这种工作量想想都觉得可怕。有趣的是,微软工程师指责ReactOS项目组抄袭WRK中的源代码,两者之间的争论从未停止过。不过需要注意的是,毕竟是逆向工程。有许多细节与Windows的实际实现不同。一般在上述项目中找不到的时候,就会参考ReactOS。有时候你需要结合上面几个不同版本的实现来比较,才能熟悉彼此之间的差异。源码是有的,但是这么多你怎么看?欢迎继续关注,并在以后提供一些阅读方法和心得,共同探讨如何在浩瀚的源码中穿行而不迷路。
