Required Knowledge

来自osdev
Zhang3讨论 | 贡献2022年2月10日 (四) 03:16的版本
跳到导航 跳到搜索

在你认为可以跳过这部分前,请稍微阅读一下本页的内容。

编写操作系统不是初学者的任务。 事实上,编写操作系统通常被认为是最困难的编程任务。 在考虑像这样的项目之前,你需要高于平均水平的编程技能。 不遵守会让你看起来很傻。

需要知道的一些事情是:

  1. 基础计算机科学: 你需要非常熟悉十六进制和二进制表示法,以及布尔逻辑和类似的基础知识,如数据结构、它们的构造和操作、搜索和排序算法、抽象编程概念等。。。
  2. 语言和词汇: 你需要有能力读写(技术)英语。 几乎所有的技术文档都是英文的,你可以在网上找到的大部分资源(比如这个Wiki和[http://forum.osdev.org 论坛)也是。 使用不正确的术语会让你看起来很愚蠢,让愿意帮助你的人感到困惑。
  3. 语言和词汇,再重复一遍: 本网站上的大多数操作系统,以及大多数代码片段和示例,都是用C(或[[C++])编写的。 即使你选择使用另一种语言(比如FreeBASICPascal),C也是编程的通用语言,你应该有能力掌握它的基本用法。
  4. 汇编: 你应该了解低级语言汇编。 读一本书 在学校上一门课。 可以先编写一些用户空间代码来熟悉它。 你需要它,即使你计划用更高级的语言编写大部分操作系统。
  5. 编程经验: 用从操作系统项目去学习编程也许是个坏主意。(译者注:这里作者的意思应该是说,初学编程时如果没有现成的开发环境会比较麻烦。) 你不仅应该知道你将要开发的语言,还应该熟悉版本控制、调试等。 简而言之,在尝试操作系统开发之前,你应该已经用该语言成功地编写了很多用户空间程序。
  6. 编程实践: 你应该知道如何编写代码和用户文档,并准备好仔细记录代码和设计的所有方面,即使项目纯粹是供你个人使用。 此外,你应该学习并使用合适的代码管理实践,包括设置和使用非现场存储库 (例如Savannah, GitHub, GitLab, Heroku)。 如果你拥有以上两项基础,光是这两点就可以为你将来打下很好的基础。
  7. UNIX使用经验: 你很快就会注意到,操作系统开发中使用的许多工具都是为Unix开发,后来被移植到Windows上的。 Linux内核经常被如何实现的参考或示例,许多爱好者的操作系统与Unix有相似之处。 有Unix命令行(最好是Bash或ksh)的经验是非常重要的要求。(Cygwin为Windows提供了一个易于安装的Unix命令行。)如果还没有者方面经验,那就保持使用Linux或BSD一段时间。 对于Windows用户来说,使用虚拟机(见下文)托管虚拟系统,无需重新安装家用的操作系统,也可以轻松实现这一点。 你还可以在Windows内部安装Windows Subsystem for Linux(WSL),以访问Unix命令行。 对于macOS用户,你可以直接地使用Terminal--macOS是构建在Unix变体内核(Mach和BSD内核的组合)上的,所以只要安装了Xcode和模拟器或虚拟机,就不需要其他工具了(尽管还需要设置交叉编译器); 默认的Terminal shell是Bourne shell,但C shell和KornShell也可用。
  8. 工具链: 你必须了解编译器、汇编器、链接器和make工具集的行为细节。 你应该知道发出的警告和错误是什么意思。 你应该手头有你使用的工具的相关文档,并在询问社区之前参考它们。 请放心,关于GCC GNU 汇编NASMGNU LDVisual StudioGRUB的任何可能的初学者问题都已经被多次回答过了。 先搜索再提问。
  9. 模拟器和虚拟机: 熟悉[[Bochs]、[[VirtualBox]、[[QEMU]或[[Microsoft_Virtual_PC | Virtual PC]等工具是在开发中实现高效合理的关键。 这些工具在真实硬件和测试系统之间提供了一个缓冲区。 虽然这些知识可能仅用于操作系统开发的特定目的,但在开始一个操作系统项目之前,你肯定会想知道它们是什么,以及从哪里获得它们。
  10. 可执行格式: 内核空间编程有许多应用程序开发未知的额外需求。 能够解析可执行二进制文件就是其中之一(你当然希望你的操作系统加载并执行应用程序,不是吗?) 你要让自己熟悉Executable File Types|可执行文件类型,它们的内部结构,以及链接器如何生成它们。
  11. 平台: 你应该研究一下你将要为之编程的处理器的手册。 它们包含了设计内核所需的信息。 求助这些这些方面的信息,恐怕只会得到 读(…)手册的回应,甚至粗暴的RTFM(ReadTheFuckingManual)。
  12. 理论知识: 你应该了解现有操作系统在技术层面的功能(可以通过阅读这些书籍)、它们的优点或缺点,以及你想如何使用自己的操作系统。 仅仅看完一些入门教程,然后在一个论坛上问“现在要怎么办?”,这只会让你看起来很傻。

另见

  • 这是一本关于这个主题的特别优秀的书(但不幸的是尚未完成): 从0到1开发操作系统。 本课程重点介绍你需要了解的所有知识,从晶体管到逻辑电路、汇编语言和C语言、ELF格式和调试等。

文章=

  • [Books|书籍]]