Skip to content

Commit

Permalink
update: 用户终端 --> shell程序
Browse files Browse the repository at this point in the history
  • Loading branch information
chyyuu committed Mar 29, 2021
1 parent 41ab841 commit 7fc338a
Show file tree
Hide file tree
Showing 6 changed files with 17 additions and 17 deletions.
4 changes: 2 additions & 2 deletions outline.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ app列表:

### 用户程序

用户终端 user_shell以及一些相应的测试
shell程序 user_shell以及一些相应的测试

### 内核应完成功能

Expand All @@ -235,7 +235,7 @@ app列表:

简单的通过 fork 和子进程共享管道的测试;

【可选】强化用户终端的功能,支持使用 | 进行管道连接。
【可选】强化shell程序的功能,支持使用 | 进行管道连接。

### 内核应完成功能

Expand Down
4 changes: 2 additions & 2 deletions source/chapter5/0intro.rst
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
$ cd os
$ make run BOARD=k210
待内核初始化完毕之后,将在屏幕上打印可用的应用列表并进入用户终端(以 K210 平台为例):
待内核初始化完毕之后,将在屏幕上打印可用的应用列表并进入shell程序(以 K210 平台为例):

.. code-block::
Expand Down Expand Up @@ -132,7 +132,7 @@
Shell: Process 2 exited with code 0
>>
当应用执行完毕后,将继续回到用户终端的命令输入模式
当应用执行完毕后,将继续回到shell程序的命令输入模式

本章代码树
--------------------------------------
Expand Down
6 changes: 3 additions & 3 deletions source/chapter6/0intro.rst
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

在本章中提前引入 **文件** 这个概念,但本章不会详细讲解,只是先以最简单直白的方式对 **文件** 这个抽象进行简化的设计与实现。站在本章的操作系统的角度来看, **文件** 成为了一种需要操作系统管理的I/O资源。

为了让应用能够基于 **文件** 这个抽象接口进行I/O操作,我们就需要对 **进程** 这个概念进行扩展,让它能够管理 **文件** 这种资源。具体而言,就是要对进程控制块进行一定的扩展。为了统一表示 **标准** 输入和 **标准** 输出和管道,我们将在每个进程控制块中增加一个 **文件描述符表** ,在表中保存着多个 **文件** 记录信息。每个文件描述符是一个非负的索引值,即对应文件记录信息的条目在文件描述符表中的索引,可方便进程表示当前使用的 **标准** 输入、 **标准** 输出和管道(当然在下一章还可以表示磁盘上的一块数据)。用户进程访问文件将很简单,它只需通过文件描述符的索引值,就可以对 **文件** 进行读写,从而完成接收键盘输入,向屏幕输出,以及两个进程之间进行数据传输的操作。
为了让应用能够基于 **文件** 这个抽象接口进行I/O操作,我们就需要对 **进程** 这个概念进行扩展,让它能够管理 **文件** 这种资源。具体而言,就是要对进程控制块进行一定的扩展。为了统一表示 **标准** 输入和 **标准** 输出和管道,我们将在每个进程控制块中增加一个 **文件描述符表** ,在表中保存着多个 **文件** 记录信息。每个文件描述符是一个非负的索引值,即对应文件记录信息的条目在文件描述符表中的索引,可方便进程表示当前使用的 **标准** 输入、 **标准** 输出和管道(当然在下一章还可以表示磁盘上的一块数据)。用户进程访问文件将很简单,它只需通过文件描述符,就可以对 **文件** 进行读写,从而完成接收键盘输入,向屏幕输出,以及两个进程之间进行数据传输的操作。

简而言之,本章我们首先将标准输入/标准输出的访问改造为基于文件描述符,然后同样基于文件描述符实现一种父子进程之间的通信机制——管道,从而实现灵活的进程间通信,并基于管道支持进程组合来实现复杂功能。

Expand Down Expand Up @@ -41,7 +41,7 @@
$ cd os
$ make run BOARD=k210
进入用户终端后,可以运行管道机制的简单测例 ``pipetest`` 和比较复杂的测例 ``pipe_large_test`` 。 ``pipetest`` 需要保证父进程通过管道传输给子进程的字符串不会发生变化;而 ``pipe_large_test`` 中,父进程将一个长随机字符串传给子进程,随后父子进程同时计算该字符串的某种 Hash 值(逐字节求和),子进程会将计算后的 Hash 值传回父进程,而父进程接受到之后,需要验证两个 Hash 值相同,才算通过测试。
进入shell程序后,可以运行管道机制的简单测例 ``pipetest`` 和比较复杂的测例 ``pipe_large_test`` 。 ``pipetest`` 需要保证父进程通过管道传输给子进程的字符串不会发生变化;而 ``pipe_large_test`` 中,父进程将一个长随机字符串传给子进程,随后父子进程同时计算该字符串的某种 Hash 值(逐字节求和),子进程会将计算后的 Hash 值传回父进程,而父进程接受到之后,需要验证两个 Hash 值相同,才算通过测试。

运行两个测例的输出可能如下:

Expand Down Expand Up @@ -155,5 +155,5 @@
本章代码导读
实现流程概述
-----------------------------------------------------
4 changes: 2 additions & 2 deletions source/chapter7/0intro.rst
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
$ cd os
$ make run BOARD=k210
内核初始化完成之后就会进入用户终端,在这里我们运行一下本章的测例 ``filetest_simple`` :
内核初始化完成之后就会进入shell程序,在这里我们运行一下本章的测例 ``filetest_simple`` :

.. code-block::
Expand All @@ -78,7 +78,7 @@
Shell: Process 2 exited with code 0
>>
此外,在本章我们为用户终端支持了输入/输出重定向功能,可以将一个应用的输出保存到一个指定的文件。例如,下面的命令可以将 ``yield`` 应用的输出保存在文件 ``fileb`` 当中,并在应用执行完毕之后确认它的输出:
此外,在本章我们为shell程序支持了输入/输出重定向功能,可以将一个应用的输出保存到一个指定的文件。例如,下面的命令可以将 ``yield`` 应用的输出保存在文件 ``fileb`` 当中,并在应用执行完毕之后确认它的输出:

.. code-block::
Expand Down
12 changes: 6 additions & 6 deletions source/chapter7/4cmdargs-and-redirection.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
本节导读
-------------------------------------------------

之前我们已经支持从文件系统中加载应用,还实现了文件的创建和读写。但是目前我们在应用中只能硬编码要操作的文件,这就使得应用的功能大大受限,用户终端对于文件的交互访问能力也很弱。为了解决这些问题,我们需要在用户终端和内核中支持命令行参数的解析和传递还有标准 I/O 重定向功能。之后,我们便可以在用户终端执行应用的时候通过调整命令手动将应用的输入和输出从标准输入输出替换为某个特定文件,还实现了命令行工具 ``cat`` 来查看一个文件的内容。
之前我们已经支持从文件系统中加载应用,还实现了文件的创建和读写。但是目前我们在应用中只能硬编码要操作的文件,这就使得应用的功能大大受限,shell程序对于文件的交互访问能力也很弱。为了解决这些问题,我们需要在shell程序和内核中支持命令行参数的解析和传递还有标准 I/O 重定向功能。之后,我们便可以在shell程序执行应用的时候通过调整命令手动将应用的输入和输出从标准输入输出替换为某个特定文件,还实现了命令行工具 ``cat`` 来查看一个文件的内容。

命令行参数
-------------------------------------------------
Expand Down Expand Up @@ -39,7 +39,7 @@
argv[4] = 22
argv[5] = cc
为了支持后续的一些功能,我们希望在我们自己的内核和用户终端上支持这个功能。为了对实现正确性进行测试,在本章中我们编写了一个名为 ``cmdline_args`` 的应用,它是用 Rust 编写的,并只能在我们的内核上执行,但是它的功能是和 ``a.c`` 保持一致的。我们可以在我们的内核上运行该应用来看看效果:
为了支持后续的一些功能,我们希望在我们自己的内核和shell程序上支持这个功能。为了对实现正确性进行测试,在本章中我们编写了一个名为 ``cmdline_args`` 的应用,它是用 Rust 编写的,并只能在我们的内核上执行,但是它的功能是和 ``a.c`` 保持一致的。我们可以在我们的内核上运行该应用来看看效果:

.. code-block::
Expand Down Expand Up @@ -81,10 +81,10 @@
接下来我们分析一下,一行带有命令行参数的命令从输入到它的命令行参数被打印出来中间经历了哪些过程。

用户终端的命令行参数分割
shell程序的命令行参数分割
+++++++++++++++++++++++++++++++++++++++++++++++++

回忆一下,之前在用户终端 ``user_shell`` 中,一旦接收到一个回车,我们就会将当前行的内容 ``line`` 作为一个名字并试图去执行同名的应用。但是现在 ``line`` 还可能包含一些命令行参数,只有最开头的一个才是要执行的应用名。因此我们要做的第一件事情就是将 ``line`` 用空格进行分割:
回忆一下,之前在shell程序 ``user_shell`` 中,一旦接收到一个回车,我们就会将当前行的内容 ``line`` 作为一个名字并试图去执行同名的应用。但是现在 ``line`` 还可能包含一些命令行参数,只有最开头的一个才是要执行的应用名。因此我们要做的第一件事情就是将 ``line`` 用空格进行分割:

.. code-block:: rust
Expand Down Expand Up @@ -339,7 +339,7 @@ sys_exec 将命令行参数压入用户栈
标准输入输出重定向
-------------------------------------------------

为了进一步增强用户终端使用文件系统时的灵活性,我们需要新增标准输入输出重定向功能。这个功能在我们使用 Linux 内核的时候很常用,我们在自己的内核中举个例子:
为了进一步增强shell程序使用文件系统时的灵活性,我们需要新增标准输入输出重定向功能。这个功能在我们使用 Linux 内核的时候很常用,我们在自己的内核中举个例子:

.. code-block::
Expand Down Expand Up @@ -398,7 +398,7 @@ sys_exec 将命令行参数压入用户栈

那么我们应该在什么时候进行替换,又应该如何利用 ``sys_dup`` 进行替换呢?

答案是在用户终端 ``user_shell`` 中进行处理。在分割命令行参数的时候,我们要检查是否存在通过 ``</>`` 进行输入输出重定向的情况,如果存在的话则需要将它们从命令行参数中移除,并记录匹配到的输入/输出文件名到字符串 ``input/output`` 中。注意,为了实现方便,我们这里假设输入用户终端的命令一定合法:即 ``</>`` 最多只会出现一次,且后面总是会有一个参数作为重定向到的文件。
答案是在shell程序 ``user_shell`` 中进行处理。在分割命令行参数的时候,我们要检查是否存在通过 ``</>`` 进行输入输出重定向的情况,如果存在的话则需要将它们从命令行参数中移除,并记录匹配到的输入/输出文件名到字符串 ``input/output`` 中。注意,为了实现方便,我们这里假设输入shell程序的命令一定合法:即 ``</>`` 最多只会出现一次,且后面总是会有一个参数作为重定向到的文件。

.. code-block:: rust
Expand Down
4 changes: 2 additions & 2 deletions source/log.rst
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@

从 ch7 开始:

- 出于后续的一些需求, ``sys_exec`` 需要支持命令行参数,为此用户终端 ``user_shell`` 中需要相应增加一些解析功能,内核中 ``sys_exec`` 的实现也需要进行修改。新增了应用 ``cmdline_args`` 来打印传入的命令行参数。
- 出于后续的一些需求, ``sys_exec`` 需要支持命令行参数,为此shell程序 ``user_shell`` 中需要相应增加一些解析功能,内核中 ``sys_exec`` 的实现也需要进行修改。新增了应用 ``cmdline_args`` 来打印传入的命令行参数。
- 新增了应用 cat 工具可以读取一个文件的全部内容。
- 在用户终端中支持通过 ``<`` 和 ``>`` 进行简单的输入/输出重定向,为此在内核中新增了一个 ``sys_dup`` 系统调用。
- 在shell程序中支持通过 ``<`` 和 ``>`` 进行简单的输入/输出重定向,为此在内核中新增了一个 ``sys_dup`` 系统调用。

另外,在所有章节分支新增了 docker 支持来尽可能降低环境配置的时间成本,详见 :ref:`使用 Docker 环境 <link-docker-env>` 。

Expand Down

0 comments on commit 7fc338a

Please sign in to comment.