Skip to content

Commit 1fdcf43

Browse files
committed
update commit ID and add filling script
1 parent b2a04eb commit 1fdcf43

37 files changed

+162
-60
lines changed

Diff for: chapter1/part1.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 安装 nightly Rust
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/9900fd9c751761d262594053576ace8590610261)
3+
* [代码][CODE]
44

55
我们首先使用如下命令安装 Rust 工具链管理器 rustup 和 Rust 包管理器 cargo:
66

@@ -27,3 +27,4 @@ $ rustc --version
2727
rustc 1.41.0-nightly (5c5c8eb86 2019-12-07)
2828
```
2929

30+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/d2a80549

Diff for: chapter1/part2.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 使用包管理器 cargo 创建 Rust binary 项目
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/9900fd9c751761d262594053576ace8590610261)
3+
* [代码][CODE]
44

55
使用 ``cargo new`` 创建一个新的 Rust binary 项目,命令如下:
66

@@ -31,3 +31,5 @@ Hello, world!
3131
```
3232

3333
打开 ``main.rs`` 发现里面确实只是输出了一行Hello, world!这个应用已经可以正常运行了,但是即使只是这么一个简单的功能,也离不开所在操作系统(Ubuntu)的帮助。我们既然要写一个新的操作系统,就不能依赖于任何已有操作系统!接下来我们尝试移除该应用对于操作系统的依赖。
34+
35+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/77ecc4e8

Diff for: chapter1/part3.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 移除标准库依赖
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/9900fd9c751761d262594053576ace8590610261)
3+
* [代码][CODE]
44

55
项目默认是链接 rust 标准库 std 的,它依赖于操作系统,因此我们需要显式将其禁用:
66

@@ -98,3 +98,5 @@ panic = "abort"
9898
>
9999
> ``error: requires `start` lang_item``
100100
>
101+
102+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/77ecc4e8

Diff for: chapter1/part4.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 移除 runtime 依赖
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/9900fd9c751761d262594053576ace8590610261)
3+
* [代码][CODE]
44

55
对于大多数语言,他们都使用了 **运行时系统(runtime system)** ,这导致 main 并不是他们执行的第一个函数。
66

@@ -64,4 +64,6 @@ pub extern "C" fn _start() -> ! {
6464
6565
构建得到的可执行文件位置放在 ``os/target/debug/os`` 中。
6666
67-
迄今为止的代码可以在[这里](https://github.com/rcore-os/rCore_tutorial/tree/9900fd9c751761d262594053576ace8590610261)找到,构建出现问题的话可以参考。
67+
迄今为止的代码可以在[这里][CODE]找到,构建出现问题的话可以参考。
68+
69+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/77ecc4e8

Diff for: chapter2/part1.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 使用目标三元组描述目标平台
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/1ba5fd7a1d7fc8794583ca1588a262916a20d707)
3+
* [代码][CODE]
44

55
cargo 在编译项目时,可以附加目标参数 `--target <target triple>` 设置项目的目标平台。平台包括硬件和软件支持,事实上, **目标三元组(target triple)** 包含:cpu 架构、供应商、操作系统和 [ABI](https://stackoverflow.com/questions/2171177/what-is-an-application-binary-interface-abi/2456882#2456882)
66

@@ -140,3 +140,5 @@ rustc -Z unstable-options --print target-spec-json --target riscv64imac-unknown-
140140
-[profile.release]
141141
-panic = "abort"
142142
```
143+
144+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/08991c79

Diff for: chapter2/part2.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 编译、生成内核镜像
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/1ba5fd7a1d7fc8794583ca1588a262916a20d707)
3+
* [代码][CODE]
44

55
### 使用 riscv64 目标编译项目
66

@@ -177,3 +177,5 @@ $ rust-objcopy target/riscv64imac-unknown-none-elf/debug/os --strip-all -O binar
177177
这里 ``--strip-all`` 表明丢弃所有符号表及调试信息,``-O binary`` 表示输出为二进制文件。
178178
179179
至此,我们编译并生成了内核镜像 ``kernel.bin`` 。接下来,我们将使用 Qemu 模拟器真正将我们的内核镜像跑起来。不过在此之前还需要完成两个工作:调整内存布局 和 重写入口函数。
180+
181+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/08991c79

Diff for: chapter2/part3.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 使用链接脚本指定程序内存布局
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/1ba5fd7a1d7fc8794583ca1588a262916a20d707)
3+
* [代码][CODE]
44

55
上一节中我们看到,编译出的程序默认被放到了从 0x10000 开始的位置上:
66

@@ -150,4 +150,6 @@ Disassembly of section .text:
150150

151151
程序已经被正确地放在了指定的地址上。
152152

153-
到这里,我们清楚了最终程序的内存布局会长成什么样子。下一节我们来补充这个链接脚本中未定义的段,并完成编译。
153+
到这里,我们清楚了最终程序的内存布局会长成什么样子。下一节我们来补充这个链接脚本中未定义的段,并完成编译。
154+
155+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/08991c79

Diff for: chapter2/part4.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 重写程序入口点 _start
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/1ba5fd7a1d7fc8794583ca1588a262916a20d707)
3+
* [代码][CODE]
44

55
我们在第一章中,曾自己重写了一个 C runtime 的入口点 ``_start`` ,在那里我们仅仅只是让它死循环。但是现在,类似 C runtime ,我们希望这个函数可以为我们设置内核的运行环境(不妨称为 kernel runtime ) 。随后,我们才真正开始执行内核的代码。
66

@@ -68,3 +68,5 @@ pub extern "C" fn rust_main() -> ! {
6868
}
6969
```
7070
到现在为止我们终于将一切都准备好了,接下来就要配合 OpenSBI 运行我们的内核!
71+
72+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/08991c79

Diff for: chapter2/part5.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 使用 Qemu 运行内核
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/3b1500685e14d7fe509d8b08e1e5eca4a299b022)
3+
* [代码][CODE]
44

55
### 安装模拟器 Qemu
66

@@ -155,6 +155,7 @@ run: build qemu
155155

156156
于是,我们可以使用 ``make run`` 来用 Qemu 加载内核镜像并运行。匆匆翻过一串长长的 OpenSBI 输出,我们看到了 ``OK`` !于是历经了千辛万苦我们终于将我们的内核跑起来了!
157157

158-
没有看到 OK ?迄今为止的代码可以在[这里](https://github.com/rcore-os/rCore_tutorial/tree/3b1500685e14d7fe509d8b08e1e5eca4a299b022)找到,请参考。
158+
没有看到 OK ?迄今为止的代码可以在[这里][CODE]找到,请参考。
159159
下一节我们实现格式化输出来使得我们后续能够更加方便的通过输出来进行内核调试。
160160

161+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/9387bd50

Diff for: chapter2/part6.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 封装 SBI 接口
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/8b1cfc9c84490b1a73817adb5bbcbb716453adb7)
3+
* [代码][CODE]
44

55
### 代码整理
66

@@ -215,3 +215,4 @@ const SBI_SHUTDOWN: usize = 8;
215215

216216
现在我们比较深入的理解了 ``console_putchar`` 到底是怎么一回事。下一节我们将使用 ``console_putchar`` 实现格式化输出,为后面的调试提供方便。
217217

218+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/ad57b607

Diff for: chapter2/part7.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 实现格式化输出
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/8b1cfc9c84490b1a73817adb5bbcbb716453adb7)
3+
* [代码][CODE]
44

55
只能使用 ``console_putchar`` 这种苍白无力的输出手段让人头皮发麻。如果我们能使用 ``print!`` 宏的话该有多好啊!于是我们就来实现自己的 ``print!`` 宏!
66

@@ -132,4 +132,6 @@ pub extern "C" fn rust_main() -> ! {
132132
133133
我们看到入口点的地址确实为我们安排的 ``0x80200000`` ,同时栈的地址也与我们在内存布局中看到的一样。更重要的是,我们现在能看到内核 ``panic`` 的位置了!这将大大有利于调试。
134134
135-
目前所有的代码可以在[这里](https://github.com/rcore-os/rCore_tutorial/tree/8b1cfc9c84490b1a73817adb5bbcbb716453adb7)找到。
135+
目前所有的代码可以在[这里][CODE]找到。
136+
137+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/ad57b607

Diff for: chapter3/part2.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 手动触发断点中断
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/e40df6d48101f53a06e46e266372820ed8e17f33)
3+
* [代码][CODE]
44

55
我们引入一个对寄存器进行操作的库,这样就可以不用自己写了。
66
```rust
@@ -70,5 +70,6 @@ pub extern "C" fn rust_main() -> ! {
7070
7171
可见在进入中断处理程序之前,硬件为我们正确的设置好了 ``scause,sepc`` 寄存器;随后我们正确的进入了设定的中断处理程序。
7272
73-
如果输出与预期不一致的话,可以在[这里](https://github.com/rcore-os/rCore_tutorial/tree/e40df6d48101f53a06e46e266372820ed8e17f33)找到目前的代码进行参考。
73+
如果输出与预期不一致的话,可以在[这里][CODE]找到目前的代码进行参考。
7474
75+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/952e1f1c

Diff for: chapter3/part3.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 程序运行上下文环境
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/837b3cbf0603b642f2e2d47ffcbdf7dda58d3a0e)
3+
* [代码][CODE]
44

55
考虑在中断发生之前,程序的运行状态(比如说一个很重要的中间结果)保存在一些寄存器中。而中断发生时,硬件仅仅帮我们设置中断原因、中断地址,随后就根据 ``stvec`` 直接跳转到中断处理程序。而中断处理程序可能会修改了那个保存了重要结果的寄存器,而后,即使处理结束后使用 ``sret`` 指令跳回到中断发生的位置,原来的程序也会一脸懵逼:这个中间结果怎么突然变了?
66

@@ -40,3 +40,5 @@ pub struct TrapFrame {
4040
我们将$$32$$个通用寄存器全保存下来,同时还之前提到过的进入中断之前硬件会自动设置的三个寄存器,还有状态寄存器 ``sstatus`` 也会被修改。
4141

4242
其中属性``#[repr(C)]``表示对这个结构体按照 C 语言标准进行内存布局,即从起始地址开始,按照字段的声明顺序依次排列,如果不加上这条属性的话,Rust 编译器对它的内存布局是不确定的,我们就无法使用汇编代码对它进行正确的读写。
43+
44+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/5d09d5eb

Diff for: chapter3/part4.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 实现上下文环境保存与恢复
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/837b3cbf0603b642f2e2d47ffcbdf7dda58d3a0e)
3+
* [代码][CODE]
44

55
```riscv
66
# src/trap/trap.asm
@@ -252,4 +252,6 @@ pub fn rust_trap(tf: &mut TrapFrame) {
252252
253253
可以看到,我们确实手动触发中断,调用了中断处理函数,并通过上下文保存与恢复机制保护了上下文环境不受到破坏,正确在 ``ebreak`` 中断处理程序返回之后 ``panic``。
254254
255-
迄今为止的代码可以在[这里](https://github.com/rcore-os/rCore_tutorial/tree/837b3cbf0603b642f2e2d47ffcbdf7dda58d3a0e)找到。如果出现了问题的话就来检查一下吧。
255+
迄今为止的代码可以在[这里][CODE]找到。如果出现了问题的话就来检查一下吧。
256+
257+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/5d09d5eb

Diff for: chapter3/part5.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 时钟中断
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/da7ee0906a43681acf81d6d90fd2c1d372b39d06)
3+
* [代码][CODE]
44

55
在本节中,我们处理一种很重要的中断:时钟中断。这种中断我们可以设定为每隔一段时间硬件自动触发一次,在其对应的中断处理程序里,我们回到内核态,并可以对用户态的程序进行调度、监控管理他们对于资源的使用情况。
66

@@ -193,4 +193,6 @@ fn panic(info: &PanicInfo) -> ! {
193193
> ...
194194
> ```
195195
196-
如果出现问题的话,可以在[这里](https://github.com/rcore-os/rCore_tutorial/tree/da7ee0906a43681acf81d6d90fd2c1d372b39d06)找到目前的代码。
196+
如果出现问题的话,可以在[这里][CODE]找到目前的代码。
197+
198+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/57734e33

Diff for: chapter4/part1.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 物理内存探测与管理
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/0c11e42a2174f0cc76a275bfe8815b7aa47d8bec)
3+
* [代码][CODE]
44

55
我们知道,物理内存通常是一片 RAM ,我们可以把它看成一个以字节为单位的大数组,通过物理地址找到对应的位置进行读写。但是,物理地址**并不仅仅**只能访问物理内存,也可以用来访问其他的外设,因此你也可以认为物理内存也算是一种外设。
66

@@ -300,7 +300,8 @@ fn frame_allocating_test() {
300300
301301
我们回收的页面接下来马上就又被分配出去了。
302302
303-
如果结果有问题的话,在[这里](https://github.com/rcore-os/rCore_tutorial/tree/0c11e42a2174f0cc76a275bfe8815b7aa47d8bec)能找到现有的代码。
303+
如果结果有问题的话,在[这里][CODE]能找到现有的代码。
304304
305305
不过,这种物理内存分配给人一种过家家的感觉。无论表面上分配、回收做得怎样井井有条,实际上都并没有对物理内存产生任何影响!不要着急,我们之后会使用它们的。
306306
307+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/695d8a2c

Diff for: chapter4/part2.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 动态内存分配
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/e0d003d70879db6b72f05142fe611ea7c19b551b)
3+
* [代码][CODE]
44

55
我们之前在 ``C/C++`` 语言中使用过 ``new, malloc`` 等动态内存分配方法,与在编译期就已完成的静态内存分配相比,动态内存分配可以根据程序运行时状态修改内存申请的时机及大小,显得更为灵活,但是这是需要操作系统的支持的,会带来一些开销。
66

@@ -166,4 +166,6 @@ fn dynamic_allocating_test() {
166166
167167
我们可以发现这些动态分配的变量可以使用了。而且通过查看它们的地址我们发现它们都在 $$\text{.bss}$$ 段里面。这是因为提供给动态内存分配器的那块内存就在 $$\text{.bss}$$ 段里面啊。
168168
169-
如果结果不太对劲,可以在[这里](https://github.com/rcore-os/rCore_tutorial/tree/e0d003d70879db6b72f05142fe611ea7c19b551b)查看现有的代码。
169+
如果结果不太对劲,可以在[这里][CODE]查看现有的代码。
170+
171+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/345dc90b

Diff for: chapter5/part4.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 内核重映射实现之一:页表
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/ac0b0f2f658a9ae777356fb5151b08ccfeb30d57)
3+
* [代码][CODE]
44

55
首先我们来看如何实现页表。
66

@@ -257,4 +257,6 @@ impl PageTableImpl {
257257
}
258258
}
259259
}
260-
```
260+
```
261+
262+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/e54dce49

Diff for: chapter5/part5.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 内核重映射实现之二:MemorySet
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/ac0b0f2f658a9ae777356fb5151b08ccfeb30d57)
3+
* [代码][CODE]
44

55
我们实现了页表,但是好像还不足以应对内核重映射的需求。我们要对多个段分别进行不同的映射,而页表只允许我们每次插入一对从虚拟页到物理页帧的映射。
66

@@ -384,3 +384,4 @@ impl MemorySet {
384384
}
385385
```
386386

387+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/e54dce49

Diff for: chapter5/part6.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 内核重映射实现之三:完结
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/ac0b0f2f658a9ae777356fb5151b08ccfeb30d57)
3+
* [代码][CODE]
44

55
在内存模块初始化时,我们新建一个精细映射的 ``MemorySet`` 并切换过去供内核使用。
66
```rust
@@ -136,4 +136,6 @@ panicked at 'page fault!', src/interrupt.rs:65:5
136136
> ```
137137
138138
从中我们可以清楚的看出内核成功的找到了错误的原因,内核各段被成功的设置了不同的权限。我们达到了内核重映射的目的!
139-
目前的代码能在[这里](https://github.com/rcore-os/rCore_tutorial/tree/ac0b0f2f658a9ae777356fb5151b08ccfeb30d57)找到。
139+
目前的代码能在[这里][CODE]找到。
140+
141+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/e54dce49

Diff for: chapter6/part1.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 线程状态与保存
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/ac0b0f2f658a9ae777356fb5151b08ccfeb30d57)
3+
* [代码][CODE]
44

55
如果将整个运行中的内核看作一个**内核进程**,那么一个**内核线程**只负责内核进程中**执行**的部分。虽然我们之前从未提到过内核线程的概念,但是在我们设置完启动栈,并跳转到 ``rust_main`` 之后,我们的第一个内核线程——**内核启动线程**就已经在运行了!
66

@@ -146,3 +146,5 @@ impl Drop for KernelStack {
146146
``top`` 方法,返回分配的那块内存的结尾地址。由于栈是从高地址到低地址增长,事实上它表示一个空栈的栈顶地址。
147147

148148
下一节,我们来看如何进行线程切换。
149+
150+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/8cb1a4be

Diff for: chapter6/part2.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 线程切换
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/ac0b0f2f658a9ae777356fb5151b08ccfeb30d57)
3+
* [代码][CODE]
44

55
我们要用这个函数完成线程切换:
66

@@ -118,4 +118,6 @@ impl Context {
118118

119119
因此这是一个函数调用,由 calling convention ,编译器会自动生成代码在调用前后帮我们保存、恢复所有的 caller-saved 寄存器。于是乎我们需要手动保存所有的 callee-saved 寄存器 $$\text{s}_0\sim\text{s}_{11}$$ 。这样所有的寄存器都被保存了。
120120

121-
下面一节我们来研究如何进行线程初始化。
121+
下面一节我们来研究如何进行线程初始化。
122+
123+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/8cb1a4be

Diff for: chapter6/part3.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 内核线程初始化
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/ac0b0f2f658a9ae777356fb5151b08ccfeb30d57)
3+
* [代码][CODE]
44

55
回忆一下我们如何进行启动线程的初始化?无非两步:设置栈顶地址、跳转到内核入口地址。从而变为启动线程的初始状态,并准备开始运行。
66

@@ -119,4 +119,6 @@ impl Thread {
119119
}
120120
```
121121

122-
下一节我们终于能拨云见日,写一个测试看看我们的线程实现究竟有无问题了!
122+
下一节我们终于能拨云见日,写一个测试看看我们的线程实现究竟有无问题了!
123+
124+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/8cb1a4be

Diff for: chapter6/part4.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 内核线程创建与切换测试
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/ac0b0f2f658a9ae777356fb5151b08ccfeb30d57)
3+
* [代码][CODE]
44

55
我们想做的事情是:新建一个临时线程,从启动线程切换到临时线程,再切换回来。
66

@@ -94,4 +94,6 @@ pub extern "C" fn rust_main() -> ! {
9494
9595
可见我们切换到了临时线程,又切换了回来!测试成功!
9696
97-
截至目前所有的代码可以在[这里](https://github.com/rcore-os/rCore_tutorial/tree/ac0b0f2f658a9ae777356fb5151b08ccfeb30d57)找到以供参考。
97+
截至目前所有的代码可以在[这里][CODE]找到以供参考。
98+
99+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/8cb1a4be

Diff for: chapter7/part1.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 线程管理器
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/83ed61332bc1807fcaf016b3e8d932df1291ade5)
3+
* [代码][CODE]
44

55
### 线程状态
66
从调度器的角度来看,每个线程都有一个独一无二的 Tid 来区分它和其他线程。
@@ -200,4 +200,4 @@ impl ThreadPool {
200200
```
201201
现在我们有了一个线程池 ``ThreadPool`` ,它内含调度器,是一个优秀的线程管理器。下一节我们将介绍调度线程 ``idle`` 以及调度单元 ``Processor``
202202

203-
203+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/75d4ed97

Diff for: chapter7/part2.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 内核调度线程 idle
22

3-
* [代码](https://github.com/rcore-os/rCore_tutorial/tree/83ed61332bc1807fcaf016b3e8d932df1291ade5)
3+
* [代码][CODE]
44

55
调度线程 idle 是一个内核线程,它的作用是
66

@@ -274,3 +274,5 @@ pub fn exit(code: usize) {
274274
```
275275

276276
至此我们说明了调度线程 idle 以及调度单元 Processor 。但我们之前还挖了一个坑,也就是上一节中,调度算法我们只提供了一个接口但并未提供具体实现。下一节我们就来介绍一种最简单的调度算法实现。
277+
278+
[CODE]: https://github.com/rcore-os/rCore_tutorial/tree/75d4ed97

0 commit comments

Comments
 (0)