...
 
Commits (3)
    https://gitcode.net/rcore-os/rCore-Tutorial-Book-v3/-/commit/9bbf08dcb302b5cfb1b149054ef12d2236e9aa23 deploy: 04d6b90af8f65588e5030f907ec142e47faa0a51 2023-04-21T04:42:02+00:00 wyfcyx wyfcyx@users.noreply.github.com https://gitcode.net/rcore-os/rCore-Tutorial-Book-v3/-/commit/93f98e0c1ca2799e555f26fff9c0c2a751232d50 deploy: 9cb2a463797366a514a7545701c929804df7ef1b 2023-04-21T04:42:47+00:00 wyfcyx wyfcyx@users.noreply.github.com https://gitcode.net/rcore-os/rCore-Tutorial-Book-v3/-/commit/f185adf30860d8ecab7bb42df3716c0b27d15148 deploy: 8872a72c5f157bbc8542cd9bde2bd90e8c918501 2023-04-22T05:29:27+00:00 wyfcyx wyfcyx@users.noreply.github.com
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
系统软件是为计算机系统提供基本功能,并在计算机系统范围内使用的软件,其作用可涉及到整个计算机系统。系统软件包括操作系统内核、驱动程序、工具软件、用户界面、软件库等。操作系统内核是系统软件的核心部分,负责控制计算机的硬件资源并为用户和应用程序提供服务。驱动程序是操作系统用于控制硬件设备的软件,如显卡驱动、声卡驱动和打印机驱动等。一般情况下,驱动程序是操作系统内核的一部分。 系统软件是为计算机系统提供基本功能,并在计算机系统范围内使用的软件,其作用可涉及到整个计算机系统。系统软件包括操作系统内核、驱动程序、工具软件、用户界面、软件库等。操作系统内核是系统软件的核心部分,负责控制计算机的硬件资源并为用户和应用程序提供服务。驱动程序是操作系统用于控制硬件设备的软件,如显卡驱动、声卡驱动和打印机驱动等。一般情况下,驱动程序是操作系统内核的一部分。
工具软件是操作系统提供的用于维护、调试和优化计算机系统的软件,如磁盘碎片整理工具、系统信息工具和病毒查杀工具等。用户界面可以是图形用户界面 (GUI) 或命令行界面 (CLI)。图形用户界面是操作系统的一种常见用户界面,它使用图形元素(如图标、菜单和按钮)来帮助用户使用操作系统。通常,图形用户界面提供了一个桌面环境,其中包含可以打开和关闭的窗口,用户可以在其中运行应用程序和执行其他操作。图形用户界面是操作系统的一种常见用户界面,它使用图形元素(如图标、菜单和按钮)来帮助用户使用操作系统。通常,图形用户界面提供了一个桌面环境,其中包含可以打开和关闭的窗口,用户可以在其中运行应用程序和执行其他操作。 工具软件是操作系统提供的用于维护、调试和优化计算机系统的软件,如磁盘碎片整理工具、系统信息工具和病毒查杀工具等。用户界面可以是图形用户界面 (GUI) 或命令行界面 (CLI)。图形用户界面是操作系统的一种常见用户界面,它使用图形元素(如图标、菜单和按钮)来帮助用户使用操作系统。通常,图形用户界面提供了一个桌面环境,其中包含可以打开和关闭的窗口,用户可以在其中运行应用程序和执行其他操作。
.. chyyuu .. chyyuu
如果这样来看,编辑类软件,如 Vi、Emacs、MS Word等,只涉及到对文本文件的编辑,它们就不能算是系统软件。 如果这样来看,编辑类软件,如 Vi、Emacs、MS Word等,只涉及到对文本文件的编辑,它们就不能算是系统软件。
......
...@@ -134,7 +134,7 @@ API与ABI ...@@ -134,7 +134,7 @@ API与ABI
0 0
} }
这个程序的功能就是显示一行字符串(重点看第8行的代码)。注意,这里的 `println!` 一个宏。而进一步跟踪源代码 (位于 `user/src/console.rs` ),可以看到 `println!` 会进一步展开为 `write` 函数: 这个程序的功能就是显示一行字符串(重点看第4行的代码)。注意,这里的 `println!` 一个宏。而进一步跟踪源代码 (位于 `user/src/console.rs` ),可以看到 `println!` 会进一步展开为 `write` 函数:
.. code-block:: rust .. code-block:: rust
:linenos: :linenos:
......
...@@ -92,7 +92,7 @@ ...@@ -92,7 +92,7 @@
如果一个控制流属于某个函数,那么这个控制流的上下文简称为函数调用上下文。如果一个控制流属于某个应用程序,那么这个控制流的上下文简称为应用程序上下文。如果把某 :ref:`进程 <term-process>` 看做是运行的应用程序,那么这个属于某个应用程序的控制流可简称为某进程上下文。如果一个控制流属于操作系统,那么这个控制流的上下文简称为操作系统上下文。如果一个控制流是属于操作系统中处理中断/异常/陷入的那段代码,那么这个控制流的上下文简称为中断/异常/陷入的上下文。 如果一个控制流属于某个函数,那么这个控制流的上下文简称为函数调用上下文。如果一个控制流属于某个应用程序,那么这个控制流的上下文简称为应用程序上下文。如果把某 :ref:`进程 <term-process>` 看做是运行的应用程序,那么这个属于某个应用程序的控制流可简称为某进程上下文。如果一个控制流属于操作系统,那么这个控制流的上下文简称为操作系统上下文。如果一个控制流是属于操作系统中处理中断/异常/陷入的那段代码,那么这个控制流的上下文简称为中断/异常/陷入的上下文。
在 CPU 不断执行指令个过程中,各种前缀的上下文(执行环境的状态)会在不断的变化。如果出现了处理器在执行过程中的突变(即异常控制流)或转移(如多层函数调用),需要由维持执行环境的软硬件协同起来,保存发生突变或转移前的控制流上下文,即当前执行环境的状态(比如突变或函数调用前一刻的指令寄存器,栈寄存器和其他一些通用寄存器等内容),并在完成突变处理或被调用函数执行完毕后,恢复突变或转移前的控制流上下文。这是由于完成与突变相关的执行会破坏突变前的控制流上下文(比如上述各种寄存器的内容),导致如果不保存之前的控制流上下文,就无法恢复到突变前的正确的执行环境,继续正常的普通控制流的执行。 在 CPU 不断执行指令的过程中,各种前缀的上下文(执行环境的状态)会不断地变化。如果出现了处理器在执行过程中的突变(即异常控制流)或转移(如多层函数调用),需要由维持执行环境的软硬件协同起来,保存发生突变或转移前的控制流上下文,即当前执行环境的状态(比如突变或函数调用前一刻的指令寄存器,栈寄存器和其他一些通用寄存器等内容),并在完成突变处理或被调用函数执行完毕后,恢复突变或转移前的控制流上下文。这是由于完成与突变相关的执行会破坏突变前的控制流上下文(比如上述各种寄存器的内容),导致如果不保存之前的控制流上下文,就无法恢复到突变前正确的执行环境,继续正常的普通控制流的执行。
对于异常控制流的上下文保存与恢复,主要是通过 CPU 和操作系统(手动编写在栈上保存与恢复寄存器的指令)来协同完成;对于函数转移控制流的上下文保存与恢复,主要是通过编译器(自动生成在栈上保存与恢复寄存器的指令)来帮助完成的。 对于异常控制流的上下文保存与恢复,主要是通过 CPU 和操作系统(手动编写在栈上保存与恢复寄存器的指令)来协同完成;对于函数转移控制流的上下文保存与恢复,主要是通过编译器(自动生成在栈上保存与恢复寄存器的指令)来帮助完成的。
...@@ -111,7 +111,7 @@ ...@@ -111,7 +111,7 @@
异常控制流:中断 异常控制流:中断
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
外设 **中断** (Interrupt) 由外部设备引起的外部 I/O 事件如时钟中断、控制台中断等。外设中断是异步产生的,与处理器的执行无关。产生中断后,操作系统需要进行中断处理来响应中断请求,这会破坏被打断前应用程序的控制流上下文,所以操作系统要保存与恢复被打断前应用程序的控制流上下文。 外设 **中断** (Interrupt) 是指由外部设备引起的外部 I/O 事件,如时钟中断、控制台中断等。外设中断是异步产生的,与处理器的执行无关。产生中断后,操作系统需要进行中断处理来响应中断请求,这会破坏被打断前应用程序的控制流上下文,所以操作系统要保存与恢复被打断前应用程序的控制流上下文。
.. image:: interrupt.png .. image:: interrupt.png
:align: center :align: center
......
...@@ -397,7 +397,7 @@ ...@@ -397,7 +397,7 @@
<div class="section" id="id3"> <div class="section" id="id3">
<h3>系统软件<a class="headerlink" href="#id3" title="永久链接至标题">#</a></h3> <h3>系统软件<a class="headerlink" href="#id3" title="永久链接至标题">#</a></h3>
<p>系统软件是为计算机系统提供基本功能,并在计算机系统范围内使用的软件,其作用可涉及到整个计算机系统。系统软件包括操作系统内核、驱动程序、工具软件、用户界面、软件库等。操作系统内核是系统软件的核心部分,负责控制计算机的硬件资源并为用户和应用程序提供服务。驱动程序是操作系统用于控制硬件设备的软件,如显卡驱动、声卡驱动和打印机驱动等。一般情况下,驱动程序是操作系统内核的一部分。</p> <p>系统软件是为计算机系统提供基本功能,并在计算机系统范围内使用的软件,其作用可涉及到整个计算机系统。系统软件包括操作系统内核、驱动程序、工具软件、用户界面、软件库等。操作系统内核是系统软件的核心部分,负责控制计算机的硬件资源并为用户和应用程序提供服务。驱动程序是操作系统用于控制硬件设备的软件,如显卡驱动、声卡驱动和打印机驱动等。一般情况下,驱动程序是操作系统内核的一部分。</p>
<p>工具软件是操作系统提供的用于维护、调试和优化计算机系统的软件,如磁盘碎片整理工具、系统信息工具和病毒查杀工具等。用户界面可以是图形用户界面 (GUI) 或命令行界面 (CLI)。图形用户界面是操作系统的一种常见用户界面,它使用图形元素(如图标、菜单和按钮)来帮助用户使用操作系统。通常,图形用户界面提供了一个桌面环境,其中包含可以打开和关闭的窗口,用户可以在其中运行应用程序和执行其他操作。图形用户界面是操作系统的一种常见用户界面,它使用图形元素(如图标、菜单和按钮)来帮助用户使用操作系统。通常,图形用户界面提供了一个桌面环境,其中包含可以打开和关闭的窗口,用户可以在其中运行应用程序和执行其他操作。</p> <p>工具软件是操作系统提供的用于维护、调试和优化计算机系统的软件,如磁盘碎片整理工具、系统信息工具和病毒查杀工具等。用户界面可以是图形用户界面 (GUI) 或命令行界面 (CLI)。图形用户界面是操作系统的一种常见用户界面,它使用图形元素(如图标、菜单和按钮)来帮助用户使用操作系统。通常,图形用户界面提供了一个桌面环境,其中包含可以打开和关闭的窗口,用户可以在其中运行应用程序和执行其他操作。</p>
<p>C 语言标准库 libc(类似的有 Rust 标准库 等)提供了与 OS 交互的系统调用接口,其功能覆盖了整个计算机系统,会被许多不同的软件访问和调用。</p> <p>C 语言标准库 libc(类似的有 Rust 标准库 等)提供了与 OS 交互的系统调用接口,其功能覆盖了整个计算机系统,会被许多不同的软件访问和调用。</p>
<p>从这个角度来看,操作系统是一种系统软件。</p> <p>从这个角度来看,操作系统是一种系统软件。</p>
</div> </div>
......
...@@ -614,7 +614,7 @@ ...@@ -614,7 +614,7 @@
<span class="linenos">6</span><span class="p">}</span> <span class="linenos">6</span><span class="p">}</span>
</pre></div> </pre></div>
</div> </div>
<p>这个程序的功能就是显示一行字符串(重点看第8行的代码)。注意,这里的 <cite>println!</cite> 一个宏。而进一步跟踪源代码 (位于 <cite>user/src/console.rs</cite> ),可以看到 <cite>println!</cite> 会进一步展开为 <cite>write</cite> 函数:</p> <p>这个程序的功能就是显示一行字符串(重点看第4行的代码)。注意,这里的 <cite>println!</cite> 一个宏。而进一步跟踪源代码 (位于 <cite>user/src/console.rs</cite> ),可以看到 <cite>println!</cite> 会进一步展开为 <cite>write</cite> 函数:</p>
<div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// user/src/console.rs</span> <div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// user/src/console.rs</span>
<span class="linenos">2</span><span class="o">..</span><span class="p">.</span> <span class="linenos">2</span><span class="o">..</span><span class="p">.</span>
<span class="linenos">3</span><span class="k">impl</span><span class="w"> </span><span class="n">Write</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">Stdout</span><span class="w"> </span><span class="p">{</span> <span class="linenos">3</span><span class="k">impl</span><span class="w"> </span><span class="n">Write</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">Stdout</span><span class="w"> </span><span class="p">{</span>
......
...@@ -437,13 +437,13 @@ ...@@ -437,13 +437,13 @@
</ul> </ul>
</div> </div>
<p>如果一个控制流属于某个函数,那么这个控制流的上下文简称为函数调用上下文。如果一个控制流属于某个应用程序,那么这个控制流的上下文简称为应用程序上下文。如果把某 <a class="reference internal" href="../chapter5/1process.html#term-process"><span class="std std-ref">进程</span></a> 看做是运行的应用程序,那么这个属于某个应用程序的控制流可简称为某进程上下文。如果一个控制流属于操作系统,那么这个控制流的上下文简称为操作系统上下文。如果一个控制流是属于操作系统中处理中断/异常/陷入的那段代码,那么这个控制流的上下文简称为中断/异常/陷入的上下文。</p> <p>如果一个控制流属于某个函数,那么这个控制流的上下文简称为函数调用上下文。如果一个控制流属于某个应用程序,那么这个控制流的上下文简称为应用程序上下文。如果把某 <a class="reference internal" href="../chapter5/1process.html#term-process"><span class="std std-ref">进程</span></a> 看做是运行的应用程序,那么这个属于某个应用程序的控制流可简称为某进程上下文。如果一个控制流属于操作系统,那么这个控制流的上下文简称为操作系统上下文。如果一个控制流是属于操作系统中处理中断/异常/陷入的那段代码,那么这个控制流的上下文简称为中断/异常/陷入的上下文。</p>
<p>在 CPU 不断执行指令个过程中,各种前缀的上下文(执行环境的状态)会在不断的变化。如果出现了处理器在执行过程中的突变(即异常控制流)或转移(如多层函数调用),需要由维持执行环境的软硬件协同起来,保存发生突变或转移前的控制流上下文,即当前执行环境的状态(比如突变或函数调用前一刻的指令寄存器,栈寄存器和其他一些通用寄存器等内容),并在完成突变处理或被调用函数执行完毕后,恢复突变或转移前的控制流上下文。这是由于完成与突变相关的执行会破坏突变前的控制流上下文(比如上述各种寄存器的内容),导致如果不保存之前的控制流上下文,就无法恢复到突变前的正确的执行环境,继续正常的普通控制流的执行。</p> <p>在 CPU 不断执行指令的过程中,各种前缀的上下文(执行环境的状态)会不断地变化。如果出现了处理器在执行过程中的突变(即异常控制流)或转移(如多层函数调用),需要由维持执行环境的软硬件协同起来,保存发生突变或转移前的控制流上下文,即当前执行环境的状态(比如突变或函数调用前一刻的指令寄存器,栈寄存器和其他一些通用寄存器等内容),并在完成突变处理或被调用函数执行完毕后,恢复突变或转移前的控制流上下文。这是由于完成与突变相关的执行会破坏突变前的控制流上下文(比如上述各种寄存器的内容),导致如果不保存之前的控制流上下文,就无法恢复到突变前正确的执行环境,继续正常的普通控制流的执行。</p>
<p>对于异常控制流的上下文保存与恢复,主要是通过 CPU 和操作系统(手动编写在栈上保存与恢复寄存器的指令)来协同完成;对于函数转移控制流的上下文保存与恢复,主要是通过编译器(自动生成在栈上保存与恢复寄存器的指令)来帮助完成的。</p> <p>对于异常控制流的上下文保存与恢复,主要是通过 CPU 和操作系统(手动编写在栈上保存与恢复寄存器的指令)来协同完成;对于函数转移控制流的上下文保存与恢复,主要是通过编译器(自动生成在栈上保存与恢复寄存器的指令)来帮助完成的。</p>
<p>在操作系统中,需要处理三类异常控制流:外设中断 (Device Interrupt) 、陷入 (Trap) 和异常 (Exception,也称Fault Interrupt)。</p> <p>在操作系统中,需要处理三类异常控制流:外设中断 (Device Interrupt) 、陷入 (Trap) 和异常 (Exception,也称Fault Interrupt)。</p>
</div> </div>
<div class="section" id="id7"> <div class="section" id="id7">
<h3>异常控制流:中断<a class="headerlink" href="#id7" title="永久链接至标题">#</a></h3> <h3>异常控制流:中断<a class="headerlink" href="#id7" title="永久链接至标题">#</a></h3>
<p>外设 <strong>中断</strong> (Interrupt) 由外部设备引起的外部 I/O 事件如时钟中断、控制台中断等。外设中断是异步产生的,与处理器的执行无关。产生中断后,操作系统需要进行中断处理来响应中断请求,这会破坏被打断前应用程序的控制流上下文,所以操作系统要保存与恢复被打断前应用程序的控制流上下文。</p> <p>外设 <strong>中断</strong> (Interrupt) 是指由外部设备引起的外部 I/O 事件,如时钟中断、控制台中断等。外设中断是异步产生的,与处理器的执行无关。产生中断后,操作系统需要进行中断处理来响应中断请求,这会破坏被打断前应用程序的控制流上下文,所以操作系统要保存与恢复被打断前应用程序的控制流上下文。</p>
<img alt="../_images/interrupt.png" class="align-center" id="interrupt" src="../_images/interrupt.png" /> <img alt="../_images/interrupt.png" class="align-center" id="interrupt" src="../_images/interrupt.png" />
</div> </div>
<div class="section" id="id8"> <div class="section" id="id8">
......