“Introduction”的版本间差异

来自osdev
跳到导航 跳到搜索
(创建页面,内容为“== Welcome == 欢迎来到操作系统开发;伟大的边疆。 在这个领域,并不是所有人都“成功”,许多人甚至没有通过操作系统开发的“Hello World”,但也许你会更进一步,创建下一个Linux?还是窗户?或者你的目标是更低的?甚至CP/M? 无论你的目标是什么,OSDev'ing都是编程的巅峰。 但是,你并不孤单。 事实上,整个网站,包括[http://forum.osdev.org论坛]和…”)
 
第1行: 第1行:
== Welcome ==
== 欢迎 ==
欢迎来到操作系统开发;伟大的边疆。
欢迎来到操作系统开发; 软件开发的伟大边疆。


在这个领域,并不是所有人都“成功”,许多人甚至没有通过操作系统开发的“Hello World”,但也许你会更进一步,创建下一个Linux?还是窗户?或者你的目标是更低的?甚至CP/M?
并不是所有人在这个领域都能获得 “成功” ,许多人甚至没有通过 “Hello World”级别的操作系统开发,但也许你会走得更远,创建下一个Linux? 还是Windows? 还是你的目标较低 - MenuetOS?? 甚至是CP/M?


无论你的目标是什么,OSDev'ing都是编程的巅峰。 但是,你并不孤单。 事实上,整个网站,包括[http://forum.osdev.org论坛]和这个Wiki都是专门为OSDev'ing开发的。 这不仅关乎出色的编程技能,还关乎社区和发展友谊。 论坛成员或IRQ和流程之间的友谊。
无论你的目标是什么,操作系统开发工作都是编程的顶峰。 但是,你并不孤单。 实际上,整个网站,包括 [http://forum.osdev.org 论坛] 和此Wiki,都致力于介绍操作系统开发。 这里不仅有出色的编程技能,还有交流社区和发展友谊。 不仅是和论坛成员,还和IRQ和进程之间的发展友谊。


您需要什么才能成功地进行OSDev'ing?您应该阅读[[Getting Started]]这篇文章。 如果您打算使用C/C++作为您选择的语言,那么首先需要构建[[GCC交叉编译器]]。 如果你喜欢使用其他[[语言]],那么拥有一些类似的工具(例如编译器)是很重要的,或者如果没有这样的工具,通常只有你的努力才能帮助你。 但是,使用你喜欢的语言可以在工作中增加一些动力和刺激。
你需要什么才能成功? 你应该阅读 [[Getting Started|入门]]这篇文章。 如果要使用C/C++作为你选择的语言,则需要首先构建 [[GCC Cross-Compiler]]。 如果你喜欢使用其他 [[Languages]],那么拥有一些相关的工具 (例如编译器) 是很重要的。如果你喜欢的语言还没有合适的工具,通常需要你自己去努力解决。 但是,使用你喜欢的语言可以在你的工作中增加一些动力和激情。


祝你好运
祝你好运!


== 什么是操作系统? ==
== 什么是操作系统?==


操作系统是控制计算机系统及其资源运行的软件。 除此之外,所有操作系统都有一个非常重要的共同标准:
操作系统是控制计算机系统及其资源的操作软件。 除其他事项外,所有操作系统都有一个非常重要的标准:


能够加载和执行用户程序,为其提供标准化(独立于硬件的)输入/输出接口。
  能够加载和执行用户程序,为他们提供标准化的 (独立于硬件的) 输入/输出接口。


操作系统的主要功能可能包括:
操作系统的主要功能可能包括:


*管理内存和其他系统资源。
* 管理内存和其他系统资源。
* 强制实施安全和访问策略。
* 实施安全和访问策略。
* 调度和多路复用进程和线程。
* 调度和复用进程或线程。
* 动态启动和关闭用户程序。
* 动态启动和关闭用户程序。
* 提供基本的用户界面和应用程序程序员界面。
* 提供基本的用户界面和应用程序程序员界面。


并非所有操作系统都提供所有这些功能。 像MS-DOS这样的单任务系统不会安排进程,而像eCOS这样的嵌入式系统可能没有用户界面,或者可能使用一组静态用户程序。
并非所有操作系统都提供所有这些功能。 像MS-DOS这样的单任务系统不会多进程调度,而像eCOS这样的嵌入式系统可能没有用户界面,或者仅可以使用一组静态的用户程序。


操作系统为“非”:
一个操作系统 '''不是''':


* 计算机硬件。
* 计算机硬件。
* 特定的应用程序,如文字处理器、web浏览器或游戏。
* 一个特定的应用程序,如文字处理器,网络浏览器或游戏。
* 一套实用程序(如GNU工具,在许多Unix派生系统中使用)。
* 一套实用程序 (例如许多Unix衍生系统中使用的GNU工具)。
*开发环境(尽管有些操作系统,如UCSD Pascal或Smalltalk-80,包含解释器和IDE)。
* 开发环境 (尽管某些OS,例如UCSD Pascal或Smalltalk-80,包含解释器和IDE)。
*图形用户界面(尽管许多现代操作系统将GUI作为操作系统的一部分)。
* 图形用户界面 (尽管许多现代操作系统都将GUI作为操作系统的一部分)。


虽然大多数操作系统都使用这些工具进行分发,但它们本身并不是操作系统的必要组成部分。 一些操作系统,如Linux,可能以几种不同的打包形式出现,称为“分发版”,它们可能具有不同的应用程序和实用程序套件,并且可能以不同的方式组织系统的某些方面。 尽管如此,它们都是相同基本操作系统的所有版本,不应被视为不同类型的操作系统。
虽然大多数操作系统都分布有这样的工具,但它们本身并不是操作系统的必要组成部分。 某些操作系统 (例如Linux) 可能以几种不同的打包形式出现,称为 “发行版”,它们可能具有不同的应用程序和实用程序套件,并且可能在系统的某些方面以不同的方式组织。 尽管如此,它们都是同一基本操作系统的版本,不应被视为单独的操作系统类型。


== 什么是内核? ==
== 什么是内核?==


操作系统的内核是你永远看不到的。 它基本上可以执行任何其他程序。 它处理由硬件(称为“中断”)和软件(称为“系统调用”)生成的事件,并管理对资源的访问。
操作系统的内核是你永远不会看到的。 基本上任何其他程序能够执行都需要靠它。 它处理由硬件 (称为 “中断”) 和软件 (称为 “系统调用”) 生成的事件,并管理对资源的访问。


例如,硬件事件处理程序(“中断处理程序”)将获取您刚才按下的键的编号,并将其转换为存储在缓冲区中的相应字符,以便某些程序可以检索它。
例如,硬件事件处理程序 (“中断处理程序”) 将获取你刚刚按下的键的编号,并将其转换为存储在缓冲区中的相应字符,以便某些程序可以检索它。


“系统调用”由用户级程序启动,用于打开文件、启动其他程序等。 每个系统调用处理程序都必须检查传递的参数是否有效,然后执行内部操作以完成请求。
''系统调用''是由用户级程序发起的,用于打开文件、启动其他程序等。 每个系统调用处理程序都必须检查传递的参数是否有效,然后执行内部操作,以完成请求。


大多数用户程序不直接发出系统调用(例如,asm程序除外),而是使用“标准库”,它完成内核所需的格式化参数和生成系统调用的难看工作。 (例如,C函数“”fopen()“”最终调用实际打开文件的内核函数。)
大多数用户程序不会直接发出系统调用 (有些asm程序除外),而是使用 “标准库”,该库可以根据内核要求格式化参数并生成系统调用。 (例如,C函数''fopen()''最终调用了一个实际打开文件的内核函数。)


内核通常定义一些“抽象”,如文件、进程、套接字、目录等,它们对应于它记忆的关于最后一次操作的内部状态,以便程序可以更有效地发出操作会话。
内核通常会定义一些 “抽象”概念,例如文件File,进程Processe,套接字Socket,目录Directory等,它们对应于它记住的关于最后操作的内部状态,因此程序可以更有效地开展操作会话。


== 什么是贝壳? ==
== 什么是shell?==


shell是一种特殊的程序,通常集成在操作系统发行版中,为人类提供与计算机的接口。 它对用户的显示方式可能因系统而异(命令行、文件浏览器等),但概念始终相同:
shell是一种通常会集成在OS发行版中的特殊程序,它为人们提供了与计算机的接口。 它在用户看起来的样子可能因系统而异 (命令行,文件资源管理器等),但概念始终相同:


* 允许用户选择要启动的程序,并可选地为其提供特定于会话的参数。
* 允许用户选择要启动的程序,并为其提供可选地特定于会话的参数。
* 允许在本地存储上执行简单的操作,如列出目录的内容、在系统中移动和复制文件。
* 允许在本地存储上进行琐碎的操作,例如列出目录的内容,在系统中移动和复制文件。


为了完成这些操作,shell可能必须发出许多系统调用,如“打开文件“x”;打开文件“y”,如果不存在则创建它;从x读取内容,写入y,关闭两个文件,将“完成”写入标准输出”。
为了完成这些操作,shell可能必须发出许多系统调用,例如 “打开文件 'x'; 打开文件 'y' 并在不存在时创建它; 从X读取内容,写入Y,关闭两个文件,将 'done' 文本写入标准输出”。


shell也可用于希望启动其他程序但不希望自己启动的程序(例如,完成“*.mp3”等文件模式,检索程序的确切路径等)。
shell也可以被不想自己主动运行的程序用于启动程序 使用 (例如,完成像 “*.mp3” 这样的文件模式,检索程序的确切路径等)。


现代Shell还可以具有各种附加功能,例如:
现代shell也可以有各种额外的特征,例如以下:


*自动完成:通过按TAB(或任何首选)键,用户正在键入的单词将完成为有效的shell命令、文件、目录或其他内容。按自动完成键多次循环其他完成可能性。
* 自动完成: 通过按TAB键 (或其它定制键) ,用户键入的单词将完成有效的shell命令,文件,目录或其他内容。 多次按自动完成键可以在其他完成可能性间循环。
*字符插入:用户可以使用箭头键在输入的内容中移动。当在句子的中间键入新的字符时,字符将被“插入”。
* 字符插入: 用户可以使用箭头键在输入的内容中移动。”。 在句子中间键入新字符时,字符会得到 “插入”。
*Shell History:通过使用向上和向下箭头键,用户可以滚动浏览以前的输入。
* Shell历史: 通过使用向上和向下箭头键,用户可以滚动浏览以前的输入。
*滚动:当有超过控制台高的行数时,将输出保存在缓冲区中,并允许用户在控制台中上下滚动。
* 滚动: 当有比控制台可容纳的行更多时,将输出保存在缓冲区中,并允许用户在控制台中上下滚动。
*脚本:一些shell具有自定义脚本语言。脚本语言的例子有Bash或DOS批处理。
* 脚本: 一些shell具有自定义脚本语言。脚本语言的例子有Bash或DOS批处理。
* ...
*...


== GUI是关于什么的? ==
== GUI是关于什么的?==


图形用户界面是任何具有图形用户界面的操作系统中最可见的部分。 它的作用不仅仅是一个简单的绘图库;它还必须能够:
图形用户界面是任何这类操作系统中最可见的部分。 它的作用超越了简单的绘图库; 它还必须能够:


* 捕获用户输入事件(键盘、鼠标等)并将其发送到适当的对象。
* 捕获用户输入事件 (键盘,鼠标等) 并将其分发到适当的对象。
* 更新屏幕上显示内容的内部信息,确定屏幕的哪些部分需要重新绘制。
* 更新屏幕上要显示的内容的内部信息,确定需要重新绘制屏幕的哪些部分。
* 更新“可见”屏幕内容,重新绘制必要的部分。
* 更新 “可见” 屏幕内容,重新绘制必要的部分。
* 以一种自然、直观和响应用户的方式进行操作。
* 以自然,直观和响应用户的方式进行操作。


=== 桌面环境、窗口管理器、小部件库 ===
=== 桌面环境、窗口管理器、小部件(Widget)库 ===


当您启动KDE或Windows会话时,这是一个“桌面环境”,即为所有较低级别功能提供功能环境的图形shell。
当你启动到KDE或Windows会话时,这是一个 “桌面环境”,即为所有较低级别功能提供功能环境的图形外壳。


系统中负责组织各种运行程序的窗口、其大小调整/关闭小工具、窗口边框、滚动条等的部分是“窗口管理器”。
系统中负责组织各种正在运行的程序的窗口,其大小调整/关闭小工具,窗口边框,滚动条等部分功能是 “窗口管理器”赋予的。


最后,您有一个子系统,用于绘制控制元素、在屏幕上呈现文档等。;这通常称为“小部件库”。然而,小部件库也有替代品,通常以声明性语言的形式出现(例如,Mozilla的XUL、Qt的QML)。
最后,你可以使用子系统来绘制控制元素,在屏幕上渲染文档等; 这通常称为 “小部件库”。 但是,还有一些小部件库的替代方案,通常可以采用声明性语言的形式 (例如,Mozilla的XUL,Qt的QML)。


=== GUI相关论坛线程 ===
=== 与GUI相关的论坛主题 ===


* [[Topic:8783|Will you implement a GUI?]]
* [[Topic:8783| 你会实现GUI吗?]]
* [[Topic:9432|GUI design]]
* [[Topic:9432| GUI设计]]
* [[Topic:9448|Handling input events in GUI]]
* [[Topic:9448| 在GUI中处理输入事件]]


== 为什么要开发操作系统? ==
== 为什么要开发一个操作系统?==


人们选择开发操作系统有多种原因。 每个开发人员可能都有自己的原因,但有些(如果不是大多数)开发人员有一些共同的原因:
人们选择开发操作系统的原因多种多样。每个开发人员可能都有自己的原因,但是以下这些在某些 (也许不一定是大多数) 开发人员中很常见:


* 完全控制机器。 在开发应用程序或其他用户空间程序时,开发人员必须考虑其他人编写的代码:操作系统、库、其他程序等。 这是一种强烈的感觉,在机器上运行的唯一代码是您自己的。
* 完全控制机器。 开发应用程序或其他用户空间程序时,开发人员必须考虑其他人编写的代码: 操作系统,库,其他程序等。 对于在计算机上运行的唯一代码是你自己的代码,这是一种强烈的感觉。


* 研究。 相当多的操作系统项目是作为家庭作业或研究项目开始的。 虽然在大学预科或一年级环境中作为家庭作业启动操作系统通常被认为是一个坏主意(由于期限较短),但长期项目是相当不错的。 研究项目通常是为了改进现有的操作系统。 然而,初学者的一个常见错误是低估了从头开始编写操作系统所需的时间。
* 研究。 相当多的操作系统项目是作为家庭作业或研究项目开始的。 虽然在预科或大学第一年把操作系统作为家庭作业通常被认为是一个坏主意 (由于期限较短),但长期项目相当不错。 通常是进行研究项目以改进现有操作系统。 但是,一个初学者常见的错误是低估了从头开始编写操作系统所需的时间。


*替换当前可用的操作系统。 也许他们没有开发人员想要的特定功能。 也许他们只是一般的吸吮(Linux是臃肿的,Windows是不稳定的,等等)。这可能是为了利润;尽管任何回报都可能需要很长时间。
* 替换当前可用的操作系统。 也许这类开发人员并没有计划想要的特定功能。 也许它们只是讨厌一般的操作系统问题 (Linux 较为臃肿,Windows不太稳定等)。 这可能是为了盈利; 尽管任何回报都可能需要很长时间。


*因为它很有趣。 低级编程是一项有趣而令人兴奋的任务,因为你必须做所有的事情。 这可能看起来更难(是的,别担心),但出于同样的原因,这更有趣。 你知道每件事是如何工作的,它是如何适合你的,以及你的程序最内在的运作方式。
* 因为它很有趣。 低级编程是一项有趣而令人兴奋的任务,因为你必须做所有事情。 这可能看起来更困难 (这不是问题),但由于同样的原因也更有趣。 你知道一切是如何工作的,它是如何适应的,以及你的程序最内部的工作过程。


不幸的是,许多操作系统项目是出于错误的原因进行的。有关列表,请参见[[Beginner Mistakes]]。
不幸的是,许多操作系统项目都是出于错误的原因进行的。 有关列表,请参阅 [[Beginner Mistakes|初学者错误]]。


== See Also ==
== 另见 ==
=== Articles ===
=== 文章 ===


* [[Required Knowledge]]
* [[Required Knowledge]]

2022年2月10日 (四) 02:24的版本

欢迎

欢迎来到操作系统开发; 软件开发的伟大边疆。

并不是所有人在这个领域都能获得 “成功” ,许多人甚至没有通过 “Hello World”级别的操作系统开发,但也许你会走得更远,创建下一个Linux? 还是Windows? 还是你的目标较低 - MenuetOS?? 甚至是CP/M?

无论你的目标是什么,操作系统开发工作都是编程的顶峰。 但是,你并不孤单。 实际上,整个网站,包括 论坛 和此Wiki,都致力于介绍操作系统开发。 这里不仅有出色的编程技能,还有交流社区和发展友谊。 不仅是和论坛成员,还和IRQ和进程之间的发展友谊。

你需要什么才能成功? 你应该阅读 入门这篇文章。 如果要使用C/C++作为你选择的语言,则需要首先构建 GCC Cross-Compiler。 如果你喜欢使用其他 Languages,那么拥有一些相关的工具 (例如编译器) 是很重要的。如果你喜欢的语言还没有合适的工具,通常需要你自己去努力解决。 但是,使用你喜欢的语言可以在你的工作中增加一些动力和激情。

祝你好运!

什么是操作系统?

操作系统是控制计算机系统及其资源的操作软件。 除其他事项外,所有操作系统都有一个非常重要的标准:

 能够加载和执行用户程序,为他们提供标准化的 (独立于硬件的) 输入/输出接口。

操作系统的主要功能可能包括:

  • 管理内存和其他系统资源。
  • 实施安全和访问策略。
  • 调度和复用进程或线程。
  • 动态启动和关闭用户程序。
  • 提供基本的用户界面和应用程序程序员界面。

并非所有操作系统都提供所有这些功能。 像MS-DOS这样的单任务系统不会多进程调度,而像eCOS这样的嵌入式系统可能没有用户界面,或者仅可以使用一组静态的用户程序。

一个操作系统 不是:

  • 计算机硬件。
  • 一个特定的应用程序,如文字处理器,网络浏览器或游戏。
  • 一套实用程序 (例如许多Unix衍生系统中使用的GNU工具)。
  • 开发环境 (尽管某些OS,例如UCSD Pascal或Smalltalk-80,包含解释器和IDE)。
  • 图形用户界面 (尽管许多现代操作系统都将GUI作为操作系统的一部分)。

虽然大多数操作系统都分布有这样的工具,但它们本身并不是操作系统的必要组成部分。 某些操作系统 (例如Linux) 可能以几种不同的打包形式出现,称为 “发行版”,它们可能具有不同的应用程序和实用程序套件,并且可能在系统的某些方面以不同的方式组织。 尽管如此,它们都是同一基本操作系统的版本,不应被视为单独的操作系统类型。

什么是内核?

操作系统的内核是你永远不会看到的。 基本上任何其他程序能够执行都需要靠它。 它处理由硬件 (称为 “中断”) 和软件 (称为 “系统调用”) 生成的事件,并管理对资源的访问。

例如,硬件事件处理程序 (“中断处理程序”) 将获取你刚刚按下的键的编号,并将其转换为存储在缓冲区中的相应字符,以便某些程序可以检索它。

系统调用是由用户级程序发起的,用于打开文件、启动其他程序等。 每个系统调用处理程序都必须检查传递的参数是否有效,然后执行内部操作,以完成请求。

大多数用户程序不会直接发出系统调用 (有些asm程序除外),而是使用 “标准库”,该库可以根据内核要求格式化参数并生成系统调用。 (例如,C函数fopen()最终调用了一个实际打开文件的内核函数。)

内核通常会定义一些 “抽象”概念,例如文件File,进程Processe,套接字Socket,目录Directory等,它们对应于它记住的关于最后操作的内部状态,因此程序可以更有效地开展操作会话。

什么是shell?

shell是一种通常会集成在OS发行版中的特殊程序,它为人们提供了与计算机的接口。 它在用户看起来的样子可能因系统而异 (命令行,文件资源管理器等),但概念始终相同:

  • 允许用户选择要启动的程序,并为其提供可选地特定于会话的参数。
  • 允许在本地存储上进行琐碎的操作,例如列出目录的内容,在系统中移动和复制文件。

为了完成这些操作,shell可能必须发出许多系统调用,例如 “打开文件 'x'; 打开文件 'y' 并在不存在时创建它; 从X读取内容,写入Y,关闭两个文件,将 'done' 文本写入标准输出”。

shell也可以被不想自己主动运行的程序用于启动程序 使用 (例如,完成像 “*.mp3” 这样的文件模式,检索程序的确切路径等)。

现代shell也可以有各种额外的特征,例如以下:

  • 自动完成: 通过按TAB键 (或其它定制键) ,用户键入的单词将完成有效的shell命令,文件,目录或其他内容。 多次按自动完成键可以在其他完成可能性间循环。
  • 字符插入: 用户可以使用箭头键在输入的内容中移动。”。 在句子中间键入新字符时,字符会得到 “插入”。
  • Shell历史: 通过使用向上和向下箭头键,用户可以滚动浏览以前的输入。
  • 滚动: 当有比控制台可容纳的行更多时,将输出保存在缓冲区中,并允许用户在控制台中上下滚动。
  • 脚本: 一些shell具有自定义脚本语言。脚本语言的例子有Bash或DOS批处理。
  • ...

GUI是关于什么的?

图形用户界面是任何这类操作系统中最可见的部分。 它的作用超越了简单的绘图库; 它还必须能够:

  • 捕获用户输入事件 (键盘,鼠标等) 并将其分发到适当的对象。
  • 更新屏幕上要显示的内容的内部信息,确定需要重新绘制屏幕的哪些部分。
  • 更新 “可见” 屏幕内容,重新绘制必要的部分。
  • 以自然,直观和响应用户的方式进行操作。

桌面环境、窗口管理器、小部件(Widget)库

当你启动到KDE或Windows会话时,这是一个 “桌面环境”,即为所有较低级别功能提供功能环境的图形外壳。

系统中负责组织各种正在运行的程序的窗口,其大小调整/关闭小工具,窗口边框,滚动条等部分功能是 “窗口管理器”赋予的。

最后,你可以使用子系统来绘制控制元素,在屏幕上渲染文档等; 这通常称为 “小部件库”。 但是,还有一些小部件库的替代方案,通常可以采用声明性语言的形式 (例如,Mozilla的XUL,Qt的QML)。

与GUI相关的论坛主题

为什么要开发一个操作系统?

人们选择开发操作系统的原因多种多样。每个开发人员可能都有自己的原因,但是以下这些在某些 (也许不一定是大多数) 开发人员中很常见:

  • 完全控制机器。 开发应用程序或其他用户空间程序时,开发人员必须考虑其他人编写的代码: 操作系统,库,其他程序等。 对于在计算机上运行的唯一代码是你自己的代码,这是一种强烈的感觉。
  • 研究。 相当多的操作系统项目是作为家庭作业或研究项目开始的。 虽然在预科或大学第一年把操作系统作为家庭作业通常被认为是一个坏主意 (由于期限较短),但长期项目相当不错。 通常是进行研究项目以改进现有操作系统。 但是,一个初学者常见的错误是低估了从头开始编写操作系统所需的时间。
  • 替换当前可用的操作系统。 也许这类开发人员并没有计划想要的特定功能。 也许它们只是讨厌一般的操作系统问题 (Linux 较为臃肿,Windows不太稳定等)。 这可能是为了盈利; 尽管任何回报都可能需要很长时间。
  • 因为它很有趣。 低级编程是一项有趣而令人兴奋的任务,因为你必须做所有事情。 这可能看起来更困难 (这不是问题),但由于同样的原因也更有趣。 你知道一切是如何工作的,它是如何适应的,以及你的程序最内部的工作过程。

不幸的是,许多操作系统项目都是出于错误的原因进行的。 有关列表,请参阅 初学者错误

另见

文章