前言与第零张部分校订

/* 这是一份前言和第零章的校订说明。篇幅不大，但实在是改不下去了 ...
   现在对翻译的难度有了新的认识。学长们做了一件不可思议的伟大工作。

   格式：
   < 原文
   > 修改后
   #
   注释

   by 1200012773 胡树伟
   */

Section -1

< http://pdos.csail.mit.edu/6.828 上有关于 v6 和 xv6 的资料。
> 参见 http://pdos.csail.mit.edu/6.828 上有关于 v6 和 xv6 的资料。

Section 0

< 一方面我们希望接口设计得简单和功能单一(narrow interface)
> 一方面我们希望接口设计得简单和精准

<（甚至在某种程度上 Microsoft Windows）
>（甚至 Microsoft Windows 在某种程度上）
#
汉语里主语拖后有点别扭

< 硬件提升了特权级
> 硬件会提升特权级

< 系统调用 exec 将调用它的进程的内存空间替换为一个从文件（通常是一份可执行文件）中读取的内存镜像。
> 系统调用 exec 将从某个文件（通常是可执行文件）里读取内存镜像，并将其替换到调用它的进程的内存空间。
#
“将调用它的...” 干扰理解，有点像 “将会调用它的...”；“a file” 翻译为 “一个文件” 可能被误解为 “a particular file”。

< 用以上调用代替用户执行程序
> 用以上调用为用户执行程序
#
“代替”词义太强，强过被大词小用的“on behalf of”的意思。

< 对于 echo hello 这个例子来说，
> 对于 echo hello，
#
前文提过“举例说明”，这里再强调一遍会破坏连贯性；
而且这句话的重点在于 runcmd 的处理方法，而非包含了相关情境和前文整段代码及说明的“这个例子”。

< 如果 exec 成功执行，子进程就会执行 echo 的指令。
> 如果 exec 成功被调用，子进程就会转而去执行 echo 程序里的指令。
#
为了避免属性模糊，还是规定一下搭配比较好：调用函数、运行程序、执行指令。
另外原文有个“instead of runcmd”，它隐含了 exec 的一条很重要的性质就是它使得程序流不再返回给调用者。虽然它确实不适合被译得太重，但还是提一下比较好。

< 这会使得主进程从 wait 返回。
> 这会使得其父进程从 wait 返回。
#
主进程是啥 ...

< fork 分配子进程需要的父进程的内存拷贝，exec 分配足够的内存用于装载一份可执行文件。
> fork 在子进程需要装入父进程的内存拷贝时分配空间，exec 在需要装入可执行文件时分配空间。
#
1. “fork分配...内存拷贝” 本身搭配不当（至少不合原文）。
2. 这句话的目的是解释上文“xv6通常隐式分配空间”。
3. 所以“allocate the memory required for ...” 以及 “allocate enough memory to ...”并不仅仅想说明 fork 做了什么，而是突出做这些事情是“隐式”的。
4. 换句话说，
       “fork allocates the memory required for the child’ s copy of the parent’s memory, and exec allocates enough memory to hold the executable file”
   实际上是在说
       “fork allocates the memory **WHEN** the child need a copy of the parent’s memory, and exec allocates memory **WHEN** holding the executable file”
5. 亦即，“required for” 和 “to” 在隐含地表达时间条件；第二句的“enough ... to”其实也有“just enough to”的意思，而非突出“very enough to”（“足够的”）。
6. “allocate the memory required for ...” 和 “allocate enough memory to ...” 都是“动宾补”结构且用词重复，意在突出 fork/exec 二者的共性。翻译时二者语序最好也互相类似。

< 一个在运行时需要额外内存的进程可以通过调用 sbrk(n) 来增加 n 字节的数据内存。
> 一个进程在需要额外内存时可以通过调用 sbrk(n) 来增加 n 字节的数据内存。
#
原文这奇怪的句法纯粹是为了省字数才用的吧。
    “A process that needs more memory at run-time can ...”
实际上是
    “When a process is at run-time and need more memory, it can ...”
且原文“at run-time”是在句子主要内容都出现后一笔带过，译文不但变成硬生生的术语（在运行时）且出现在句首，有点干扰理解。
更何况“at run-time”本身就是“process”的属性。

< xv6 没有用户，
> xv6 没有提供不同用户间的保护隔离措施。
#
这也太懒了 ...