原文链接:https://wiki.osdev.org/Introduction
主页:https://blog.csdn.net/qq_37422196/article/details/122591214
下面的链接如果指向原网站的话,大概是还没有翻译
在赶了在赶了……
欢迎
欢迎来到操作系统开发——编程的最前沿
不是所有人都会在这个领域成功——甚至很多人连操作系统开发的Hello World都写不出来;但你也有可能会深入探究,创造出下一个Linux或Windows;或者设定个更低的目标,MenuetOS,甚至CP/M
无论你的目标是什么,操作系统开发都是编程的巅峰之作。但,你不是一个人在战斗。事实上,整个网站,包括论坛和这个Wiki,都致力于操作系统编程。这不仅能让你获得出色的编程技能,还能加入社区,结交朋友。不过,这个朋友可能是论坛的同行,也有可能是中断请求(IRQ)和进程(一个玩笑)
怎样才能在操作系统开发获得成功?你应该阅读入门文章。如果你打算使用C/C++语言,你需要先构建一个GCC交叉编译器。如果你更喜欢使用其他语言,那么拥有一些类似的工具(比如编译器)很重要。如果你没有这样的工具,你就只能自求多福了。但是,使用你喜欢的语言可以让你工作时更加兴奋而有动力
祝你好运!
什么是操作系统?
操作系统是控制计算机系统操作及其资源的软件。尽管操作系统各有不同,它们都有一个非常重要的共同标准:
能加载和执行用户程序,为它们提供标准化的(硬件独立的)IO接口
操作系统的主要功能可能包括:
- 管理内存和其他系统资源
- 实施安全和访问策略
- 调度和multiplex进程和线程
- 动态启动和关闭用户程序
- 提供基本的用户界面和应用程序编程接口(API)
并非所有操作系统都提供以上所有功能:像 MS-DOS 这样的单任务系统不会调度进程,而像 eCOS 这样的嵌入式系统可能没有用户界面,或者可能使用一组静态的用户程序
操作系统不是:
- 计算机硬件
- 一个特定的应用程序,例如文字处理器、网络浏览器或游戏
- 一套实用程序(如在许多类Unix系统中使用的GNU工具)
- 开发环境(尽管某些操作系统,例如UCSD Pascal或Smalltalk-80,包含解释器和IDE)
- 图形用户界面(GUI)(尽管许多现代操作系统将GUI作为其一部分)
虽然大多数操作系统都带有此类工具,但它们本身并不是操作系统的必要部分。一些操作系统,如 Linux,可能有几种不同的打包形式,称为发行版,它们可能有不同的应用程序和实用程序套件,并且可能以不同的方式组织系统的某些方面。尽管如此,它们都是相同基本操作系统的版本,不应被视为不同类型的操作系统
什么是内核?
你永远也看不到操作系统的内核,它为其他任何程序的执行提供基础支持。它处理由硬件(称为中断)和软件(称为系统调用)产生的事件,并管理对资源的访问
例如,硬件事件处理程序(中断处理程序)将获取您刚刚按下的键的编号,并将其转换为存储在缓冲区中的相应字符,以便某些程序可以检索它
系统调用由用户级程序发起,用于打开文件、启动其他程序等。每个系统调用处理程序必须检查传递的参数是否有效,然后执行内部操作以完成请求
大多数用户程序不直接发出系统调用(也有例外,比如汇编程序),而是使用标准库来完成内核要求的参数格式化和生成系统调用的繁琐工作。(例如,C函数 fopen() 最终会调用一个实际打开文件的内核函数)
内核通常会定义一些抽象概念,如文件、进程、套接字、目录等,它们对应它存储的有关最后操作的内部状态,以便程序可以更有效地发出操作会话
什么是shell?
shell是一种特殊程序,通常集成在操作系统发行版中。它为人类提供操作计算机的接口。它对于用户的出现方式可能不同(命令行、文件资源管理器等),但理念是一样的:
- 允许用户选择要启动的程序,并可选择为其提供特定于会话的参数
- 允许对本地存储进行简单的操作,比如列出目录内容,在系统中移动和复制文件
为了完成这些操作,shell可能必须发出许多系统调用,例如:
- 打开文件X
- 打开文件Y,如果它不存在则创建该文件
- 从X读取内容,写入Y
- 关闭两个文件,将"完成"写入标准输出
(这不就复制吗)
shell也可能被想要调用其他程序而不想自己写的程序使用(例如匹配像“*.mp3”这样的文件模式,检索程序的完整路径等)
现代shell还可以具有各种额外的功能,例如:
- 自动补全:通过按TAB键(或其他设置按键),用户输入的单词将补全为有效的shell命令、文件、目录或其他内容。多次按下自动补全键可循环显示其他补全可能
- 字符插入:用户可以使用方向键在Ta输入的内容中移动。在句子中间输入新字符时,字符将被“插入”
- Shell历史:通过使用上下方向键,用户可以滚动浏览以前的输入
- 滚动:当行数超过控制台行数时,将输出保存在缓冲区中,并允许用户在控制台中上下滚动
- 脚本:一些shell有自定义脚本语言。脚本语言的例子是Bash和DOS批处理
- ……
GUI是做什么的?
图形用户界面(GUI)是所有有GUI的操作系统中大多数时候直接被看见的部分。它的作用不仅仅是一个简单的绘图库,还必须能够:
- 捕获用户的输入事件(键盘、鼠标等)并将它们分派给合适的对象
- 更新要在屏幕哪里显示什么的内部信息,确定屏幕的哪些部分需要重绘
- 更新可见的屏幕内容,重新绘制必要的部分
- 让用户感觉自然、直观、即时响应
桌面环境、窗口管理器、小部件库
你启动的KDE或Windows会话被称作桌面环境,即提供低级功能函数环境的图形shell
(好难翻啊……原文是 When you are launching into a KDE or Windows session, that is a desktop environment, i.e. a graphical shell providing the functional environment for all lower-level functions)
负责组织各个正在运行的程序的窗口、它们的大小调整/关闭小工具、窗口边框、滚动条等的系统部分是窗口管理器
最后,您拥有的绘制控制元素、在屏幕上呈现文档等的子系统通常称为小部件库。然而,还有一些小部件库的替代品,通常采用声明性语言的形式(例如Mozilla的XUL,Qt的QML)
GUI相关的论坛主题
为什么要开发操作系统?
人们选择开发操作系统的原因有很多。每个单独的开发者可能都有他们自己的原因,但有些原因是一些开发者所共有的:
- 完全控制机器。在开发应用程序或其他用户空间程序时,开发人员必须将其他人编写的代码考虑在内:操作系统、库、其他程序等。在机器上运行唯一的你自己的代码让人感觉非常激动
- 研究。相当多的操作系统项目是作为家庭作业或研究项目开始的。虽然在大专或大一将操作系统作为家庭作业通常被认为是一个坏主意(由于期限极短),但作为长期项目却很好。研究项目通常是改进现有的操作系统。然而,一个初学者常犯的错误是低估了从头开始编写操作系统所需的时间
- 替换当前可用的操作系统。也许他们没有开发人员想要的特定功能。也许它们表现得很糟糕(Linux 臃肿,Windows 不稳定,等等)。这可能是为了盈利,尽管任何回报都可能需要很长时间
- 因为它很有趣。低级编程是一项有趣且令人激动的任务,因为你必须自己完成所有的事情。这可能看起来更困难(不用担心),但也因此更有趣。你知道计算机操作系统是如何运作的,它是如何适应的,以及你的程序最内部是如何运作的。
不幸的是,许多操作系统项目都是出于错误的原因进行的。详情请参阅初学者易犯错误。