Compare commits

...

3 Commits

Author SHA1 Message Date
James Zow 644474cc09
fix:simplify self assignment and use Ruby to simplify syntax (#211) 5 months ago
James Zow 42a1f7ad56
Fix pdf reference page for errors #200 (#202)
Because the latest version is the JA version dated April 27, 2023, we will use this version of information as a reference in the future.
5 months ago
James Zow 8856331be9
Modify outdated translations (#201)
* Modify outdated translations

* Update README.CN.md

Co-authored-by: Devin-Yeung <53309384+Devin-Yeung@users.noreply.github.com>

---------

Co-authored-by: Devin-Yeung <53309384+Devin-Yeung@users.noreply.github.com>
5 months ago

@ -55,7 +55,7 @@ In `AArch64`, it is differentiated between four types of exceptions. These are:
## Exception entry
I recommend to read pages 1874-1876 of the [ARMv8 Architecture Reference Manual][ARMv8_Manual] to
I recommend to read pages D1-5355 of the [ARMv8 Architecture Reference Manual][ARMv8_Manual Ja] to
understand the mechanisms of taking an exception.
Here's an excerpt of important features for this tutorial:
@ -65,8 +65,8 @@ Here's an excerpt of important features for this tutorial:
- The preferred return address is saved in the `ELR_ELx` register.
- "Preferred" here means that `ELR_ELx` may hold the instruction address of the instructions that
caused the exception (`synchronous case`) or the first instruction that did not complete due to
an `asynchronous` exception. Details in Chapter D1.10.1 of the [ARMv8 Architecture Reference
Manual][ARMv8_Manual].
an `asynchronous` exception. Details in pages D1-5357 of the [ARMv8 Architecture Reference
Manual][ARMv8_Manual Ja].
- All kinds of exceptions are turned off upon taking an exception, so that by default, exception
handlers can not get interrupted themselves.
- Taking an exception will select the dedicated stack pointer of the target `EL`.
@ -81,10 +81,10 @@ Here's an excerpt of important features for this tutorial:
introduced already, and additionally, it is taken into account _where_ the exception was taken from
and what the circumstances were.
Here is a copy of the decision table as shown in Chapter D1.10.2 of the [ARMv8 Architecture
Reference Manual][ARMv8_Manual]:
Here is a copy of the decision table as shown in pages D1-5358 of the [ARMv8 Architecture
Reference Manual][ARMv8_Manual Ja]:
[ARMv8_Manual]: https://developer.arm.com/docs/ddi0487/latest/arm-architecture-reference-manual-armv8-for-armv8-a-architecture-profile
[ARMv8_Manual Ja]: https://developer.arm.com/documentation/ddi0487/ja/
<table>
<thead>

@ -2006,7 +2006,7 @@ diff -uNr 14_virtual_mem_part2_mmio_remap/tools/translation_table_tool/arch.rb 1
+ attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
+
+ def next_level_table_addr=(addr)
+ addr = addr >> Granule64KiB::SHIFT
+ addr >>= Granule64KiB::SHIFT
+
+ self.__next_level_table_addr = addr
+ end
@ -2092,7 +2092,7 @@ diff -uNr 14_virtual_mem_part2_mmio_remap/tools/translation_table_tool/arch.rb 1
+ attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
+
+ def output_addr=(addr)
+ addr = addr >> Granule64KiB::SHIFT
+ addr >>= Granule64KiB::SHIFT
+
+ self.__output_addr = addr
+ end

@ -84,7 +84,7 @@ class Stage1TableDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def next_level_table_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__next_level_table_addr = addr
end
@ -170,7 +170,7 @@ class Stage1PageDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def output_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__output_addr = addr
end

@ -84,7 +84,7 @@ class Stage1TableDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def next_level_table_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__next_level_table_addr = addr
end
@ -170,7 +170,7 @@ class Stage1PageDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def output_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__output_addr = addr
end

@ -84,7 +84,7 @@ class Stage1TableDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def next_level_table_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__next_level_table_addr = addr
end
@ -170,7 +170,7 @@ class Stage1PageDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def output_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__output_addr = addr
end

@ -84,7 +84,7 @@ class Stage1TableDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def next_level_table_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__next_level_table_addr = addr
end
@ -170,7 +170,7 @@ class Stage1PageDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def output_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__output_addr = addr
end

@ -84,7 +84,7 @@ class Stage1TableDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def next_level_table_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__next_level_table_addr = addr
end
@ -170,7 +170,7 @@ class Stage1PageDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def output_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__output_addr = addr
end

@ -84,7 +84,7 @@ class Stage1TableDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def next_level_table_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__next_level_table_addr = addr
end
@ -170,7 +170,7 @@ class Stage1PageDescriptor < BitField
attr_bitfield(:valid, Valid::OFFSET, Valid::NUMBITS)
def output_addr=(addr)
addr = addr >> Granule64KiB::SHIFT
addr >>= Granule64KiB::SHIFT
self.__output_addr = addr
end

@ -48,8 +48,8 @@ _带上我最诚挚的问候,<br>Andre ([@andre-richter])_
### 🚀 tl;dr 版本
1. [安装 Docker][install_docker]。
2. 确保你的用户在 [docker group] 中。
3. 安装正确的`Rust`工具链:
2. **(仅限Linux)** 确保您的用户帐户在 [docker group] 中。
3. 准备Rust工具链。其中大部分将在首次使用时通过[rust-toolchain.toml](rust-toolchain.toml)文件进行处理。我们要做的是:
1. 如果你已经安装了一个版本的Rust:
```bash
cargo install cargo-binutils rustfilt
@ -63,12 +63,17 @@ _带上我最诚挚的问候,<br>Andre ([@andre-richter])_
cargo install cargo-binutils rustfilt
```
1. 如果你使用 `Visual Studio Code`,我强烈推荐你安装[Rust Analyzer 扩展]。
1. 如果你使用的**不是**Linux那么你还需要安装一些`Ruby` gems。
4. 如果你使用 `Visual Studio Code`,我强烈推荐你安装[Rust Analyzer 扩展]。
5. **(仅限macOS)** 安装一些`Ruby` gems。
这是作者最后一次在`macOS Monterey`上用`Ruby 3.0.2`版本进行测试。如果您正在使用`rbenv`,那么相应的`.ruby-version`文件已经就位。
如果你从未听说过`rbenv`,请尝试使用[这个指南](https://stackoverflow.com/a/68118750)。
在存储库根文件夹中运行此操作:
```bash
sudo gem install bundler
bundle config set path '.vendor/bundle'
bundle config set --local path '.vendor/bundle'
bundle config set --local without 'development'
bundle install
```
@ -78,9 +83,10 @@ bundle install
## 🧰 长期版本: 消除工具链烦恼
这个系列的教程会着重关注用户体验的友好性。因此,我尽量消除嵌入式开发中的最大痛点:工具链的问题
这个系列的教程会着重关注用户体验的友好性。因此,我尽量消除嵌入式开发中的最大痛点:`Toolchain hassle`
Rust内置的交叉编译支持在这方面帮了我们大忙。我们只需要使用`rustup`安装目标工具链就可以在`x86`宿主机上交叉编译支持树莓派的目标文件。然而除了Rust编译器我们还需要更多的工具。例如
Rust本身在这方面已经起到了很大的作用因为它内置了对交叉编译的支持。从`x86`宿主机到树莓派的`AArch64`架构的交叉编译所需的一切都将由`rustup`自动安装。然而除了Rust编译器我们还将使用更多的工具。例如
- 用于在我们的宿主系统上模拟我们内核运行环境的`QEMU`。
- 一个叫`Minipush`的自制工具,可以通过`UART`将内核加载到树莓派上。
@ -96,14 +102,18 @@ Rust内置的交叉编译支持在这方面帮了我们大忙。我们只需要
由于教程中开发的内核是在真实的硬件上运行的,因此强烈建议您使用 USB 串行调试线来进行试验。连接调试线后,树莓派需要通过额外电源供电。
- 淘宝搜索"USB 转串口"
- 如下图连接 GPIO 串口的 14/15 号引脚
- [第六章](06_drivers_gpio_uart) 是这个设备第一次需要使用的地方。找到如何准备 SD 卡来引导你自制的内核的说明。
- [第七章](07_uart_chainloader)开始,在树莓派上启动内核变得非常舒适。在这章,会开发出一个叫`chainloader`的文件
这将是您暂时需要在 SD 卡上手动复制的最后一个文件。这将使您能够在通过 UART 按需引导期间加载教程内核。
- 您可以在[\[1\]] [\[2\]]中或者[淘宝]上找到USB转串口线但许多其他线材也可以工作。理想情况下您的线材应基于`CP2102`芯片。
- 您将其连接到`GND`和GPIO引脚`14/15`,如下所示。
- [教程5](05_drivers_gpio_uart/README.CN.md)是这个设备第一次需要使用的地方。查看它了解如何准备SD卡以从中启动自制内核的说明。
- 从[教程6](06_uart_chainloader/README.CN.md)开始,在树莓派上启动内核变得非常舒适。在本教程中开发了一个所谓的`chainloader`
这将是您暂时需要在SD卡上手动复制的最后一个文件。这将使您能够在通过`UART`按需引导期间加载教程内核。
![UART wiring diagram](doc/wiring.png)
[\[1\]]: https://www.amazon.de/dp/B0757FQ5CX/ref=cm_sw_r_tw_dp_U_x_ozGRDbVTJAG4Q
[\[2\]]: https://www.adafruit.com/product/954
[淘宝]: https://www.taobao.com/
## 🙌 致谢
这个教程最初是由[Zoltan Baldaszti](https://github.com/bztsrc)的[项目](https://github.com/bztsrc/raspi3-tutorial)衍生出来的,感谢它给我开了一个头。

Loading…
Cancel
Save