type
Post
status
Published
slug
2022/06/09/1654767003313
tags
osdev
Linux
category
osdev
icon
password
Property
Dec 7, 2022 12:43 AM
created days

1 欢迎

欢迎来到操作系统开发;伟大的边境。
并不是所有的“成功”都在这个领域,毕竟有很多没有通过操作系统就开发出的 “Hello World”,但也许你会更进一步,创造下一个Linux?还是 Windows ?或者你的目标更低一点 - MenuetOS?甚至CP/M?
无论你的目标是什么,OSDev'ing(开发一个操作系统)都是编程的巅峰之作。但是,在这条道路上你并不孤单,因为,整个网站,包括论坛和这个 Wiki,都致力于操作系统的开发。这不仅关乎出色的编程技能,还关乎社区与其他论坛成员或 IRQ 之间的友谊发展。
如果你想了解在操作系统的开发中取得成功需要什么?你应该阅读这个入门文章。如果您打算使用 C/C++ 作为您选择的语言,您需要先构建一个 GCC 交叉编译器。如果您更喜欢使用其他语言,那么拥有一些类似的工具(例如编译器)很重要,如果没有这样的工具,那么你只能自己去做一个开天辟地的先行者了。毕竟,在你的工作中使用你所喜欢的语言可以更加拥有前进的动力和兴奋。
祝你好运!

2 什么是操作系统?

操作系统是控制计算机系统及其资源的操作的软件。抛开其它不谈,所有操作系统其实都有一个非常重要的共同标准:
Capable of loading and executing user programs providing standardized (hardware-independent) input / output interface for them. 能够加载和执行用户程序,为他们提供标准化的(硬件独立的)输入/输出接口。
操作系统的主要功能可能包括:
  • 管理内存和其他系统资源。
  • 实施安全和访问策略。
  • 调度和多路复用进程和线程。
  • 动态启动和关闭用户程序。
  • 提供基本的用户界面和应用程序编程器界面(API)。
并非所有操作系统都提供上述全部功能。像 MS-DOS 这样的单任务系统并不会调度进程,而像 eCOS 这样的嵌入式系统可能没有用户界面,或者可能使用一组静态的用户程序。
操作系统不是:
  • 计算机硬件。
  • 一个特定的应用程序,例如文字处理器、网络浏览器或游戏。
  • 一套实用程序(如在许多 Unix 派生系统中使用的 GNU 工具)。
  • 开发环境(尽管某些操作系统,例如 UCSD PascalSmalltalk-80,包含解释器和 IDE)。
  • 图形用户界面(尽管许多现代操作系统将 GUI 作为操作系统的一部分)。
虽然大多数操作系统都带有此类工具,但它们本身并不是操作系统的必要部分。一些操作系统,如 Linux,可能有几种不同的打包形式,称为发行版,它们可能有不同的应用程序和实用程序套件,并且可能以不同的方式组织系统的某些方面。尽管如此,它们都是同一套基本操作系统的版本,不应被视为不同类型的操作系统。

3 什么是内核?

操作系统的内核是你永远看不到的。它基本上使任何其他程序都可以执行。它处理由硬件(称为中断)和软件(称为系统调用)产生的事件,并管理对资源的访问。
例如,硬件事件处理程序(中断处理程序)将获取您刚刚按下的键的编号,并将其转换为存储在缓冲区中的相应字符,以便某些程序可以检索它。
系统调用由用户级程序发起,用于打开文件、启动其他程序等。对于每个系统调用,处理程序必须检查传递的参数是否有效,然后再执行内部操作以完成请求。
大多数用户程序都不会直接发出系统调用(asm 程序除外),而是使用标准库来完成内核要求的参数格式化,和以及法期系统调用的低层工作。 (例如,C 函数 fopen() 最终会调用一个实际执行打开文件动作的内核函数。)
内核通常会定义一些抽象,如文件、进程、套接字、目录等,它们对应于各种操作最后记录下的内部状态,以便程序可以更有效地进行操作会话。

4 什么是 shell?

Shell 是一种特殊程序,通常集成在 OS 发行版中,它为人类提供与计算机的接口。它对用户的展示方式可能因系统而异(命令行、文件资源管理器等),但概念始终一致:
  • 允许用户选择要启动的程序,并可选择为其提供特定于会话的参数。
  • 允许对本地存储进行简单的操作,例如列出目录内容、在系统中移动和复制文件。
为了完成上面列出的这些操作,shell 可能必须发出许多系统调用,例如“打开文件 'x';打开文件 'y',如果它不存在则创建它;从 X 读取内容,写入 Y,关闭两个文件,将“完成”写入标准输出”
shell 也可能被想要启动其他程序但不想自己执行此操作的程序使用(例如,完成像“*.mp3”这样的文件模式匹配,检索程序的确切路径等)。
现代 shell 还可以具有各种额外的功能,例如:
  • 自动补全:通过按 TAB(或任何首选)键,将用户输入的单词补全为有效的 shell 命令、文件、目录或其他内容。多次按下自动完成键可循环其他补全可能。
  • 字符插入:用户可以使用箭头键在他或她输入的内容之间进行移动。在句子中间输入新字符时,字符将被“插入”。
  • Shell History:通过使用向上和向下箭头键,用户可以滚动浏览以前的输入。
  • 滚动:当行数超过控制台的高度时,将输出保存在缓冲区中,并允许用户在控制台中上下滚动。
  • 脚本:一些 shell 有自定义脚本语言。脚本语言的示例是 Bash 或 DOS 批处理。
  • ...

5 GUI 是关于什么的?

图形用户界面是任何操作系统中最显眼的部分。它的作用不仅仅是一个简单的绘图库;它还必须能够:
  • 捕获用户输入事件(键盘、鼠标等)并将它们分派给适当的对象。
  • 更新将在屏幕上显示的信息,确定屏幕的哪些部分需要重绘。
  • 更新可见的屏幕内容,重新绘制必要的部分。
  • 以一种用户感觉自然、直观和响应迅速的方式进行操作。

5.1 桌面环境、窗口管理器、小部件库

当您启动 KDE 或 Windows 会话时,这是一个桌面环境,即一个为所有低级功能提供功能环境的图形外壳。
窗口管理器是负责组织各种正在运行的程序的窗口、调整它们的大小/关闭小工具、窗口边框、滚动条等的系统部分。
最终,您拥有了绘制控制元素、在屏幕上呈现文档等的子系统;这通常称为小部件库。然而,小部件库也有替代品,通常以声明性语言的形式出现(例如,Mozilla的XUL,Qt的QML)。

5.2 GUI 相关的论坛主题

6 为什么要开发操作系统?

人们选择开发操作系统的原因有很多。每个开发人员可能有他们自己独特的原因,但一些(可能是大多数)开发人员有一些共同的原因:
  • 完全控制机器。
    • 在开发应用程序或其他用户空间程序时,开发人员必须将其他人编写的代码考虑在内:操作系统、库、其他程序等。当一台机器上运行的唯一代码是你自己编写的时候,这是一种令人兴奋的感觉。
  • 研究。
    • 相当多的操作系统项目是作为家庭作业或研究项目开始的。虽然在大专或大学环境中将操作系统作为家庭作业,是一个坏主意(由于期限短),但作为一个长期学业项目却很好。
    • 研究项目通常是为了改进现有的操作系统。然而,一个常见的初学者错误是开发者低估了从头开始编写操作系统所需的时间。
  • 替换当前可用的操作系统。
    • 也许他们没有开发人员想要的特定功能。或者它们用起来很糟糕(Linux 臃肿,Windows 不稳定等)。也可能是为了盈利;但是盈利回报可能需要很长时间。
  • 因为它很有趣。
    • 低级编程是一项有趣且令人感到兴奋的事情,因为您必须自己实现所有事情。
    • 这可能看起来很困难(不用担心),但这正是它的魅力所在不是吗?在这个过程中你知道所有的一切是如何运作的,它是如何适应的,以及你的程序最内部的运作方式。
不幸的是,许多操作系统项目都是出于错误的原因诞生的。参见初学者错误列表

7 See Also

7.1 Articles

 
欢迎加入喵星计算机技术研究院,原创技术文章第一时间推送。
notion image
 
wiki.osdev.org 系列之(五)- Getting Startedwiki.osdev.org 系列之(三)- Beginner Mistakes

  • Waline
  • Utterance