Introduction

来自osdev
跳到导航 跳到搜索

欢迎

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

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

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

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

祝你好运!

什么是操作系统?

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

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

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

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

并非所有操作系统都提供所有这些功能。 像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不太稳定等)。 这可能是为了盈利; 尽管任何回报都可能需要很长时间。
  • 因为它很有趣。 低级编程是一项有趣而令人兴奋的任务,因为你必须做所有事情。 这可能看起来更困难 (这不是问题),但由于同样的原因也更有趣。 你知道一切是如何工作的,它是如何适应的,以及你的程序最内部的工作过程。

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

另见

文章