Skip to content

Commit

Permalink
Chapter 8 OCR Error Fix (#25)
Browse files Browse the repository at this point in the history
* Update 8.2-processes.md

修改了两处小小的ocr错误。
1- 8.2.4第三段,原文:或者发起一个 I/。操作
错误处:I/。 应该为 I/O

2- 8.2.5第三段,原文:当内核选择〜个新的进程运行时
错误处:选择~个 应该为 选择一个

* Update 8.4-process-control.md

更改了两处小小的ocr错误。
1- 8.4.3 第四节 错误条件 的旁注里。
原文:例如,WNO¬HANG 和 WUNTRACED 
错误:WHO¬HANG 应该为 WHOHANG

2- 8.4.5 中间一段 原文:每个兀素都
错误:兀素 应该为 元素

* 8.6 ocr错误修正

更正了一处小ocr错误。
8.6开头第二段 原文:并返回 0o 
错误: 返回0o 应该为 返回0。
  • Loading branch information
Ampher-4 authored Sep 11, 2024
1 parent 60e66b8 commit 8d0d33a
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 5 deletions.
4 changes: 2 additions & 2 deletions part2/ch08-exceptional-control-flow/8.2-processes.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@

处理器通常是用某个控制寄存器中的一个**模式位**(mode bit)来提供这种功能的,该寄存器描述了进程当前享有的特权。当设置了模式位时,进程就运行在**内核模式**中(有时叫做**超级用户模式**)。一个运行在内核模式的进程可以执行指令集中的任何指令,并且可以访问系统中的任何内存位置。

没有设置模式位时,进程就运行在用户模式中。用户模式中的进程不允许执行**特权指令**(privileged instruction),比如停止处理器、改变模式位,或者发起一个 I/操作。也不允许用户模式中的进程直接引用地址空间中内核区内的代码和数据。任何这样的尝试都会导致致命的保护故障。反之,用户程序必须通过系统调用接口间接地访问内核代码和数据。
没有设置模式位时,进程就运行在用户模式中。用户模式中的进程不允许执行**特权指令**(privileged instruction),比如停止处理器、改变模式位,或者发起一个 I/O 操作。也不允许用户模式中的进程直接引用地址空间中内核区内的代码和数据。任何这样的尝试都会导致致命的保护故障。反之,用户程序必须通过系统调用接口间接地访问内核代码和数据。

运行应用程序代码的进程初始时是在用户模式中的。进程从用户模式变为内核模式的唯一方法是通过诸如中断、故障或者陷入系统调用这样的异常。当异常发生时,控制传递到异常处理程序,处理器将模式从用户模式变为内核模式。处理程序运行在内核模式中,当它返回到应用程序代码时,处理器就把模式从内核模式改回到用户模式。

Expand All @@ -93,7 +93,7 @@ Linux 提供了一种聪明的机制,叫做 /proc 文件系统,它允许用

内核为每个进程维持一个**上下文**(context)。上下文就是内核重新启动一个被抢占的进程所需的状态。它由一些对象的值组成,这些对象包括通用目的寄存器、浮点寄存器、程序计数器、用户栈、状态寄存器、内核栈和各种内核数据结构,比如描述地址空间的页表、包含有关当前进程信息的进程表,以及包含进程已打开文件的信息的文件表。

在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占了的进程。这种决策就叫做**调度**(scheduling),是由内核中称为**调度器**(scheduler)的代码处理的。当内核选择〜个新的进程运行时,我们说内核调度了这个进程。在内核调度了一个新的进程运行后,它就抢占当前进程,并使用一种称为上下文切换的机制来将控制转移到新的进程,上下文切换 1)保存当前进程的上下文,2)恢复某个先前被抢占的进程被保存的上下文,3)将控制传递给这个新恢复的进程。
在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占了的进程。这种决策就叫做**调度**(scheduling),是由内核中称为**调度器**(scheduler)的代码处理的。当内核选择一个新的进程运行时,我们说内核调度了这个进程。在内核调度了一个新的进程运行后,它就抢占当前进程,并使用一种称为上下文切换的机制来将控制转移到新的进程,上下文切换 1)保存当前进程的上下文,2)恢复某个先前被抢占的进程被保存的上下文,3)将控制传递给这个新恢复的进程。

当内核代表用户执行系统调用时,可能会发生上下文切换。如果系统调用因为等待某个事件发生而阻塞,那么内核可以让当前进程休眠,切换到另一个进程。比如,如果一个 read 系统调用需要访问磁盘,内核可以选择执行上下文切换,运行另外一个进程,而不是等待数据从磁盘到达。另一个示例是 sleep 系统调用,它显式地请求让调用进程休眠。一般而言,即使系统调用没有阻塞,内核也可以决定执行上下文切换,而不是将控制返回给调用进程。

Expand Down
4 changes: 2 additions & 2 deletions part2/ch08-exceptional-control-flow/8.4-process-control.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ waitpid 函数还支持其他类型的等待集合,包括 Unix 进程组,对
{% hint style="info" %}
#### 旁注 - 和 Unix 函数相关的常量
像 WNOHANG 和 WUNTRACED 这样的常量是由系统头文件定义的。例如,WNO¬HANG 和 WUNTRACED 是由 wait.h 头文件(间接)定义的:
像 WNOHANG 和 WUNTRACED 这样的常量是由系统头文件定义的。例如,WNOHANG 和 WUNTRACED 是由 wait.h 头文件(间接)定义的:
```c
/* Bits in the third argument to 'waitpid'. */
Expand Down Expand Up @@ -507,7 +507,7 @@ int main(int argc, char **argv, char **envp);
int main(int argc, char *argv[], char *envp[]);
```

当 main 开始执行时,用户栈的组织结构如图 8-22 所示。让我们从栈底(高地址)往栈顶(低地址)依次看一看。首先是参数和环境字符串。栈往上紧随其后的是以 null 结尾的指针数组,其中每个指针都指向栈中的一个环境变量字符串。全局变量 environ 指向这些指针中的第一个 envp\[0]o 紧随环境变量数组之后的是以 null 结尾的 argv\[] 数组,其中每个兀素都指向栈中的一个参数字符串。在栈的顶部是系统启动函数 libc\_start\_main(见 7.9 节)的栈帧。
当 main 开始执行时,用户栈的组织结构如图 8-22 所示。让我们从栈底(高地址)往栈顶(低地址)依次看一看。首先是参数和环境字符串。栈往上紧随其后的是以 null 结尾的指针数组,其中每个指针都指向栈中的一个环境变量字符串。全局变量 environ 指向这些指针中的第一个 envp\[0]o 紧随环境变量数组之后的是以 null 结尾的 argv\[] 数组,其中每个元素都指向栈中的一个参数字符串。在栈的顶部是系统启动函数 libc\_start\_main(见 7.9 节)的栈帧。

![图 8-22 一个新程序开始时,用户栈的典型组织结构](../../.gitbook/assets/0822-yi-ge-xin-cheng-xu-kai-shi-shi-yong-hu-zhan-de-dian-xing-zu-zhi-jie-gou-.png)

Expand Down
2 changes: 1 addition & 1 deletion part2/ch08-exceptional-control-flow/8.6-nonlocal-jumps.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ int sigsetjmp(sigjmp_buf env, int savesigs);
// 返回:setjmp 返回 0,longjmp 返回非零。
```
setjmp 函数在 env 缓冲区中保存当前调用环境,以供后面的 longjmp 使用,并返回 0o 调用环境包括程序计数器、栈指针和通用目的寄存器。岀于某种超出本书描述范围的原因,setjmp 返回的值不能被赋值给变量:
setjmp 函数在 env 缓冲区中保存当前调用环境,以供后面的 longjmp 使用,并返回 0。调用环境包括程序计数器、栈指针和通用目的寄存器。岀于某种超出本书描述范围的原因,setjmp 返回的值不能被赋值给变量:
```c
rc = setjmp(env); /* Wrong! */
Expand Down

0 comments on commit 8d0d33a

Please sign in to comment.