Skip to content

Commit

Permalink
update ch0
Browse files Browse the repository at this point in the history
  • Loading branch information
chyyuu committed Jan 28, 2021
1 parent bc4bb12 commit 3c593ff
Show file tree
Hide file tree
Showing 17 changed files with 122 additions and 12 deletions.
2 changes: 2 additions & 0 deletions show.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
make html && google-chrome build/html/index.html

19 changes: 14 additions & 5 deletions source/chapter0/1what-is-os.rst
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,20 @@
现在的通用操作系统是一个复杂的系统软件,比如Linux操作系统达到了千万行的C源代码量级。在学习操作系统的初期,我们没有必要去分析了解这样大规模的软件。但这样的软件也是有其特有的一些特征。首先,它称为系统软件,简单理解它就是在一个计算机系统范围类使用的软件,管的是整个计算机系统。如果这样来看,一个编辑软件,如Vi Emacs就不能算了。
而在计算机中安装的Rust标准库(类似的有Libc库等)可以算是一个。

如果我们站在一万米的高空来看操作系统,可以发现操作系统这个软件干的事主要有两件:一是向下管理计算机硬件和各种外设,而是向上给应用软件提供各种服务帮助。我们可对其进一步描述:操作系统是一个可以管理CPU、内存和各种外设,并管理和服务应用软件的软件。这样的描述也是大多数操作系统教材上对操作系统的一个定义,比较高大上。为了完成这些工作,操作系统需要知道如何与硬件打交道,如何更好地面向应用软件做好服务,这就有一系列操作系统相关的理论,抽象,设计等来支持如何做和做得好的需求。
如果我们站在一万米的高空来看 :ref:`操作系统 <computer-hw-sw>` ,可以发现操作系统这个软件干的事主要有两件:一是向下管理计算机硬件和各种外设,而是向上给应用软件提供各种服务帮助。我们可对其进一步描述:操作系统是一个可以管理CPU、内存和各种外设,并管理和服务应用软件的软件。这样的描述也是大多数操作系统教材上对操作系统的一个定义,比较高大上。为了完成这些工作,操作系统需要知道如何与硬件打交道,如何更好地面向应用软件做好服务,这就有一系列操作系统相关的理论,抽象,设计等来支持如何做和做得好的需求。

如果再简单一点,我们可以把操作系统定义为:应用程序的软件执行环境。站在应用程序的角度来看,我们可以发现常见的应用程序其实是运行在由硬件,操作系统,运行时库,图形界面支持库等所包起来的一个执行环境(Execution Environment)中。所以Android应用运行在ARM处理器上Android操作系统的执行环境中,微软的Office应用运行在x86-64处理器上Windows操作系统的执行环境中,Web Server应用运行在x86-64处理器上Linux操作系统的执行环境中, Web app应用运行在x86-64或ARM处理器上Chrome OS
操作系统的执行环境中。而在一些嵌入式操作系统环境中,所谓的嵌入式操作系统就是以运行时库的形式与应用程序紧密结合在一起,形成一个可在嵌入式硬件上的单一执行软件。
.. image:: computer-hw-sw.png
:align: center
:scale: 50 %
:name: computer-hw-sw

如果看看我们的身边,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>` 中,应用程序只需根据与系统软件约定好的应用程序二进制接口(Application Bianry Interface, ABI),来请求执行环境提供的各种服务或功能,从而完成应用程序自己的功能。基于这样的观察,我们可以把操作系统再简单一点地定义为:**应用程序的软件执行环境**。从这个角度出发,操作系统可以包括运行时库、图形界面支持库等系统软件,也能适应在操作系统发展的不同历史时期对操作系统的概括性描述和定义。

.. image:: EE.png
:align: center
:name: exec-env

站在计算机发展的百年时间尺度看
----------------------------------
Expand All @@ -24,12 +33,12 @@

其实,操作系统的内涵和外延随着历史的发展,也一直在变化,并没有类似于“1+1=2”这样的明确定义。参考生物的进化史,我们也给操作系统的进化历史做一个简单的概述,从中可以看到操作系统在各个时间段上包含什么,具有什么样的特征。但无论操作系统的内在实现和具体目标如何变化,其管理计算机硬件,给应用提供服务的功能需求没有变化。

寒武纪三叶虫时代
寒武纪生物大爆发时代
~~~~~~~~~~~~~~~~~~~~~~

电子计算机在1946年最开始出现的时候是没有操作系统(Operating System)的,只有操作员(Operator)。启动,扳开关,装卡片/纸带等比较辛苦的工作都是计算机操作员或者用户自己完成。操作员/用户带着记录有程序和数据的卡片\(punch card\)或打孔纸带去操作机器。装好卡片/纸带后,启动卡片/纸带阅读器,让计算机把程序和数据读入计算机机的内存中后,计算机就开始工作,并把结果也输出到卡片/纸带或显示屏上,最后程序停止。

由于人的操作效率太低,计算机的机时宝贵,所以就引入监控程序(Monitor)辅助完成输入,输出,加载,运行程序等工作,这是现代操作系统的起源。一般情况下,计算机每次只能执行一个任务,CPU大部分时间都在等待人的缓慢操作。这个“手工操作”过程一直持续到20世纪50年代。
由于人的操作效率太低,计算机的机时宝贵,所以就引入监控程序(Monitor)辅助完成输入,输出,加载,运行程序等工作,这是现代操作系统的起源,类似寒武纪生物大爆发中的“三叶虫”。一般情况下,计算机每次只能执行一个任务,CPU大部分时间都在等待人的缓慢操作。这个初级的“辅助操作”过程一直持续到20世纪50年代。

.. note::

Expand Down
18 changes: 16 additions & 2 deletions source/chapter0/2os-interface.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,15 @@
:hidden:
:maxdepth: 5

读者可站在使用操作系统的角度来看操作系统,这样会比较容易对操作系统有个初步的进一步了解。操作系统内核是一个需要提供各种服务的软件,其服务对象是应用程序,而用户(这里可以理解为一般使用计算机的人)是通过应用程序的服务间接获得操作系统的服务的),所以操作系统内核藏在一般用户看不到的地方。但应用程序需要访问操作系统,获得操作系统的服务,这就需要通过操作系统的接口才能完成。如果把操作系统看成是一个函数库,那么其接口就是函数名称和它的参数。但操作系统不是简单的一个函数库,它的接口需要考虑安全因素,使得应用软件不能直接读写操作系统内部函数的地址地址空间,为此,操作系统设计了一个安全可靠的接口,我们称为系统调用接口(System Call Interface),应用程序可以通过系统调用接口请求获得操作系统的服务,但不能直接调用操作系统的函数和全局变量;操作系统提供完服务后,返回应用程序继续执行。
读者可站在使用操作系统的角度来看操作系统,这样会比较容易对操作系统有个初步的进一步了解。操作系统内核是一个需要提供各种服务的软件,其服务对象是应用程序,而用户(这里可以理解为一般使用计算机的人)是通过应用程序的服务间接获得操作系统的服务的),所以操作系统内核藏在一般用户看不到的地方。但应用程序需要访问操作系统,获得操作系统的服务,这就需要通过操作系统的接口才能完成。操作系统的接口的形式就是上一节提到的应用程序二进制接口(Application Binary Interface, ABI)。但操作系统不是简单的一个函数库的编程接口(Application Programming Interface, API),它的接口需要考虑安全因素,使得应用软件不能直接读写操作系统内部函数的地址地址空间,为此,操作系统设计了一个安全可靠的接口,我们称为系统调用接口(System Call Interface),应用程序可以通过系统调用接口请求获得操作系统的服务,但不能直接调用操作系统的函数和全局变量;操作系统提供完服务后,返回应用程序继续执行。


.. note::
API与ABI的区别
应用程序二进制接口(Application Binary Interface,ABI)是不同二进制代码片段的连接纽带。ABI定义了二进制机器代码级别的规则。主要包括基本数据类型,通用寄存器的使用,参数的传递规则,以及堆栈的使用等等。ABI是用来约束链接器(Linker)和汇编器(Assembler)的。基于不同高级语言编写的应程序、库和操作系统,如果遵循同样的ABI定义,那么它们就能正确链接和执行。

应用程序编程接口(Application Programming Interface,API)是不同源代码片段的连接纽带。API定义了一个源码(如C语言)级函数的参数,参数的类型,函数的返回值等。 因此API是用来约束编译器(Compiler)的:一个API是给编译器的一些指令,它规定了源代码可以做以及不可以做哪些事。API与编程语言相关,如LibC是基于C语言编写的标准库,那么基于C的应用程序就可以通过编译器建立与LibC的联系,并能在运行中正确访问LibC中的函数。


对于实际操作系统而言,具有大量的服务接口,比如目前Linux有三百个系统调用接口。下面列出了一些相对比较重要的操作系统接口:

Expand All @@ -18,11 +26,17 @@

.. note::

上述表述在某种程度上说明了操作系统对计算机硬件重要组成的抽象和虚拟化:
上述表述在某种程度上说明了操作系统对计算机硬件重要组成的抽象和虚拟化,是的应用程序只需基于对简单的抽象概念的访问来到达对计算机系统资源的使用

* 文件(File)是外设的一种抽象和虚拟化。特别对于存储外设而言,文件是持久存储的抽象。
* 地址空间(Address Space)是对内存的抽象和虚拟化。
* 进程(Process)是对计算机资源的抽象和虚拟化。而其中最核心的部分是对CPU的抽象与虚拟化。



.. image:: run-app.png
:align: center
:name: run-app

有了这些接口,简单的应用程序就不用考虑底层硬件细节,可以在操作系统的服务支持和管理下简洁地完成其应用功能了。在现阶段,也许大家对进程、文件、地址空间等抽象概念还不了解,在接下来的章节会对这些概念有进一步的介绍。

Loading

0 comments on commit 3c593ff

Please sign in to comment.