“Required Knowledge”的版本间差异

来自osdev
跳到导航 跳到搜索
(创建页面,内容为“'''如果你认为你可以跳过这一步,那可能只是为了你。''' 编写操作系统“不是”初学者的任务。 事实上,编写操作系统通常被认为是最困难的编程任务。 在考虑像这样的项目之前,您需要高于平均水平的编程技能。 不遵守会让你看起来很傻。 您“将”需要知道的一些事情是: #“基础计算机科学”:您需要非常熟悉十六进制和二进制表示法以及…”)
 
→‎文章
 
(未显示同一用户的3个中间版本)
第1行: 第1行:
'''如果你认为你可以跳过这一步,那可能只是为了你。'''
'''在你认为可以跳过这部分前,请稍微阅读一下本页的内容。'''


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


您“将”需要知道的一些事情是:
你''将''需要知道的一些事情是:


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


== 另见 ==
==另见==


* A particularly good and excellent (but unfortunately unfinished as of yet) book on the topic: [https://github.com/tuhdo/os01/blob/master/Operating_Systems_From_0_to_1.pdf Operating Systems From 0 to 1]. This focuses on everything you need to know, from the transistor to logic circuits, Assembly and C language, ELF format and debugging etc. Read (and understand!) this book to get a quick-start on required knowledge.
*这是一本关于这个主题的特别优秀的书(但不幸的是尚未完成): [https://github.com/tuhdo/os01/blob/master/Operating_Systems_From_0_to_1.pdf 从0到1开发操作系统]。 该课程重点介绍你需要了解的所有知识,从晶体管到逻辑电路、汇编语言和C语言、ELF格式和调试等。


=== Articles ===
=== 文章 ===


* [[Books]]
*[[Books|推荐书籍]]


[[Category:OS theory]]
[[Category:OS theory]]

2022年3月21日 (一) 05:50的最新版本

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

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

需要知道的一些事情是:

  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-Again shell,但C shell和KornShell也可用。
  8. 工具链: 你必须了解编译器、汇编器、链接器和make工具集的行为细节。 你应该知道发出的警告和错误是什么意思。 你应该手头有你使用的工具的相关文档,并在询问社区之前参考它们。 请放心,关于GCC GNU 汇编NASMGNU LDVisual StudioGRUB的任何可能的初学者问题都已经被多次回答过了。 先搜索再提问。
  9. 模拟器和虚拟机: 熟悉BochsVirtualBoxQEMU Virtual PC等工具是在开发中实现高效合理的关键。 这些工具在真实硬件和测试系统之间提供了一个缓冲区。 虽然这些知识可能仅用于操作系统开发的特定目的,但在开始一个操作系统项目之前,你肯定会想知道它们是什么,以及从哪里获得它们。
  10. 可执行格式: 内核空间编程有许多应用程序开发未知的额外需求。 能够解析可执行二进制文件就是其中之一(你当然希望你的操作系统加载并执行应用程序,不是吗?) 你要让自己熟悉Executable File Types|可执行文件类型,它们的内部结构,以及链接器如何生成它们。
  11. 平台: 你应该研究一下你将要为之编程的处理器的手册。 它们包含了设计内核所需的信息。 求助这些这些方面的信息,恐怕只会得到 读(…)手册的回应,甚至粗暴的RTFM(ReadTheFuckingManual)。
  12. 理论知识: 你应该了解现有操作系统在技术层面的功能(可以通过阅读这些书籍)、它们的优点或缺点,以及你想如何使用自己的操作系统。 仅仅看完一些入门教程,然后在一个论坛上问“现在要怎么办?”,这只会让你看起来很傻。

另见

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

文章