mirror of
https://github.com/phil-opp/blog_os.git
synced 2025-12-16 14:27:49 +00:00
Merge branch 'main' into edition-3
This commit is contained in:
@@ -422,7 +422,7 @@ extern "C" fn divide_by_zero_handler() -> ! {
|
|||||||
```
|
```
|
||||||
We register a single handler function for a [divide by zero error] \(index 0). Like the name says, this exception occurs when dividing a number by 0. Thus we have an easy way to test our new exception handler.
|
We register a single handler function for a [divide by zero error] \(index 0). Like the name says, this exception occurs when dividing a number by 0. Thus we have an easy way to test our new exception handler.
|
||||||
|
|
||||||
[divide by zero error]: https://wiki.osdev.org/Exceptions#Divide-by-zero_Error
|
[divide by zero error]: https://wiki.osdev.org/Exceptions#Division_Error
|
||||||
|
|
||||||
However, it doesn't work this way:
|
However, it doesn't work this way:
|
||||||
|
|
||||||
|
|||||||
@@ -31,8 +31,6 @@ nightly
|
|||||||
|
|
||||||
[rustup]: https://www.rustup.rs/
|
[rustup]: https://www.rustup.rs/
|
||||||
|
|
||||||
The code from this post (and all following) is [automatically tested](https://travis-ci.org/phil-opp/blog_os) every day and should always work for the newest nightly. If it doesn't, please [file an issue](https://github.com/phil-opp/blog_os/issues).
|
|
||||||
|
|
||||||
## Creating a Cargo project
|
## Creating a Cargo project
|
||||||
[Cargo] is Rust's excellent package manager. Normally you would call `cargo new` when you want to create a new project folder. We can't use it because our folder already exists, so we need to do it manually. Fortunately we only need to add a cargo configuration file named `Cargo.toml`:
|
[Cargo] is Rust's excellent package manager. Normally you would call `cargo new` when you want to create a new project folder. We can't use it because our folder already exists, so we need to do it manually. Fortunately we only need to add a cargo configuration file named `Cargo.toml`:
|
||||||
|
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ First Exception | Second Exception
|
|||||||
[Divide-by-zero],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] | [Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
[Divide-by-zero],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] | [Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
||||||
[Page Fault] | [Page Fault],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
[Page Fault] | [Page Fault],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
||||||
|
|
||||||
[Divide-by-zero]: https://wiki.osdev.org/Exceptions#Divide-by-zero_Error
|
[Divide-by-zero]: https://wiki.osdev.org/Exceptions#Division_Error
|
||||||
[Invalid TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
[Invalid TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
||||||
[Segment Not Present]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
[Segment Not Present]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
||||||
[Stack-Segment Fault]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
[Stack-Segment Fault]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ rustup target add thumbv7em-none-eabihf
|
|||||||
cargo build --target thumbv7em-none-eabihf
|
cargo build --target thumbv7em-none-eabihf
|
||||||
```
|
```
|
||||||
|
|
||||||
我们传递了 `--target` 参数,来为裸机目标系统**交叉编译**([cross compile](https://en.wikipedia.org/wiki/Cross_compiler))我们的程序。我们的目标并不包括操作系统,所以链接器不会试着链接 C 语言运行环境,因此构建过程成功会完成,不会产生链接器错误。
|
我们传递了 `--target` 参数,来为裸机目标系统**交叉编译**([cross compile](https://en.wikipedia.org/wiki/Cross_compiler))我们的程序。我们的目标并不包括操作系统,所以链接器不会试着链接 C 语言运行环境,因此构建过程会成功完成,不会产生链接器错误。
|
||||||
|
|
||||||
我们将使用这个方法编写自己的操作系统内核。我们不会编译到 `thumbv7em-none-eabihf`,而是使用描述 `x86_64` 环境的**自定义目标**([custom target](https://doc.rust-lang.org/rustc/targets/custom.html))。在下一篇文章中,我们将详细描述一些相关的细节。
|
我们将使用这个方法编写自己的操作系统内核。我们不会编译到 `thumbv7em-none-eabihf`,而是使用描述 `x86_64` 环境的**自定义目标**([custom target](https://doc.rust-lang.org/rustc/targets/custom.html))。在下一篇文章中,我们将详细描述一些相关的细节。
|
||||||
|
|
||||||
@@ -424,7 +424,7 @@ use core::panic::PanicInfo;
|
|||||||
|
|
||||||
#[no_mangle] // 不重整函数名
|
#[no_mangle] // 不重整函数名
|
||||||
pub extern "C" fn _start() -> ! {
|
pub extern "C" fn _start() -> ! {
|
||||||
// 因为编译器会寻找一个名为 `_start` 的函数,所以这个函数就是入口点
|
// 因为链接器会寻找一个名为 `_start` 的函数,所以这个函数就是入口点
|
||||||
// 默认命名为 `_start`
|
// 默认命名为 `_start`
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -890,7 +890,7 @@ fn test_println() {
|
|||||||
|
|
||||||
標準ライブラリのテストフレームワークは、[`#[should_panic]`属性][should_panic]をサポートしています。これを使うと、失敗しなければならないテストを作ることができます。これは、例えば、関数が無効な引数を渡されたときに失敗することを確かめる場合などに便利です。残念なことに、この機能は標準ライブラリのサポートを必要とするため、`#[no_std]`クレートではこの属性はサポートされていません。
|
標準ライブラリのテストフレームワークは、[`#[should_panic]`属性][should_panic]をサポートしています。これを使うと、失敗しなければならないテストを作ることができます。これは、例えば、関数が無効な引数を渡されたときに失敗することを確かめる場合などに便利です。残念なことに、この機能は標準ライブラリのサポートを必要とするため、`#[no_std]`クレートではこの属性はサポートされていません。
|
||||||
|
|
||||||
[should_panic]: https://doc.rust-jp.rs/rust-by-example-ja/testing/unit_testing.html#testing-panics
|
[should_panic]: https://doc.rust-jp.rs/rust-by-example-ja/testing/unit_testing.html#パニックをテストする
|
||||||
|
|
||||||
`#[should_panic]`属性は使えませんが、パニックハンドラから成功のエラーコードで終了するような結合テストを作れば、似たような動きをさせることはできます。そのようなテストを`should_panic`という名前で作ってみましょう:
|
`#[should_panic]`属性は使えませんが、パニックハンドラから成功のエラーコードで終了するような結合テストを作れば、似たような動きをさせることはできます。そのようなテストを`should_panic`という名前で作ってみましょう:
|
||||||
|
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ extern "x86-interrupt" fn double_fault_handler(
|
|||||||
[Divide-by-zero],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] | [Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
[Divide-by-zero],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] | [Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
||||||
[Page Fault] | [Page Fault],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
[Page Fault] | [Page Fault],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
||||||
|
|
||||||
[Divide-by-zero]: https://wiki.osdev.org/Exceptions#Divide-by-zero_Error
|
[Divide-by-zero]: https://wiki.osdev.org/Exceptions#Division_Error
|
||||||
[Invalid TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
[Invalid TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
||||||
[Segment Not Present]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
[Segment Not Present]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
||||||
[Stack-Segment Fault]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
[Stack-Segment Fault]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ CPUはダブルフォルトハンドラを呼べるようになったので、
|
|||||||
[ゼロ除算],<br>[無効TSS],<br>[セグメント不在],<br>[スタックセグメントフォルト],<br>[一般保護違反] | [無効TSS],<br>[セグメント不在],<br>[スタックセグメントフォルト],<br>[一般保護違反]
|
[ゼロ除算],<br>[無効TSS],<br>[セグメント不在],<br>[スタックセグメントフォルト],<br>[一般保護違反] | [無効TSS],<br>[セグメント不在],<br>[スタックセグメントフォルト],<br>[一般保護違反]
|
||||||
[ページフォルト] | [ページフォルト],<br>[無効TSS],<br>[セグメント不在],<br>[スタックセグメントフォルト],<br>[一般保護違反]
|
[ページフォルト] | [ページフォルト],<br>[無効TSS],<br>[セグメント不在],<br>[スタックセグメントフォルト],<br>[一般保護違反]
|
||||||
|
|
||||||
[ゼロ除算]: https://wiki.osdev.org/Exceptions#Divide-by-zero_Error
|
[ゼロ除算]: https://wiki.osdev.org/Exceptions#Division_Error
|
||||||
[無効TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
[無効TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
||||||
[セグメント不在]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
[セグメント不在]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
||||||
[スタックセグメントフォルト]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
[スタックセグメントフォルト]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ _“예외 처리 함수를 호출하는 것에 실패했을 때”_ 라는 게
|
|||||||
[Divide-by-zero],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] | [Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
[Divide-by-zero],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] | [Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
||||||
[Page Fault] | [Page Fault],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
[Page Fault] | [Page Fault],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
||||||
|
|
||||||
[Divide-by-zero]: https://wiki.osdev.org/Exceptions#Divide-by-zero_Error
|
[Divide-by-zero]: https://wiki.osdev.org/Exceptions#Division_Error
|
||||||
[Invalid TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
[Invalid TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
||||||
[Segment Not Present]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
[Segment Not Present]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
||||||
[Stack-Segment Fault]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
[Stack-Segment Fault]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ First Exception | Second Exception
|
|||||||
[Divide-by-zero],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] | [Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
[Divide-by-zero],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] | [Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
||||||
[Page Fault] | [Page Fault],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
[Page Fault] | [Page Fault],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault]
|
||||||
|
|
||||||
[Divide-by-zero]: https://wiki.osdev.org/Exceptions#Divide-by-zero_Error
|
[Divide-by-zero]: https://wiki.osdev.org/Exceptions#Division_Error
|
||||||
[Invalid TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
[Invalid TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
||||||
[Segment Not Present]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
[Segment Not Present]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
||||||
[Stack-Segment Fault]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
[Stack-Segment Fault]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ extern "x86-interrupt" fn double_fault_handler(
|
|||||||
| [Divide-by-zero],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] | [Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] |
|
| [Divide-by-zero],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] | [Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] |
|
||||||
| [Page Fault] | [Page Fault],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] |
|
| [Page Fault] | [Page Fault],<br>[Invalid TSS],<br>[Segment Not Present],<br>[Stack-Segment Fault],<br>[General Protection Fault] |
|
||||||
|
|
||||||
[Divide-by-zero]: https://wiki.osdev.org/Exceptions#Divide-by-zero_Error
|
[Divide-by-zero]: https://wiki.osdev.org/Exceptions#Division_Error
|
||||||
[Invalid TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
[Invalid TSS]: https://wiki.osdev.org/Exceptions#Invalid_TSS
|
||||||
[Segment Not Present]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
[Segment Not Present]: https://wiki.osdev.org/Exceptions#Segment_Not_Present
|
||||||
[Stack-Segment Fault]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
[Stack-Segment Fault]: https://wiki.osdev.org/Exceptions#Stack-Segment_Fault
|
||||||
|
|||||||
1010
blog/content/edition-2/posts/09-paging-implementation/index.zh-CN.md
Normal file
1010
blog/content/edition-2/posts/09-paging-implementation/index.zh-CN.md
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user