提交 5808da0d 编写于 作者: Y Yifan Wu
......@@ -41,5 +41,5 @@ Remzi H. Arpaci-Dusseau 和 Andrea C. Arpaci-Dusseau 的《Operating Systems: Th
- 目前为止最常见的架构是 x86 和 ARM ,它们已广泛应用在服务器、台式机、移动终端和很多嵌入式系统中。由于它们的通用性和向后兼容性需求,它们需要支持非常多(包括几十年前实现)的软件系统和应用需求,导致它们越来越复杂。
- x86 后向兼容的策略确保了它在桌面和服务器领域的江湖地位,但导致其丢不掉很多已经比较过时的硬件设计,让操作系统通过冗余的代码来适配各种新老硬件特征。
- x86 和 ARM 在商业上都很成功,其广泛使用使得其 CPU 硬件逻辑越来越复杂,且不够开放,不能改变,不是开源的,难以让感兴趣探索硬件的学生了解硬件细节,在某种程度上让CPU成为了一个黑盒子,并使得操作系统与硬件的交互变得不那么透明,增加了学习操作系统的负担。
- 从某种角度上看,新出现的 RISC-V 的核心目标是灵活适应未来的 AIoT 场景,保证基本功能,提供可配置的扩展功能。其开源特征使得学生都可以可以深入CPU的运行细节,甚至可以方便地设计一个 RISC-V CPU。从而可帮助学生深入了解操作系统与硬件的协同执行过程。
- 编写面向 RISC-V 的 OS 的硬件学习代价仅仅是你了解 RISC-V 的 Supervisor 特权模式,知道 OS 在 Supervisor 特权模式下的控制能力。
\ No newline at end of file
- 从某种角度上看,新出现的 RISC-V 的核心目标是灵活适应未来的 AIoT (人工智能物联网, AI + IoT)场景,保证基本功能,提供可配置的扩展功能。其开源特征使得学生都可以可以深入CPU的运行细节,甚至可以方便地设计一个 RISC-V CPU。从而可帮助学生深入了解操作系统与硬件的协同执行过程。
- 编写面向 RISC-V 的 OS 的硬件学习代价仅仅是你了解 RISC-V 的 Supervisor 特权模式,知道 OS 在 Supervisor 特权模式下的控制能力。
......@@ -14,7 +14,7 @@
今天,我们很难想象在没有操作系统的情况下使用计算机,它塑造和构建了我们访问计算机及其外围设备的交互方式。当第一批电子计算机在第二次世界大战后被开发出来时,还没有操作系统这种东西。仅仅在计算机诞生十年后,某种操作系统的首次尝试才开始出现。又过了十年,操作系统才被大家广泛接受。
我们的讨论将集中在通用操作系统上,因为它们需要的技术是嵌入式系统所需技术的超集。现在的通用操作系统是一个复杂的系统软件,比如 Linux 操作系统达到了千万行的 C 源代码量级。在学习操作系统的初期,我们如果去分析了解这样大规模的软件,要付出巨大的代价。但这样的软件也是有其特有的一些特征。首先,它称为系统软件,简单理解它就是在一个计算机系统范围内使用的软件,可涉及到整个计算机系统。如果这样来看,一个编辑软件,如 Vi Emacs,只涉及到对文本文件的编辑,就不能算了。
我们的讨论将集中在通用操作系统上,因为它们需要的技术是嵌入式系统所需技术的超集。现在的通用操作系统是一个复杂的系统软件,比如 Linux 操作系统达到了千万行的 C 源代码量级。在学习操作系统的初期,我们如果去分析了解这样大规模的软件,要付出巨大的代价。但这样的软件也是有其特有的一些特征。它称为系统软件,简单理解它就是在一个计算机系统范围内使用的软件,可涉及到整个计算机系统。如果这样来看,一个编辑软件,如 Vi Emacs,只涉及到对文本文件的编辑,就不能算了。
而在计算机中安装的 C 标准库 libc(类似的有 Rust 标准库 等)可以算是一个,因为它提供了与OS交互的系统调用接口,其功能覆盖了整个计算机系统,会被许多不同的软件访问。不难看出,操作系统也是这样的一个系统软件。
如果我们站在一万米的高空来看 :ref:`操作系统 <computer-hw-sw>` ,可以发现操作系统这个系统软件干的事主要有两件:一是向下管理计算机硬件和各种外设,二是向上给应用软件提供各种服务帮助。我们可对其进一步描述:操作系统是一个可以管理CPU、内存和各种外设,并管理和服务应用软件的系统软件。这样的描述也是大多数操作系统教材上对操作系统的一个比较概括的定义。为了完成这些工作,操作系统需要知道如何与硬件打交道,如何更好地给应用软件提供服务,这就有一系列操作系统相关的理论、抽象、设计等来支持如何做和做得好的需求。
......@@ -26,7 +26,7 @@
如果看看我们的身边, Android 应用运行在 ARM 处理器上 Android 操作系统的执行环境中,微软的 Office 应用运行在 x86-64 处理器上 Windows 操作系统的执行环境中,Web Server应用运行在 x86-64 处理器上 Linux 操作系统的执行环境中, Web app 应用运行在 x86-64 或 ARM 处理器上 Chrome OS 操作系统的执行环境中。而在一些嵌入式环境中,操作系统以运行时库的形式与应用程序紧密结合在一起,形成一个可在嵌入式硬件上单一执行的嵌入式应用。所以,在不同的应用场景下,操作系统的边界也是不同的,我们可以把运行时库、图形界面支持库等这些可支持不同应用的系统软件 (System Software) 也看成是操作系统的一部分。
站在应用程序的角度来看,我们可以发现常见的应用程序其实是运行在由硬件、操作系统内核、运行时库、图形界面支持库等所包起来的一个 :ref:`执行环境 (Execution Environment) <exec-env>` 中,应用程序只需根据与系统软件约定好的应用程序二进制接口 (ABI, Application Binary Interface) 来请求执行环境提供的各种服务或功能,从而完成应用程序自己的功能。基于这样的观察,我们可以把操作系统再简单一点地定义为: **应用程序的软件执行环境** 。这样的简单定义能适应在操作系统发展的不同历史时期对操作系统的概括性描述和定义。从这个角度出发,操作系统可以包括运行时库、图形界面支持库等系统软件,
站在应用程序的角度来看,我们可以发现常见的应用程序其实是运行在由硬件、操作系统内核、运行时库、图形界面支持库等所包起来的一个 :ref:`执行环境 (Execution Environment) <exec-env>` 中,应用程序只需根据与系统软件约定好的应用程序二进制接口 (ABI, Application Binary Interface) 来请求执行环境提供的各种服务或功能,从而完成应用程序自己的功能。基于这样的观察,我们可以把操作系统的定义简化为: **应用程序的软件执行环境** 。这样的简单定义能适应在操作系统发展的不同历史时期对操作系统的概括性描述和定义。从这个角度出发,操作系统可以包括运行时库、图形界面支持库等系统软件,
.. image:: EE.png
:align: center
......@@ -35,7 +35,7 @@
站在计算机发展的百年时间尺度看
----------------------------------
虽然电子计算机的出现距今才仅仅七十年左右,但计算机技术和操作系统已经发生了巨大的变化。从计算机发展的短暂的历史角度看,操作系统也是从计算机诞生大约十年后,从无到有地逐步发展起来的。操作系统主要完成控制硬件控制和为应用程序提供服务这些必不可少的功能,它的历史与计算机的发展史密不可分。操作系统的内涵和功能随着历史的发展也在一直变化、改进中。如今在二十一世纪初期的大众眼中,操作系统就是他们的手机/终端上的软件系统,包括各种应用程序集合,图形界面和网络浏览器是其中重要的组成部分。
虽然电子计算机的出现距今才仅仅七十年左右,但计算机技术和操作系统已经发生了巨大的变化。从计算机发展的短暂的历史角度看,操作系统也是从计算机诞生大约十年后,从无到有地逐步发展起来的。操作系统主要完成硬件控制和为应用程序提供服务这些必不可少的功能,它的历史与计算机的发展史密不可分。操作系统的内涵和功能随着历史的发展也在一直变化、改进中。如今在二十一世纪初期的大众眼中,操作系统就是他们的手机/终端上的软件系统,包括各种应用程序集合,图形界面和网络浏览器是其中重要的组成部分。
其实,操作系统的内涵和外延随着历史的发展也一直在变化,并没有类似于“1+1=2”这样的明确定义。参考地球生物的进化史,我们也给操作系统的进化历史做一个简单的概述,从中可以看到操作系统在各个时间段上包含什么,具有什么样的特征。但无论操作系统的内在实现和具体目标如何变化,其管理计算机硬件,给应用提供服务的核心定位没有变化。
......@@ -88,7 +88,7 @@
1965年2月,在哈尔滨军事工程学院(国防科大前身)慈云桂教授等研制成功我国第一台晶体管通用电子计算机441B-I。441B-I是中国第二代计算机,具有批处理功能的操作系统雏形、汇编语言、FORTRAN语言及标准程序库等丰富的软件。
多道批处理操作系统为此采用了多道程序设计技术,就是指允许同时把多个程序放入内存,并允许它们交替在 CPU 中运行,它们共享系统中的各种硬、软件资源。当一道程序因 I/O 请求而暂停运行时, CPU 便立即转去运行另一道程序。这就像二叠纪 [#二叠纪]_ 的两栖动物,水中暂时有危险或食物不多的时候,可以离开水面到陆地上来,并享用陆地上的动植物资源。
多道批处理操作系统为此采用了多道程序设计技术,就是指允许同时把多个程序放入内存,并允许它们交替在 CPU 中运行,它们共享系统中的各种硬、软件资源。当一道程序因 I/O 请求而暂停运行时, CPU 便立即转去运行另一道程序。这就像二叠纪 [#二叠纪]_ 的两栖动物,水中暂时有危险或食物不多的时候,可以离开水面到陆地上来,并享用陆地上的动植物资源。
然而,处理器共享提出了对程序隔离的需求,以限制一个程序中的运行错误使其他程序崩溃或损坏。为此计算机中进一步添加了硬件级的内存保护机制,限制了一个程序在运行时能访问的地址空间,提高了故障隔离的能力,并减少了隔离的开销。
......@@ -118,7 +118,7 @@
.. note::
可以在 :ref:`本书第三章 <link-chapter3>` 的第四节可以看到分时操作系统的设计实现,以及操作系统可强制让应用程序被动放弃 CPU 使得应用可以公平共享系统中的软硬件资源。并且 UNIX 还有虚存、文件、进程等当前操作系统的关键特性,这些内容也在本书的第四章~第七章中有详细的设计描述。泥盆纪
可以在 :ref:`本书第三章 <link-chapter3>` 的第四节可以看到分时操作系统的设计实现,以及操作系统可强制让应用程序被动放弃 CPU 使得应用可以公平共享系统中的软硬件资源。并且 UNIX 还有虚存、文件、进程等当前操作系统的关键特性,这些内容也在本书的第四章~第七章中有详细的设计描述。
古近纪 [#古近纪]_ 哺乳动物时代
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
......@@ -129,7 +129,7 @@
.. chyyuu http://news.newhua.com/news/2009/1224/82274.shtml https://baike.baidu.com/item/CCDOS/2782730 https://zhuanlan.zhihu.com/p/161170166
1980年左右,用于远望号测量船的多机实时操作系统GX-73诞生了。1983年,国防科技大学研制了中国第一台亿次巨型机 -- 银河-I,并研制了配套的多道批处理操作系统 -- YHOS。同年,电子工业部第六研究所设计实现了面向微型计算机的操作系统CCDOS(汉字磁盘操作系统,英语:Chinese Characters Disk Operation System),这是一个在微软DOS微机操作系统上的汉化版本。80年代到90年代,微软的DOS操作系统和后继的Windows操作系统和Intel公司的x86处理器相互支持,形成了Wintel联盟,逐渐在桌面计算机市场上被广泛使用。中国的操作系统主要集中在使用范围较小的科研领域。1989年--1997年期间,中国计算机服务总公司与中国软件技术公司联合国内高校和科研院所,共同承担了开发与UNIX兼容的COSIX操作系统的科技攻关计划。COSIX取得了很多科研成果,但由于没基于新的硬件进行研发等多种隐私,最终没有形成广泛的操作系统产业生态。
1980年左右,用于远望号测量船的多机实时操作系统GX-73诞生了。1983年,国防科技大学研制了中国第一台亿次巨型机 -- 银河-I,并研制了配套的多道批处理操作系统 -- YHOS。同年,电子工业部第六研究所设计实现了面向微型计算机的操作系统CCDOS(汉字磁盘操作系统,英语:Chinese Characters Disk Operation System),这是一个在微软DOS微机操作系统上的汉化版本。80年代到90年代,微软的DOS操作系统和后继的Windows操作系统和Intel公司的x86处理器相互支持,形成了Wintel联盟,逐渐在桌面计算机市场上被广泛使用。中国的操作系统主要集中在使用范围较小的科研领域。1989年--1997年期间,中国计算机服务总公司与中国软件技术公司联合国内高校和科研院所,共同承担了开发与UNIX兼容的COSIX操作系统的科技攻关计划。COSIX取得了很多科研成果,但由于没基于新的硬件进行研发等多种因素,最终没有形成广泛的操作系统产业生态。
.. note::
......@@ -143,7 +143,7 @@
- 面向服务器的操作系统:当前大家常用的主流搜索引擎、新媒体、电子商务网站和大数据处理系统等一般都托管在数据中心的计算机上。每台计算机都是强大的服务器,运行着服务器操作系统,典型的例子是Linux。通常每台服务器只运行一个应用服务程序,例如 数据库服务器或Web 服务器等,处于处理成千上万个用户传入的网络服务请求,所以吞吐量(每秒处理的请求数量)是一个关键的优化目标。而安全和可靠也是服务器操作性系统需要重点应对的目标。服务器操作系统的一种形态是虚拟机(Virtual Machine Monitor,VMM),它可在一台物理机上虚拟出多台虚拟计算机,可以像运行应用程序一样运行另一个操作系统。通过虚拟机可以充分利用数据中心中资源利用不高的物理服务器,提供整个数据中心的运行效率。典型的服务器操作系统有:FreeBSD、微软的Windows Server、基于Linux系的RHLS、Ubuntu、openEuler、龙蜥操作系统、麒麟服务器操作系统等。
- 面向台式机/笔记本电脑和上网本的操作系统:典型的例子是:Windows 8、MacOS X、Linux、Chrome OS等。这些计算机系统是单用户的,运行许多应用程序,并具有各种 I/O 设备。有人可能认为只有一个用户,就没有必要将系统设计为支持共享,而最初的个人计算机操作系统确实采用了这种方法。
- 面向台式机/笔记本电脑和上网本的操作系统:典型的例子是:Windows 8、Mac OS X、Linux、Chrome OS等。这些计算机系统是单用户的,运行许多应用程序,并具有各种 I/O 设备。有人可能认为只有一个用户,就没有必要将系统设计为支持共享,而最初的个人计算机操作系统确实采用了这种方法。
- 面向智能移动终端(手机/平板)的操作系统:智能移动终端是一种带有强大处理器的手机或平板,能够运行第三方应用程序。智能移动终端操作系统的典型例子包括 两个霸主 iOS、Android,和曾经辉煌过的Symbian,还有几乎快消失的WebOS、Blackberry OS 和 Windows Phone等。智能移动终端一般只有一个用户,对交互响应能力、长效的电池使用时间和各种应用的支持有着迫切的需求。
......@@ -171,9 +171,9 @@
当前,大数据、人工智能、机器学习、高速移动互联网络、AR/VR 对操作系统等系统软件带来了新的挑战。如何有效支持和利用这些技术是未来操作系统的方向。同时,我们也看到操作系统的外延在放大,位于云、边、端的操作系统通过多种形态的网络基础设施,跳出了传统单机为主的运行模式,具有在分布式环境下的互联互通互操作的能力,从而扩大为分布式操作系统。
在 2020 年,我们看到了华为逐步推出的OpenHarmony系统;小米也推出了物联网软件平台小米 Vela ;阿里推出了 AliOS Thing;腾讯推出了Tencent OS;苹果公司接连推出 A14、M1 等基于 ARM 的 CPU,逐步开始淘汰 X86CPU;微软推出 Windows 10 IoT,Google 推出 Fuchsia OS。大家都在做着各种位于云、边、端的操作系统通过多种形态的网络基础设施,跳出了传统单机为主的运行模式,形成在分布式环境下的互联互通互操作的能力,的技术调整和创新
在 2020 年,我们看到了华为逐步推出的OpenHarmony系统;小米也推出了物联网软件平台小米 Vela ;阿里推出了 AliOS Thing;腾讯推出了Tencent OS;苹果公司接连推出 A14、M1 等基于 ARM 的 CPU,逐步开始淘汰 X86CPU;微软推出 Windows 10 IoT,Google 推出 Fuchsia OS。大家都在做着各种位于云、边、端的操作系统的技术调整和创新,构建多种形态的网络基础设施,跳出了传统单机为主的运行模式,形成在分布式环境下的互联互通互操作的能力
大家好像都意识到,不仅仅是人工智能和机器学习,下一个与人工智能充分融合,并分布式特征的操作系统即将到来,并试图通过这种操作系统带来的连贯用户体验,打通从数据中心、服务器、桌面、移动端、边缘设备等的整个 AI 和物联网 (IoT, Internet of Things) 的生态。也许这种未来操作系统与之前的操作系统相比,其最大的不同是具有了人工智能的属性,跳出了单个设备节点,通过多种网络从不同维度来管理多个设备。这种操作系统也许这就是尤瓦尔·赫拉利所著的“未来简史” 书 [#未来简史]_ 中描述的“无所不能”的神人。
大家好像都意识到,不仅仅是人工智能和机器学习,下一个与人工智能充分融合,并分布式特征的操作系统即将到来,并试图通过这种操作系统带来的连贯用户体验,打通从数据中心、服务器、桌面、移动端、边缘设备等的整个 AI 和物联网 (IoT, Internet of Things) 的生态。也许这种未来操作系统与之前的操作系统相比,其最大的不同是具有了人工智能的属性,跳出了单个设备节点,通过多种网络从不同维度来管理多个设备。这种操作系统也许这就是尤瓦尔·赫拉利所著的《未来简史》 [#未来简史]_ 中描述的“无所不能”的神人。
目前支持AIoT的操作系统设计实现在本书中还没有对应的章节,不过我们的同学也设计了 `zCore操作系统 <https://github.com/rcore-os/zCore>`_ ,欢迎看完本书的同学能够尝试参与或独立设计面向未来的操作系统。
......
......@@ -7,7 +7,7 @@
站在使用操作系统的角度会比较容易对操作系统的功能产生初步的认识。操作系统内核是一个需要提供各种服务的软件,其服务对象是应用程序,而用户(这里可以理解为一般使用计算机的人)是通过应用程序的服务间接获得操作系统的服务的,因此操作系统内核藏在一般用户看不到的地方。但应用程序需要访问操作系统获得操作系统的服务,这就需要通过操作系统的接口才能完成。操作系统的接口形式就是上一节提到的应用程序二进制接口 (ABI, Application Binary Interface)。
操作系统不能只提供面向单一编程语言的函数库的编程接口 (API, Application Programming Interface) ,它的接口需要考虑对基于各种编程语言的应用支持,以及访问安全等因素,使得应用软件不能访问函数库一样的直接访问操作系统内部函数,更不能直接读写操作系统内部的地址空间。为此,操作系统设计了一套安全可靠的接口,我们称为系统调用接口 (System Call Interface)。系统调用接口通常面向应用程序提供了API的描述,但在具体实现上,还需要提供ABI的接口描述规范。
操作系统不能只提供面向单一编程语言的函数库的编程接口 (API, Application Programming Interface) ,它的接口需要考虑对基于各种编程语言的应用支持,以及访问安全等因素,使得应用软件不能访问函数库一样的直接访问操作系统内部函数,更不能直接读写操作系统内部的地址空间。为此,操作系统设计了一套安全可靠的接口,我们称为系统调用接口 (System Call Interface)。系统调用接口通常面向应用程序提供了API的描述,但在具体实现上,还需要提供ABI的接口描述规范。
在现代处理器的安全支持(特权级隔离,内存空间隔离等)下,应用程序就不能直接以函数调用的方式访问操作系统的函数,以及直接读写操作系统的数据变量。不同类型的应用程序可以通过符合操作系统规定的ABI规范的系统调用接口,发出系统调用请求,来获得操作系统的服务。操作系统提供完服务后,返回应用程序继续执行。
......@@ -16,15 +16,15 @@
**API 与 ABI 的区别**
应用程序二进制接口 ABI 是不同二进制代码片段的连接纽带。ABI 定义了二进制机器代码级别的规则,主要包括基本数据类型,通用寄存器的使用,参数的传递规则,以及堆栈的使用等等。ABI 与处理器和内存地址等硬件架构相关,是用来约束链接器 (Linker) 和汇编器 (Assembler) 的。在同一处理器下,基于不同高级语言编写的应用程序、库和操作系统,如果遵循同样的 ABI 定义,那么它们就能正确链接和执行。
应用程序二进制接口 ABI 是不同二进制代码片段的连接纽带。ABI 定义了二进制机器代码级别的规则,主要包括基本数据类型、通用寄存器的使用、参数的传递规则、以及堆栈的使用等等。ABI 与处理器和内存地址等硬件架构相关,是用来约束链接器 (Linker) 和汇编器 (Assembler) 的。在同一处理器下,基于不同高级语言编写的应用程序、库和操作系统,如果遵循同样的 ABI 定义,那么它们就能正确链接和执行。
应用程序编程接口 API 是不同源代码片段的连接纽带。API 定义了一个源码级(如 C 语言)函数的参数,参数的类型,函数的返回值等。因此 API 是用来约束编译器 (Compiler) 的:一个 API 是给编译器的一些指令,它规定了源代码可以做以及不可以做哪些事。API 与编程语言相关,如 LibC 是基于 C 语言编写的标准库,那么基于 C 的应用程序就可以通过编译器建立与 LibC 的联系,并能在运行中正确访问 LibC 中的函数。
应用程序编程接口 API 是不同源代码片段的连接纽带。API 定义了一个源码级(如 C 语言)函数的参数,参数的类型,函数的返回值等。因此 API 是用来约束编译器 (Compiler) 的:一个 API 是给编译器的一些指令,它规定了源代码可以做以及不可以做哪些事。API 与编程语言相关,如 libc 是基于 C 语言编写的标准库,那么基于 C 的应用程序就可以通过编译器建立与 libc 的联系,并能在运行中正确访问 libc 中的函数。
对于实际操作系统而言,有多少操作系统,就有多少种不同类型的系统调用接口。通用服务器为支持各种应用,需要有相对多的系统调用服务接口,比如目前 Linux 有超过三百个的系统调用接口。
那么这些系统调用接口为应用程序提供了哪些功能呢?下面是一些值得了解的功能列表:
- 一个运行的程序可以创建另一个程序的实例吗?需要等待另外一个程序执行完成吗?操作系统能停止或恢复另一个正在运行的程序?
- 一个运行的程序可以创建另一个程序的实例吗?需要等待另外一个程序执行完成吗?操作系统能停止或恢复另一个正在运行的程序
- 一个运行的程序如何与连接到计算机的设备通信并通过它们与物理世界通信?
- 多个运行的程序如何同步互斥地对共享资源进行访问?
- 一个运行的程序可以要求更多(或更少)的内存空间吗?
......@@ -39,7 +39,7 @@
* 进程间通信:管道 pipe 、信号 signal 、事件 event 等。
* 虚存管理:内存空间映射 mmap 、改变数据段地址空间大小 sbrk 、共享内存 shm 等。
* 文件I/O操作:对存储设备中的文件进行读 read 、写 write 、打开 open 、关闭 close 等操作。
* 外设I/O操作:外设包括键盘、显示器、串口、磁盘、时钟 ...但接口均采用了文件 I/O 操作的通用系统调用接口。
* 外设I/O操作:外设包括键盘、显示器、串口、磁盘、时钟 ... 但接口均采用了文件 I/O 操作的通用系统调用接口。
.. note::
......
......@@ -14,12 +14,12 @@
.. note::
在本书中,下面的抽象表示不会仅仅就是一个文字的描述,还会在后续章节对具体操作系统设计与运行的讲述中,以具体化的静态数据结构动态执行对物理/虚拟资源的变化来展示。从而让同学能够建立操作系统抽象概念与操作系统具体实验之间的内在联系。
在本书中,下面的抽象表示不会仅仅就是一个文字的描述,还会在后续章节对具体操作系统设计与运行的讲述中,以具体化的静态数据结构动态执行对物理/虚拟资源的变化来展示。从而让同学能够建立操作系统抽象概念与操作系统具体实验之间的内在联系。
执行环境
----------------------------------------
**执行环境** (Execution Environment) 是一个内涵很丰富且有一定变化的一个术语,它主要负责给在其上执行的软件提供相应的功能与资源,并可在计算机系统中形成多层次的执行环境。对于现在直接运行在裸机硬件 (Bare-Metal) 上的操作系统,其执行环境是 *计算机的硬件* 。
**执行环境** (Execution Environment) 是一个内涵很丰富且有一定变化的术语,它主要负责给在其上执行的软件提供相应的功能与资源,并可在计算机系统中形成多层次的执行环境。对于现在直接运行在裸机硬件 (Bare-Metal) 上的操作系统,其执行环境是 *计算机的硬件* 。
在寒武纪时期的计算机系统中,还没有操作系统,所以对于直接运行在裸机硬件上的应用程序而言,其执行环境也是 *计算机的硬件* 。
随着计算机技术的发展,应用程序下面形成了一层比较通用的函数库,这使得应用程序不需要直接访问硬件了,它所需要的功能(比如显示字符串)和资源(比如一块内存)都可以通过函数库的函数来帮助完成。在第二个阶段,应用程序的执行环境就变成了 *函数库* -> *计算机硬件* ,而这时函数库的执行环境就是计算机的硬件。
......@@ -47,7 +47,7 @@
.. note::
对于本书而言,我们将主要侧重在设计与实现类似Linux kernel这样的 **操作系统内核** 形态的执行环境。
在本书中,我们将主要侧重设计与实现类似 Linux kernel 这样的 **操作系统内核** 形态的执行环境。
.. _term-ccf:
......@@ -71,8 +71,8 @@
本书是从操作系统的角度来给出的异常控制流的定义。
“深入理解计算机系统”(CSAPP) [#CSAPP]_ 书中,对异常控制流也给出了相关定义:
系统必须能对系统状态的变化做出反应,这些系统状态不是被内部程序变量捕获,也不一定和程序的执行相关。现代系统通过使控制流发生突变对这些情况做出反应。我们称这种突变为异常控制流( Exceptional Control Flow,ECF)
《深入理解计算机系统(CSAPP)》 [#CSAPP]_ 中,对异常控制流也给出了相关定义:
系统必须能对系统状态的变化做出反应,这些系统状态不是被内部程序变量捕获,也不一定和程序的执行相关。现代系统通过使控制流发生突变对这些情况做出反应。我们称这种突变为异常控制流( Exceptional Control Flow, ECF)
我们这里的异常控制流不涉及C++/Java等编程语言级的exception机制。
......
......@@ -15,7 +15,7 @@
内存虚拟化
~~~~~~~~~~~~~~
首先来看看内存虚拟化。程序员在写应用程序的时候,不用考虑其程序的起始内存地址要放到计算机内存的具体某个位置,而是用字符串符号定义了各种变量和函数,直接在代码中便捷地使用这些符号就行了。这是由于操作系统建立了一个 *地址固定* , *空间巨大* 的虚拟内存给应用程序来运行,这是 **内存虚拟化** ,其实是一种 **”空间虚拟化“** , 可进一步细分为 **内存地址虚拟化** 和 **内存大小虚拟化** 。这里的每个符号在运行时是要对应到具体的内存地址的。这些内存地址的具体数值是什么?程序员不用关心。为什么?因为编译器会自动帮我们把这些符号翻译成地址,形成可执行程序。程序使用的内存是否占得太大了?在一般情况下,程序员也不用关心。
首先来看看内存虚拟化。程序员在写应用程序的时候,不用考虑其程序的起始内存地址要放到计算机内存的具体某个位置,而是用字符串符号定义了各种变量和函数,直接在代码中便捷地使用这些符号就行了。这是由于操作系统建立了一个 *地址固定* , *空间巨大* 的虚拟内存给应用程序来运行,这是 **内存虚拟化** ,其实是一种 **“空间虚拟化”** , 可进一步细分为 **内存地址虚拟化** 和 **内存大小虚拟化** 。这里的每个符号在运行时是要对应到具体的内存地址的。这些内存地址的具体数值是什么?程序员不用关心。为什么?因为编译器会自动帮我们把这些符号翻译成地址,形成可执行程序。程序使用的内存是否占得太大了?在一般情况下,程序员也不用关心。
.. note::
......@@ -30,7 +30,7 @@
CPU 虚拟化
~~~~~~~~~~~~~~
再来看 CPU 虚拟化。不同的应用程序可以在内存中并发运行,相同的应用程序也可有多个拷贝在内存中并发运行。而每个程序都“认为”自己完全独占了 CPU 在运行,这是 **”CPU虚拟化“**,也是一种 **”时间虚拟化“** 。操作系统给了运行的应用程序一个幻象,即操作系统把时间分成小段,每个应用程序占用其中一小段时间片运行,用完这一时间片后,操作系统会切换到另外一个应用程序,让它运行。由于时间片很短,操作系统的切换开销也很小,应用程序或使用应用程序的用户基本上是看不出的,反而感觉到多个程序各自在独立”并行“执行,从而实现了 **CPU虚拟化** 。
再来看 CPU 虚拟化。不同的应用程序可以在内存中并发运行,相同的应用程序也可有多个拷贝在内存中并发运行。而每个程序都“认为”自己完全独占了 CPU 在运行,这是 **“CPU虚拟化”**,也是一种 **“时间虚拟化”** 。操作系统给了运行的应用程序一个幻象,即操作系统把时间分成小段,每个应用程序占用其中一小段时间片运行,用完这一时间片后,操作系统会切换到另外一个应用程序,让它运行。由于时间片很短,操作系统的切换开销也很小,应用程序或使用应用程序的用户基本上是看不出的,反而感觉到多个程序各自在独立“并行”执行,从而实现了 **CPU虚拟化** 。
.. _term-parallel-concurrency:
......@@ -38,7 +38,7 @@ CPU 虚拟化
* 并行 (Parallel) 是指两个或者多个事件在同一时刻发生;
* 并发 (Concurrent) 是指两个或多个事件在同一时间间隔内发生。
对于基于单 CPU 的计算机而言,各个”同时“运行的程序其实是串行分时复用一个 CPU ,任一个时刻点上只有一个程序在 CPU 上运行。
对于基于单 CPU 的计算机而言,各个“同时”运行的程序其实是串行分时复用一个 CPU ,任一个时刻点上只有一个程序在 CPU 上运行。
这些虚拟性的特征给应用程序的开发和执行提供了非常方便的执行环境,但也给操作系统的设计与实现提出了很多挑战。
并发性
......
......@@ -296,7 +296,7 @@ Trap 处理的总体流程如下:首先通过 ``__alltraps`` 将 Trap 上下
- 第 12 行,我们准备在内核栈上保存 Trap 上下文,于是预先分配 :math:`34\times 8` 字节的栈帧,这里改动的是 sp ,说明确实是在内核栈上。
- 第 13~24 行,保存 Trap 上下文的通用寄存器 x0~x31,跳过 x0 和 tp(x4),原因之前已经说明。我们在这里也不保存 sp(x2),因为我们要基于它来找到每个寄存器应该被保存到的正确的位置。实际上,在栈帧分配之后,我们可用于保存 Trap 上下文的地址区间为 :math:`[\text{sp},\text{sp}+8\times34)` ,按照 ``TrapContext`` 结构体的内存布局,基于内核栈的位置(sp所指地址)来从低地址到高地址分别按顺序放置 x0~x31这些通用寄存器,最后是 sstatus 和 sepc 。因此通用寄存器 xn 应该被保存在地址区间 :math:`[\text{sp}+8n,\text{sp}+8(n+1))` 。
为了简化代码,x5~x31 这 27 个通用寄存器我们通过类似循环的 ``.rept`` 每次使用 ``SAVE_GP`` 宏来保存,其实质是相同的。注意我们需要在 ``Trap.S`` 开头加上 ``.altmacro`` 才能正常使用 ``.rept`` 命令。
为了简化代码,x5~x31 这 27 个通用寄存器我们通过类似循环的 ``.rept`` 每次使用 ``SAVE_GP`` 宏来保存,其实质是相同的。注意我们需要在 ``trap.S`` 开头加上 ``.altmacro`` 才能正常使用 ``.rept`` 命令。
- 第 25~28 行,我们将 CSR sstatus 和 sepc 的值分别读到寄存器 t0 和 t1 中然后保存到内核栈对应的位置上。指令 :math:`\text{csrr rd, csr}` 的功能就是将 CSR 的值读到寄存器 :math:`\text{rd}` 中。这里我们不用担心 t0 和 t1 被覆盖,因为它们刚刚已经被保存了。
- 第 30~31 行专门处理 sp 的问题。首先将 sscratch 的值读到寄存器 t2 并保存到内核栈上,注意: sscratch 的值是进入 Trap 之前的 sp 的值,指向用户栈。而现在的 sp 则指向内核栈。
- 第 33 行令 :math:`\text{a}_0\leftarrow\text{sp}`,让寄存器 a0 指向内核栈的栈指针也就是我们刚刚保存的 Trap 上下文的地址,这是由于我们接下来要调用 ``trap_handler`` 进行 Trap 处理,它的第一个参数 ``cx`` 由调用规范要从 a0 中获取。而 Trap 处理函数 ``trap_handler`` 需要 Trap 上下文的原因在于:它需要知道其中某些寄存器的值,比如在系统调用的时候应用程序传过来的 syscall ID 和对应参数。我们不能直接使用这些寄存器现在的值,因为它们可能已经被修改了,因此要去内核栈上找已经被保存下来的值。
......
此差异已折叠。
......@@ -2,7 +2,7 @@
==============================================
.. toctree::
:maxdepth: 4
:maxdepth: 5
0intro
1rust-dynamic-allocation
......@@ -11,6 +11,7 @@
4sv39-implementation-2
5kernel-app-spaces
6multitasking-based-on-as
7exercise
7more-as
8exercise
.. chyyuu 添加扩展阅读 虚拟内存超越物理内存,通过换页机制???
\ No newline at end of file
此差异已折叠。
第五章:进程及进程管理
第五章:进程
==============================================
.. toctree::
......@@ -8,6 +8,7 @@
1process
2core-data-structures
3implement-process-mechanism
4exercise
4scheduling
5exercise
.. chyyuu 有一节来 回顾,归纳总结进程 抽象/虚拟???
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册