Skip to content

Commit 28037b1

Browse files
committed
整理译名表 (2 / 12)
1 parent eabe200 commit 28037b1

File tree

2 files changed

+49
-18
lines changed

2 files changed

+49
-18
lines changed

02-minimal-rust-kernel.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
# 使用Rust编写操作系统(二):最小化内核
88

9-
在这篇文章中,我们将基于**x86架构**(the x86 architecture),使用Rust语言,编写一个最小化的64位内核。我们将从上一章中构建的独立式可执行程序开始,构建自己的内核;它将向显示器打印字符串,并能被打包为一个能够引导启动的**磁盘映像**(disk image)。
9+
这片文章将基于**x86架构**(the x86 architecture);我们是试着使用Rust语言,编写一个最小化内核。我们将从独立式可执行程序开始,构建自己的内核。我们将向显示器打印字符串,最终打包内核为能引导启动的**磁盘映像**(disk image)。
1010

1111
## 引导启动
1212

@@ -179,10 +179,10 @@ pub extern "C" fn _start() -> ! {
179179

180180
通过把JSON文件名传入`--target`选项,我们现在可以开始编译我们的内核。让我们试试看:
181181

182-
```
182+
```text
183183
> cargo build --target x86_64-blog_os.json
184184
185-
error[E0463]: can't find crate for `core`
185+
error[E0463]: can't find crate for `core`
186186
(或者是下面的错误)
187187
error[E0463]: can't find crate for `compiler_builtins`
188188
```
@@ -231,7 +231,7 @@ target = "x86_64-blog_os.json"
231231

232232
这里的配置告诉`cargo`在没有显式声明目标的情况下,使用我们提供的`x86_64-blog_os.json`作为目标配置。这意味着保存后,我们可以直接使用:
233233

234-
```
234+
```text
235235
cargo build
236236
```
237237

@@ -241,7 +241,7 @@ cargo build
241241

242242
要做到这一步,最简单的方式是写入**VGA字符缓冲区**[VGA text buffer](https://en.wikipedia.org/wiki/VGA-compatible_text_mode)):这是一段映射到VGA硬件的特殊内存片段,包含着显示在屏幕上的内容。通常情况下,它能够存储25行、80列共2000个**字符单元**(character cell);每个字符单元能够显示一个ASCII字符,也能设置这个字符的**前景色**(foreground color)和**背景色**(background color)。输出到屏幕的字符大概长这样:
243243

244-
![](https://upload.wikimedia.org/wikipedia/commons/6/6d/Codepage-737.png)
244+
![字符](https://upload.wikimedia.org/wikipedia/commons/6/6d/Codepage-737.png)
245245

246246
我们将在下篇文章中详细讨论VGA字符缓冲区的内存布局;目前我们只需要知道,这段缓冲区的地址是`0xb8000`,且每个字符单元包含一个ASCII码字节和一个颜色字节。
247247

@@ -265,13 +265,13 @@ pub extern "C" fn _start() -> ! {
265265
}
266266
```
267267

268-
在这段代码中,我们预先定义了一个**字节字符串**(byte string)类型的**静态变量**(static variable),名为`HELLO`。我们首先将整数`0xb8000`**转换**(cast)为一个**裸指针**[raw pointer](https://doc.rust-lang.org/stable/book/second-edition/ch19-01-unsafe-rust.html#dereferencing-a-raw-pointer))。这之后,我们迭代`HELLO`的每个字节,使用[enumerate](https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.enumerate)获得一个额外的序号变量`i`。在`for`语句的循环体中,我们使用[offset](https://doc.rust-lang.org/std/primitive.pointer.html#method.offset)偏移裸指针,解引用它,来将字符串的每个字节和对应的颜色字节——`0xb`代表淡青色——写入内存位置。
268+
在这段代码中,我们预先定义了一个**字节串**(byte string)类型的**静态变量**(static variable),名为`HELLO`。我们首先将整数`0xb8000`**转换**(cast)为一个**裸指针**[raw pointer](https://doc.rust-lang.org/stable/book/second-edition/ch19-01-unsafe-rust.html#dereferencing-a-raw-pointer))。这之后,我们迭代`HELLO`的每个字节,使用[enumerate](https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.enumerate)获得一个额外的序号变量`i`。在`for`语句的循环体中,我们使用[offset](https://doc.rust-lang.org/std/primitive.pointer.html#method.offset)偏移裸指针,解引用它,来将字符串的每个字节和对应的颜色字节——`0xb`代表淡青色——写入内存位置。
269269

270270
要注意的是,所有的裸指针内存操作都被一个**unsafe语句块**[unsafe block](https://doc.rust-lang.org/stable/book/second-edition/ch19-01-unsafe-rust.html))包围。这是因为,此时编译器不能确保我们创建的裸指针是有效的;一个裸指针可能指向任何一个你内存位置;直接解引用并写入它,也许会损坏正常的数据。使用`unsafe`语句块时,程序员其实在告诉编译器,自己保证语句块内的操作是有效的。事实上,`unsafe`语句块并不会关闭Rust的安全检查机制;它允许你多做的事情[只有四件](https://doc.rust-lang.org/stable/book/second-edition/ch19-01-unsafe-rust.html#unsafe-superpowers)
271271

272272
使用`unsafe`语句块要求程序员有足够的自信,所以必须强调的一点是,**肆意使用unsafe语句块并不是Rust编程的一贯方式**。在缺乏足够经验的前提下,直接在`unsafe`语句块内操作裸指针,非常容易把事情弄得很糟糕;比如,在不注意的情况下,我们很可能会意外地操作缓冲区以外的内存。
273273

274-
在这样的前提下,我们希望最小化`unsafe `语句块的使用。使用Rust语言,我们能够将不安全操作将包装为一个安全的抽象模块。举个栗子,我们可以创建一个VGA缓冲区类型,把所有的不安全语句封装起来,来确保从类型外部操作时,无法写出不安全的代码:通过这种方式,我们只需要最少的`unsafe`语句块来确保我们不破坏**内存安全**[memory safety](https://en.wikipedia.org/wiki/Memory_safety))。在下一篇文章中,我们将会创建这样的VGA缓冲区封装。
274+
在这样的前提下,我们希望最小化`unsafe`语句块的使用。使用Rust语言,我们能够将不安全操作将包装为一个安全的抽象模块。举个栗子,我们可以创建一个VGA缓冲区类型,把所有的不安全语句封装起来,来确保从类型外部操作时,无法写出不安全的代码:通过这种方式,我们只需要最少的`unsafe`语句块来确保我们不破坏**内存安全**[memory safety](https://en.wikipedia.org/wiki/Memory_safety))。在下一篇文章中,我们将会创建这样的VGA缓冲区封装。
275275

276276
## 启动内核
277277

@@ -328,7 +328,7 @@ cargo install bootimage --version "^0.7.3"
328328
> qemu-system-x86_64 -drive format=raw,file=bootimage-blog_os.bin
329329
```
330330

331-
![](https://os.phil-opp.com/minimal-rust-kernel/qemu.png)
331+
![qemu的显示内容](https://os.phil-opp.com/minimal-rust-kernel/qemu.png)
332332

333333
我们可以看到,屏幕窗口已经显示出“Hello World!”字符串。祝贺你!
334334

@@ -363,4 +363,4 @@ runner = "bootimage runner"
363363

364364
## 下篇预告
365365

366-
在下篇文章中,我们将细致地探索VGA字符缓冲区,并包装它为一个安全的接口。我们还将基于它实现`println!`宏。
366+
在下篇文章中,我们将细致地探索VGA字符缓冲区,并包装它为一个安全的接口。我们还将基于它实现`println!`宏。

translation-table.md

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,44 +6,75 @@
66

77
英文部分书名、人名请使用斜体;保留原有的大小写。请按英文字母顺序排序。
88

9-
涉及Rust语言的概念,标注(Rust),以便和其它语言、技术的概念相区分。
9+
涉及Rust语言、x86架构等的概念,标注(Rust)(x86),以便和其它语言、技术的概念相区分。
1010

11-
| 英文 | 首次出现章节 | 中文翻译 |
11+
| 英文 | 出现章节 | 中文翻译 |
1212
|:----|:--------|:------|
13-
| bare metal || 裸机 |
13+
| append by bytes || 按字符拼接 |
14+
| Application Binary Interface, ABI || 应用程序二进制接口 |
15+
| background color || 背景色 |
16+
| bare metal | 一,二 | 裸机 |
1417
| bare-metal executable || 裸机程序 |
18+
| bootable disk image || 可引导的映像 |
19+
| bootloader || 引导程序 |
20+
| BSS segment || BSS段 |
21+
| byte string || 字节串 |
22+
| caret requirement (Rust) || 脱字号条件 |
23+
| character cell || 字符单元 |
1524
| Combinators | 十二 | 组合子 |
25+
| compiler built-in libraries || 编译器内建库 |
1626
| Cooperative Multitasking | 十二 | 协作式多任务 |
1727
| copy semantics || 复制语义 |
28+
| CPU feature || CPU特征 |
1829
| cross compile || 交叉编译 |
1930
| custom target || 自定义目标 |
2031
| destructor || 析构函数 |
2132
| dev profile (Rust) || dev配置 |
33+
| device name | 二 | 设备名 |
2234
| diverging | 十二 | 发散 |
2335
| diverging function (Rust) || 发散函数 |
2436
| dynamically dispatch | 十二 | 动态派发 |
2537
| edition (Rust) || 版次 |
38+
| Executable and Linkable Format, ELF || ELF格式 |
2639
| embedded system || 嵌入式系统 |
2740
| entry point || 入口点 |
41+
| entry point address || 入口点地址 |
42+
| feature flag || 特性标签 |
43+
| foreground color || 前景色 |
2844
| freestanding executable || 独立式可执行程序 |
2945
| garbage collection || 垃圾回收 |
3046
| green threads || 绿色线程,软件线程 |
31-
| "host" system || 宿主系统 |
32-
| Pin | 十二 | 固定 |
33-
| Preemptive Multitasking | 十二 | 抢占式多任务 |
47+
| host system | 一,二 | 宿主系统 |
48+
| kernal || 内核 |
3449
| language item (Rust) || 语言项 |
35-
| linker || 链接器 |
50+
| linker |,二 | 链接器 |
3651
| linker argument || 链接器参数 |
52+
| magic number || 魔术数字 |
53+
| memory safety || 内存安全 |
3754
| name mangling || 名称重整 |
3855
| "never" type (Rust) || Never类型 |
56+
| page table || 分页表 |
57+
| Pin | 十二 | 固定 |
58+
| precompiled library || 预编译库 |
59+
| Preemptive Multitasking | 十二 | 抢占式多任务 |
60+
| raw pointer || 裸指针 |
3961
| redzone || 红区 |
62+
| release channel (Rust) || 发行频道 |
4063
| release profile || release配置 |
4164
| root module || 根模块 |
4265
| runtime system || 运行时系统 |
66+
| Single Instruction Multiple Data, SIMD || 单指令多数据流 |
67+
| static variable || 静态变量 |
4368
| stack trace || 堆栈轨迹 |
44-
| stack unwinding || 栈展开 |
69+
| stack unwinding |,二 | 栈展开 |
4570
| standard output || 标准输出 |
4671
| structured exception handling, SEH || 结构化异常处理 |
4772
| software threads || 软件线程,绿色线程 |
4873
| system call || 系统调用 |
49-
| target triple (Rust) || 目标三元组 |
74+
| target triple (Rust) | 一,二 | 目标三元组 |
75+
| target specification || 目标配置清单 |
76+
| target system || 目标系统 |
77+
| unsafe block || unsafe语句块 |
78+
| unstable feature || 不稳定特性 |
79+
| VGA text buffer (x86) || VGA字符缓冲区 |
80+
| virtual address || 虚拟地址 |

0 commit comments

Comments
 (0)