From 841b9deea336b45ed5255cb541b6f505f94aede4 Mon Sep 17 00:00:00 2001 From: woodyZootopia Date: Sat, 15 May 2021 22:52:11 +0900 Subject: [PATCH 01/28] Add the translation file and translated a bit --- .../09-paging-implementation/index.ja.md | 1005 +++++++++++++++++ 1 file changed, 1005 insertions(+) create mode 100644 blog/content/edition-2/posts/09-paging-implementation/index.ja.md diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md new file mode 100644 index 00000000..73925812 --- /dev/null +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -0,0 +1,1005 @@ ++++ +title = "ページングの実装" +weight = 9 +path = "ja/paging-implementation" +date = 2019-03-14 + +[extra] +chapter = "Memory Management" +translation_based_on_commit = "bf4f88107966c7ab1327c3cdc0ebfbd76bad5c5f" +translators = ["woodyZootopia"] ++++ + +この記事では私達のカーネルをページングに対応させる方法についてお伝えします。まず物理ページテーブルのフレームにカーネルがアクセスできるようにする様々な方法を示し、それらの利点と欠点について議論します。次にアドレス変換関数を、ついで新しいマッピングを作るための関数を実装します。 + + + +このブログの内容は [GitHub] 上で公開・開発されています。何か問題や質問などがあれば issue をたててください (訳注: リンクは原文(英語)のものになります)。また[こちら][at the bottom]にコメントを残すこともできます。この記事の完全なソースコードは[`post-09` ブランチ][post branch]にあります。 + +[GitHub]: https://github.com/phil-opp/blog_os +[at the bottom]: #comments +[post branch]: https://github.com/phil-opp/blog_os/tree/post-09 + + + +## 導入 + +[1つ前の記事][previous post]ではページングの概念を説明しました。セグメンテーションと比較することによってページングのメリットを示し、ページングとページテーブルの仕組みを説明し、そして`x86_64`における4層ページテーブルの設計を導入しました。ブートローダはすでにページテーブルの階層構造を設定してしまっているので、私達のカーネルは既に仮想アドレス上で動いているということを学びました。これにより、不正なメモリアクセスは、任意の物理メモリを書き換えてしまう代わりにページフォルト例外を発生させるので、安全性が向上しています。 + +[previous post]: @/edition-2/posts/08-paging-introduction/index.ja.md + +記事の最後で、[ページテーブルにカーネルからアクセスできない][end of previous post]という問題が起きていました。この問題は、ページテーブルは物理メモリ内に格納されている一方、私達のカーネルは既に仮想アドレス上で実行されているために発生します。この記事ではその続きとして、私達のカーネルからページテーブルのフレームにアクセスするための様々な方法を探ります。それぞれの方法の利点と欠点を議論し、カーネルに採用する手法を決めます。 + +[end of previous post]: @/edition-2/posts/08-paging-introduction/index.md#accessing-the-page-tables + +To implement the approach, we will need support from the bootloader, so we'll configure it first. Afterward, we will implement a function that traverses the page table hierarchy in order to translate virtual to physical addresses. Finally, we learn how to create new mappings in the page tables and how to find unused memory frames for creating new page tables. + +## Accessing Page Tables + +Accessing the page tables from our kernel is not as easy as it may seem. To understand the problem let's take a look at the example 4-level page table hierarchy of the previous post again: + +![An example 4-level page hierarchy with each page table shown in physical memory](../paging-introduction/x86_64-page-table-translation.svg) + +The important thing here is that each page entry stores the _physical_ address of the next table. This avoids the need to run a translation for these addresses too, which would be bad for performance and could easily cause endless translation loops. + +The problem for us is that we can't directly access physical addresses from our kernel since our kernel also runs on top of virtual addresses. For example, when we access address `4 KiB` we access the _virtual_ address `4 KiB`, not the _physical_ address `4 KiB` where the level 4 page table is stored. When we want to access the physical address `4 KiB`, we can only do so through some virtual address that maps to it. + +So in order to access page table frames, we need to map some virtual pages to them. There are different ways to create these mappings that all allow us to access arbitrary page table frames. + +### Identity Mapping + +A simple solution is to **identity map all page tables**: + +![A virtual and a physical address space with various virtual pages mapped to the physical frame with the same address](identity-mapped-page-tables.svg) + +In this example, we see various identity-mapped page table frames. This way the physical addresses of page tables are also valid virtual addresses so that we can easily access the page tables of all levels starting from the CR3 register. + +However, it clutters the virtual address space and makes it more difficult to find continuous memory regions of larger sizes. For example, imagine that we want to create a virtual memory region of size 1000 KiB in the above graphic, e.g. for [memory-mapping a file]. We can't start the region at `28 KiB` because it would collide with the already mapped page at `1004 KiB`. So we have to look further until we find a large enough unmapped area, for example at `1008 KiB`. This is a similar fragmentation problem as with [segmentation]. + +[memory-mapping a file]: https://en.wikipedia.org/wiki/Memory-mapped_file +[segmentation]: @/edition-2/posts/08-paging-introduction/index.md#fragmentation + +Equally, it makes it much more difficult to create new page tables, because we need to find physical frames whose corresponding pages aren't already in use. For example, let's assume that we reserved the _virtual_ 1000 KiB memory region starting at `1008 KiB` for our memory-mapped file. Now we can't use any frame with a _physical_ address between `1000 KiB` and `2008 KiB` anymore, because we can't identity map it. + +### Map at a Fixed Offset + +To avoid the problem of cluttering the virtual address space, we can **use a separate memory region for page table mappings**. So instead of identity mapping page table frames, we map them at a fixed offset in the virtual address space. For example, the offset could be 10 TiB: + +![The same figure as for the identity mapping, but each mapped virtual page is offset by 10 TiB.](page-tables-mapped-at-offset.svg) + +By using the virtual memory in the range `10TiB..(10TiB + physical memory size)` exclusively for page table mappings, we avoid the collision problems of the identity mapping. Reserving such a large region of the virtual address space is only possible if the virtual address space is much larger than the physical memory size. This isn't a problem on x86_64 since the 48-bit address space is 256 TiB large. + +This approach still has the disadvantage that we need to create a new mapping whenever we create a new page table. Also, it does not allow accessing page tables of other address spaces, which would be useful when creating a new process. + +### Map the Complete Physical Memory + +We can solve these problems by **mapping the complete physical memory** instead of only page table frames: + +![The same figure as for the offset mapping, but every physical frame has a mapping (at 10TiB + X) instead of only page table frames.](map-complete-physical-memory.svg) + +This approach allows our kernel to access arbitrary physical memory, including page table frames of other address spaces. The reserved virtual memory range has the same size as before, with the difference that it no longer contains unmapped pages. + +The disadvantage of this approach is that additional page tables are needed for storing the mapping of the physical memory. These page tables need to be stored somewhere, so they use up a part of physical memory, which can be a problem on devices with a small amount of memory. + +On x86_64, however, we can use [huge pages] with size 2MiB for the mapping, instead of the default 4KiB pages. This way, mapping 32 GiB of physical memory only requires 132 KiB for page tables since only one level 3 table and 32 level 2 tables are needed. Huge pages are also more cache efficient since they use fewer entries in the translation lookaside buffer (TLB). + +[huge pages]: https://en.wikipedia.org/wiki/Page_%28computer_memory%29#Multiple_page_sizes + +### Temporary Mapping + +For devices with very small amounts of physical memory, we could **map the page tables frames only temporarily** when we need to access them. To be able to create the temporary mappings we only need a single identity-mapped level 1 table: + +![A virtual and a physical address space with an identity mapped level 1 table, which maps its 0th entry to the level 2 table frame, thereby mapping that frame to page with address 0](temporarily-mapped-page-tables.svg) + +The level 1 table in this graphic controls the first 2 MiB of the virtual address space. This is because it is reachable by starting at the CR3 register and following the 0th entry in the level 4, level 3, and level 2 page tables. The entry with index `8` maps the virtual page at address `32 KiB` to the physical frame at address `32 KiB`, thereby identity mapping the level 1 table itself. The graphic shows this identity-mapping by the horizontal arrow at `32 KiB`. + +By writing to the identity-mapped level 1 table, our kernel can create up to 511 temporary mappings (512 minus the entry required for the identity mapping). In the above example, the kernel created two temporary mappings: + +- By mapping the 0th entry of the level 1 table to the frame with address `24 KiB`, it created a temporary mapping of the virtual page at `0 KiB` to the physical frame of the level 2 page table, indicated by the dashed arrow. +- By mapping the 9th entry of the level 1 table to the frame with address `4 KiB`, it created a temporary mapping of the virtual page at `36 KiB` to the physical frame of the level 4 page table, indicated by the dashed arrow. + +Now the kernel can access the level 2 page table by writing to page `0 KiB` and the level 4 page table by writing to page `36 KiB`. + +The process for accessing an arbitrary page table frame with temporary mappings would be: + +- Search for a free entry in the identity-mapped level 1 table. +- Map that entry to the physical frame of the page table that we want to access. +- Access the target frame through the virtual page that maps to the entry. +- Set the entry back to unused thereby removing the temporary mapping again. + +This approach reuses the same 512 virtual pages for creating the mappings and thus requires only 4KiB of physical memory. The drawback is that it is a bit cumbersome, especially since a new mapping might require modifications of multiple table levels, which means that we would need to repeat the above process multiple times. + +### Recursive Page Tables + +Another interesting approach, that requires no additional page tables at all, is to **map the page table recursively**. The idea behind this approach is to map some entry of the level 4 page table to the level 4 table itself. By doing this, we effectively reserve a part of the virtual address space and map all current and future page table frames to that space. + +Let's go through an example to understand how this all works: + +![An example 4-level page hierarchy with each page table shown in physical memory. Entry 511 of the level 4 page is mapped to frame 4KiB, the frame of the level 4 table itself.](recursive-page-table.png) + +The only difference to the [example at the beginning of this post] is the additional entry at index `511` in the level 4 table, which is mapped to physical frame `4 KiB`, the frame of the level 4 table itself. + +[example at the beginning of this post]: #accessing-page-tables + +By letting the CPU follow this entry on a translation, it doesn't reach a level 3 table, but the same level 4 table again. This is similar to a recursive function that calls itself, therefore this table is called a _recursive page table_. The important thing is that the CPU assumes that every entry in the level 4 table points to a level 3 table, so it now treats the level 4 table as a level 3 table. This works because tables of all levels have the exact same layout on x86_64. + +By following the recursive entry one or multiple times before we start the actual translation, we can effectively shorten the number of levels that the CPU traverses. For example, if we follow the recursive entry once and then proceed to the level 3 table, the CPU thinks that the level 3 table is a level 2 table. Going further, it treats the level 2 table as a level 1 table and the level 1 table as the mapped frame. This means that we can now read and write the level 1 page table because the CPU thinks that it is the mapped frame. The graphic below illustrates the 5 translation steps: + +![The above example 4-level page hierarchy with 5 arrows: "Step 0" from CR4 to level 4 table, "Step 1" from level 4 table to level 4 table, "Step 2" from level 4 table to level 3 table, "Step 3" from level 3 table to level 2 table, and "Step 4" from level 2 table to level 1 table.](recursive-page-table-access-level-1.png) + +Similarly, we can follow the recursive entry twice before starting the translation to reduce the number of traversed levels to two: + +![The same 4-level page hierarchy with the following 4 arrows: "Step 0" from CR4 to level 4 table, "Steps 1&2" from level 4 table to level 4 table, "Step 3" from level 4 table to level 3 table, and "Step 4" from level 3 table to level 2 table.](recursive-page-table-access-level-2.png) + +Let's go through it step by step: First, the CPU follows the recursive entry on the level 4 table and thinks that it reaches a level 3 table. Then it follows the recursive entry again and thinks that it reaches a level 2 table. But in reality, it is still on the level 4 table. When the CPU now follows a different entry, it lands on a level 3 table but thinks it is already on a level 1 table. So while the next entry points at a level 2 table, the CPU thinks that it points to the mapped frame, which allows us to read and write the level 2 table. + +Accessing the tables of levels 3 and 4 works in the same way. For accessing the level 3 table, we follow the recursive entry three times, tricking the CPU into thinking it is already on a level 1 table. Then we follow another entry and reach a level 3 table, which the CPU treats as a mapped frame. For accessing the level 4 table itself, we just follow the recursive entry four times until the CPU treats the level 4 table itself as the mapped frame (in blue in the graphic below). + +![The same 4-level page hierarchy with the following 3 arrows: "Step 0" from CR4 to level 4 table, "Steps 1,2,3" from level 4 table to level 4 table, and "Step 4" from level 4 table to level 3 table. In blue the alternative "Steps 1,2,3,4" arrow from level 4 table to level 4 table.](recursive-page-table-access-level-3.png) + +It might take some time to wrap your head around the concept, but it works quite well in practice. + +In the section below we explain how to construct virtual addresses for following the recursive entry one or multiple times. We will not use recursive paging for our implementation, so you don't need to read it to continue with the post. If it interests you, just click on _"Address Calculation"_ to expand it. + +--- + +
+

Address Calculation

+ +We saw that we can access tables of all levels by following the recursive entry once or multiple times before the actual translation. Since the indexes into the tables of the four levels are derived directly from the virtual address, we need to construct special virtual addresses for this technique. Remember, the page table indexes are derived from the address in the following way: + +![Bits 0–12 are the page offset, bits 12–21 the level 1 index, bits 21–30 the level 2 index, bits 30–39 the level 3 index, and bits 39–48 the level 4 index](../paging-introduction/x86_64-table-indices-from-address.svg) + +Let's assume that we want to access the level 1 page table that maps a specific page. As we learned above, this means that we have to follow the recursive entry one time before continuing with the level 4, level 3, and level 2 indexes. To do that we move each block of the address one block to the right and set the original level 4 index to the index of the recursive entry: + +![Bits 0–12 are the offset into the level 1 table frame, bits 12–21 the level 2 index, bits 21–30 the level 3 index, bits 30–39 the level 4 index, and bits 39–48 the index of the recursive entry](table-indices-from-address-recursive-level-1.svg) + +For accessing the level 2 table of that page, we move each index block two blocks to the right and set both the blocks of the original level 4 index and the original level 3 index to the index of the recursive entry: + +![Bits 0–12 are the offset into the level 2 table frame, bits 12–21 the level 3 index, bits 21–30 the level 4 index, and bits 30–39 and bits 39–48 are the index of the recursive entry](table-indices-from-address-recursive-level-2.svg) + +Accessing the level 3 table works by moving each block three blocks to the right and using the recursive index for the original level 4, level 3, and level 2 address blocks: + +![Bits 0–12 are the offset into the level 3 table frame, bits 12–21 the level 4 index, and bits 21–30, bits 30–39 and bits 39–48 are the index of the recursive entry](table-indices-from-address-recursive-level-3.svg) + +Finally, we can access the level 4 table by moving each block four blocks to the right and using the recursive index for all address blocks except for the offset: + +![Bits 0–12 are the offset into the level l table frame and bits 12–21, bits 21–30, bits 30–39 and bits 39–48 are the index of the recursive entry](table-indices-from-address-recursive-level-4.svg) + +We can now calculate virtual addresses for the page tables of all four levels. We can even calculate an address that points exactly to a specific page table entry by multiplying its index by 8, the size of a page table entry. + +The table below summarizes the address structure for accessing the different kinds of frames: + +Virtual Address for | Address Structure ([octal]) +------------------- | ------------------------------- +Page | `0o_SSSSSS_AAA_BBB_CCC_DDD_EEEE` +Level 1 Table Entry | `0o_SSSSSS_RRR_AAA_BBB_CCC_DDDD` +Level 2 Table Entry | `0o_SSSSSS_RRR_RRR_AAA_BBB_CCCC` +Level 3 Table Entry | `0o_SSSSSS_RRR_RRR_RRR_AAA_BBBB` +Level 4 Table Entry | `0o_SSSSSS_RRR_RRR_RRR_RRR_AAAA` + +[octal]: https://en.wikipedia.org/wiki/Octal + +Whereas `AAA` is the level 4 index, `BBB` the level 3 index, `CCC` the level 2 index, and `DDD` the level 1 index of the mapped frame, and `EEEE` the offset into it. `RRR` is the index of the recursive entry. When an index (three digits) is transformed to an offset (four digits), it is done by multiplying it by 8 (the size of a page table entry). With this offset, the resulting address directly points to the respective page table entry. + +`SSSSSS` are sign extension bits, which means that they are all copies of bit 47. This is a special requirement for valid addresses on the x86_64 architecture. We explained it in the [previous post][sign extension]. + +[sign extension]: @/edition-2/posts/08-paging-introduction/index.md#paging-on-x86-64 + +We use [octal] numbers for representing the addresses since each octal character represents three bits, which allows us to clearly separate the 9-bit indexes of the different page table levels. This isn't possible with the hexadecimal system where each character represents four bits. + +##### In Rust Code + +To construct such addresses in Rust code, you can use bitwise operations: + +```rust +// the virtual address whose corresponding page tables you want to access +let addr: usize = […]; + +let r = 0o777; // recursive index +let sign = 0o177777 << 48; // sign extension + +// retrieve the page table indices of the address that we want to translate +let l4_idx = (addr >> 39) & 0o777; // level 4 index +let l3_idx = (addr >> 30) & 0o777; // level 3 index +let l2_idx = (addr >> 21) & 0o777; // level 2 index +let l1_idx = (addr >> 12) & 0o777; // level 1 index +let page_offset = addr & 0o7777; + +// calculate the table addresses +let level_4_table_addr = + sign | (r << 39) | (r << 30) | (r << 21) | (r << 12); +let level_3_table_addr = + sign | (r << 39) | (r << 30) | (r << 21) | (l4_idx << 12); +let level_2_table_addr = + sign | (r << 39) | (r << 30) | (l4_idx << 21) | (l3_idx << 12); +let level_1_table_addr = + sign | (r << 39) | (l4_idx << 30) | (l3_idx << 21) | (l2_idx << 12); +``` + +The above code assumes that the last level 4 entry with index `0o777` (511) is recursively mapped. This isn't the case currently, so the code won't work yet. See below on how to tell the bootloader to set up the recursive mapping. + +Alternatively to performing the bitwise operations by hand, you can use the [`RecursivePageTable`] type of the `x86_64` crate, which provides safe abstractions for various page table operations. For example, the code below shows how to translate a virtual address to its mapped physical address: + +[`RecursivePageTable`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html + +```rust +// in src/memory.rs + +use x86_64::structures::paging::{Mapper, Page, PageTable, RecursivePageTable}; +use x86_64::{VirtAddr, PhysAddr}; + +/// Creates a RecursivePageTable instance from the level 4 address. +let level_4_table_addr = […]; +let level_4_table_ptr = level_4_table_addr as *mut PageTable; +let recursive_page_table = unsafe { + let level_4_table = &mut *level_4_table_ptr; + RecursivePageTable::new(level_4_table).unwrap(); +} + + +/// Retrieve the physical address for the given virtual address +let addr: u64 = […] +let addr = VirtAddr::new(addr); +let page: Page = Page::containing_address(addr); + +// perform the translation +let frame = recursive_page_table.translate_page(page); +frame.map(|frame| frame.start_address() + u64::from(addr.page_offset())) +``` + +Again, a valid recursive mapping is required for this code. With such a mapping, the missing `level_4_table_addr` can be calculated as in the first code example. + +
+ +--- + +Recursive Paging is an interesting technique that shows how powerful a single mapping in a page table can be. It is relatively easy to implement and only requires a minimal amount of setup (just a single recursive entry), so it's a good choice for first experiments with paging. + +However, it also has some disadvantages: + +- It occupies a large amount of virtual memory (512GiB). This isn't a big problem in the large 48-bit address space, but it might lead to suboptimal cache behavior. +- It only allows accessing the currently active address space easily. Accessing other address spaces is still possible by changing the recursive entry, but a temporary mapping is required for switching back. We described how to do this in the (outdated) [_Remap The Kernel_] post. +- It heavily relies on the page table format of x86 and might not work on other architectures. + +[_Remap The Kernel_]: https://os.phil-opp.com/remap-the-kernel/#overview + +## Bootloader Support + +All of these approaches require page table modifications for their setup. For example, mappings for the physical memory need to be created or an entry of the level 4 table needs to be mapped recursively. The problem is that we can't create these required mappings without an existing way to access the page tables. + +This means that we need the help of the bootloader, which creates the page tables that our kernel runs on. The bootloader has access to the page tables, so it can create any mappings that we need. In its current implementation, the `bootloader` crate has support for two of the above approaches, controlled through [cargo features]: + +[cargo features]: https://doc.rust-lang.org/cargo/reference/features.html#the-features-section + +- The `map_physical_memory` feature maps the complete physical memory somewhere into the virtual address space. Thus, the kernel can access all physical memory and can follow the [_Map the Complete Physical Memory_](#map-the-complete-physical-memory) approach. +- With the `recursive_page_table` feature, the bootloader maps an entry of the level 4 page table recursively. This allows the kernel to access the page tables as described in the [_Recursive Page Tables_](#recursive-page-tables) section. + +We choose the first approach for our kernel since it is simple, platform-independent, and more powerful (it also allows access to non-page-table-frames). To enable the required bootloader support, we add the `map_physical_memory` feature to our `bootloader` dependency: + +```toml +[dependencies] +bootloader = { version = "0.9.8", features = ["map_physical_memory"]} +``` + +With this feature enabled, the bootloader maps the complete physical memory to some unused virtual address range. To communicate the virtual address range to our kernel, the bootloader passes a _boot information_ structure. + +### Boot Information + +The `bootloader` crate defines a [`BootInfo`] struct that contains all the information it passes to our kernel. The struct is still in an early stage, so expect some breakage when updating to future [semver-incompatible] bootloader versions. With the `map_physical_memory` feature enabled, it currently has the two fields `memory_map` and `physical_memory_offset`: + +[`BootInfo`]: https://docs.rs/bootloader/0.9.3/bootloader/bootinfo/struct.BootInfo.html +[semver-incompatible]: https://doc.rust-lang.org/stable/cargo/reference/specifying-dependencies.html#caret-requirements + +- The `memory_map` field contains an overview of the available physical memory. This tells our kernel how much physical memory is available in the system and which memory regions are reserved for devices such as the VGA hardware. The memory map can be queried from the BIOS or UEFI firmware, but only very early in the boot process. For this reason, it must be provided by the bootloader because there is no way for the kernel to retrieve it later. We will need the memory map later in this post. +- The `physical_memory_offset` tells us the virtual start address of the physical memory mapping. By adding this offset to a physical address, we get the corresponding virtual address. This allows us to access arbitrary physical memory from our kernel. + +The bootloader passes the `BootInfo` struct to our kernel in the form of a `&'static BootInfo` argument to our `_start` function. We don't have this argument declared in our function yet, so let's add it: + +```rust +// in src/main.rs + +use bootloader::BootInfo; + +#[no_mangle] +pub extern "C" fn _start(boot_info: &'static BootInfo) -> ! { // new argument + […] +} +``` + +It wasn't a problem to leave off this argument before because the x86_64 calling convention passes the first argument in a CPU register. Thus, the argument is simply ignored when it isn't declared. However, it would be a problem if we accidentally used a wrong argument type, since the compiler doesn't know the correct type signature of our entry point function. + +### The `entry_point` Macro + +Since our `_start` function is called externally from the bootloader, no checking of our function signature occurs. This means that we could let it take arbitrary arguments without any compilation errors, but it would fail or cause undefined behavior at runtime. + +To make sure that the entry point function has always the correct signature that the bootloader expects, the `bootloader` crate provides an [`entry_point`] macro that provides a type-checked way to define a Rust function as the entry point. Let's rewrite our entry point function to use this macro: + +[`entry_point`]: https://docs.rs/bootloader/0.6.4/bootloader/macro.entry_point.html + +```rust +// in src/main.rs + +use bootloader::{BootInfo, entry_point}; + +entry_point!(kernel_main); + +fn kernel_main(boot_info: &'static BootInfo) -> ! { + […] +} +``` + +We no longer need to use `extern "C"` or `no_mangle` for our entry point, as the macro defines the real lower level `_start` entry point for us. The `kernel_main` function is now a completely normal Rust function, so we can choose an arbitrary name for it. The important thing is that it is type-checked so that a compilation error occurs when we use a wrong function signature, for example by adding an argument or changing the argument type. + +Let's perform the same change in our `lib.rs`: + +```rust +// in src/lib.rs + +#[cfg(test)] +use bootloader::{entry_point, BootInfo}; + +#[cfg(test)] +entry_point!(test_kernel_main); + +/// Entry point for `cargo test` +#[cfg(test)] +fn test_kernel_main(_boot_info: &'static BootInfo) -> ! { + // like before + init(); + test_main(); + hlt_loop(); +} +``` + +Since the entry point is only used in test mode, we add the `#[cfg(test)]` attribute to all items. We give our test entry point the distinct name `test_kernel_main` to avoid confusion with the `kernel_main` of our `main.rs`. We don't use the `BootInfo` parameter for now, so we prefix the parameter name with a `_` to silence the unused variable warning. + +## Implementation + +Now that we have access to physical memory, we can finally start to implement our page table code. First, we will take a look at the currently active page tables that our kernel runs on. In the second step, we will create a translation function that returns the physical address that a given virtual address is mapped to. As the last step, we will try to modify the page tables in order to create a new mapping. + +Before we begin, we create a new `memory` module for our code: + +```rust +// in src/lib.rs + +pub mod memory; +``` + +For the module we create an empty `src/memory.rs` file. + +### Accessing the Page Tables + +At the [end of the previous post], we tried to take a look at the page tables our kernel runs on, but failed since we couldn't access the physical frame that the `CR3` register points to. We're now able to continue from there by creating an `active_level_4_table` function that returns a reference to the active level 4 page table: + +[end of the previous post]: @/edition-2/posts/08-paging-introduction/index.md#accessing-the-page-tables + +```rust +// in src/memory.rs + +use x86_64::{ + structures::paging::PageTable, + VirtAddr, +}; + +/// Returns a mutable reference to the active level 4 table. +/// +/// This function is unsafe because the caller must guarantee that the +/// complete physical memory is mapped to virtual memory at the passed +/// `physical_memory_offset`. Also, this function must be only called once +/// to avoid aliasing `&mut` references (which is undefined behavior). +pub unsafe fn active_level_4_table(physical_memory_offset: VirtAddr) + -> &'static mut PageTable +{ + use x86_64::registers::control::Cr3; + + let (level_4_table_frame, _) = Cr3::read(); + + let phys = level_4_table_frame.start_address(); + let virt = physical_memory_offset + phys.as_u64(); + let page_table_ptr: *mut PageTable = virt.as_mut_ptr(); + + &mut *page_table_ptr // unsafe +} +``` + +First, we read the physical frame of the active level 4 table from the `CR3` register. We then take its physical start address, convert it to an `u64`, and add it to `physical_memory_offset` to get the virtual address where the page table frame is mapped. Finally, we convert the virtual address to a `*mut PageTable` raw pointer through the `as_mut_ptr` method and then unsafely create a `&mut PageTable` reference from it. We create a `&mut` reference instead of a `&` reference because we will mutate the page tables later in this post. + +We don't need to use an unsafe block here because Rust treats the complete body of an `unsafe fn` like a large `unsafe` block. This makes our code more dangerous since we could accidentally introduce an unsafe operation in previous lines without noticing. It also makes it much more difficult to spot the unsafe operations. There is an [RFC](https://github.com/rust-lang/rfcs/pull/2585) to change this behavior. + +We can now use this function to print the entries of the level 4 table: + +```rust +// in src/main.rs + +fn kernel_main(boot_info: &'static BootInfo) -> ! { + use blog_os::memory::active_level_4_table; + use x86_64::VirtAddr; + + println!("Hello World{}", "!"); + blog_os::init(); + + let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset); + let l4_table = unsafe { active_level_4_table(phys_mem_offset) }; + + for (i, entry) in l4_table.iter().enumerate() { + if !entry.is_unused() { + println!("L4 Entry {}: {:?}", i, entry); + } + } + + // as before + #[cfg(test)] + test_main(); + + println!("It did not crash!"); + blog_os::hlt_loop(); +} +``` + +First, we convert the `physical_memory_offset` of the `BootInfo` struct to a [`VirtAddr`] and pass it to the `active_level_4_table` function. We then use the `iter` function to iterate over the page table entries and the [`enumerate`] combinator to additionally add an index `i` to each element. We only print non-empty entries because all 512 entries wouldn't fit on the screen. + +[`VirtAddr`]: https://docs.rs/x86_64/0.13.2/x86_64/addr/struct.VirtAddr.html +[`enumerate`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.enumerate + +When we run it, we see the following output: + +![QEMU printing entry 0 (0x2000, PRESENT, WRITABLE, ACCESSED), entry 1 (0x894000, PRESENT, WRITABLE, ACCESSED, DIRTY), entry 31 (0x88e000, PRESENT, WRITABLE, ACCESSED, DIRTY), entry 175 (0x891000, PRESENT, WRITABLE, ACCESSED, DIRTY), and entry 504 (0x897000, PRESENT, WRITABLE, ACCESSED, DIRTY)](qemu-print-level-4-table.png) + +We see that there are various non-empty entries, which all map to different level 3 tables. There are so many regions because kernel code, kernel stack, the physical memory mapping, and the boot information all use separate memory areas. + +To traverse the page tables further and take a look at a level 3 table, we can take the mapped frame of an entry convert it to a virtual address again: + +```rust +// in the `for` loop in src/main.rs + +use x86_64::structures::paging::PageTable; + +if !entry.is_unused() { + println!("L4 Entry {}: {:?}", i, entry); + + // get the physical address from the entry and convert it + let phys = entry.frame().unwrap().start_address(); + let virt = phys.as_u64() + boot_info.physical_memory_offset; + let ptr = VirtAddr::new(virt).as_mut_ptr(); + let l3_table: &PageTable = unsafe { &*ptr }; + + // print non-empty entries of the level 3 table + for (i, entry) in l3_table.iter().enumerate() { + if !entry.is_unused() { + println!(" L3 Entry {}: {:?}", i, entry); + } + } +} +``` + +For looking at the level 2 and level 1 tables, we repeat that process for the level 3 and level 2 entries. As you can imagine, this gets very verbose quickly, so we don't show the full code here. + +Traversing the page tables manually is interesting because it helps to understand how the CPU performs the translation. However, most of the time we are only interested in the mapped physical address for a given virtual address, so let's create a function for that. + +### Translating Addresses + +For translating a virtual to a physical address, we have to traverse the four-level page table until we reach the mapped frame. Let's create a function that performs this translation: + +```rust +// in src/memory.rs + +use x86_64::PhysAddr; + +/// Translates the given virtual address to the mapped physical address, or +/// `None` if the address is not mapped. +/// +/// This function is unsafe because the caller must guarantee that the +/// complete physical memory is mapped to virtual memory at the passed +/// `physical_memory_offset`. +pub unsafe fn translate_addr(addr: VirtAddr, physical_memory_offset: VirtAddr) + -> Option +{ + translate_addr_inner(addr, physical_memory_offset) +} +``` + +We forward the function to a safe `translate_addr_inner` function to limit the scope of `unsafe`. As we noted above, Rust treats the complete body of an unsafe fn like a large unsafe block. By calling into a private safe function, we make each `unsafe` operation explicit again. + +The private inner function contains the real implementation: + +```rust +// in src/memory.rs + +/// Private function that is called by `translate_addr`. +/// +/// This function is safe to limit the scope of `unsafe` because Rust treats +/// the whole body of unsafe functions as an unsafe block. This function must +/// only be reachable through `unsafe fn` from outside of this module. +fn translate_addr_inner(addr: VirtAddr, physical_memory_offset: VirtAddr) + -> Option +{ + use x86_64::structures::paging::page_table::FrameError; + use x86_64::registers::control::Cr3; + + // read the active level 4 frame from the CR3 register + let (level_4_table_frame, _) = Cr3::read(); + + let table_indexes = [ + addr.p4_index(), addr.p3_index(), addr.p2_index(), addr.p1_index() + ]; + let mut frame = level_4_table_frame; + + // traverse the multi-level page table + for &index in &table_indexes { + // convert the frame into a page table reference + let virt = physical_memory_offset + frame.start_address().as_u64(); + let table_ptr: *const PageTable = virt.as_ptr(); + let table = unsafe {&*table_ptr}; + + // read the page table entry and update `frame` + let entry = &table[index]; + frame = match entry.frame() { + Ok(frame) => frame, + Err(FrameError::FrameNotPresent) => return None, + Err(FrameError::HugeFrame) => panic!("huge pages not supported"), + }; + } + + // calculate the physical address by adding the page offset + Some(frame.start_address() + u64::from(addr.page_offset())) +} +``` + +Instead of reusing our `active_level_4_table` function, we read the level 4 frame from the `CR3` register again. We do this because it simplifies this prototype implementation. Don't worry, we will create a better solution in a moment. + +The `VirtAddr` struct already provides methods to compute the indexes into the page tables of the four levels. We store these indexes in a small array because it allows us to traverse the page tables using a `for` loop. Outside of the loop, we remember the last visited `frame` to calculate the physical address later. The `frame` points to page table frames while iterating, and to the mapped frame after the last iteration, i.e. after following the level 1 entry. + +Inside the loop, we again use the `physical_memory_offset` to convert the frame into a page table reference. We then read the entry of the current page table and use the [`PageTableEntry::frame`] function to retrieve the mapped frame. If the entry is not mapped to a frame we return `None`. If the entry maps a huge 2MiB or 1GiB page we panic for now. + +[`PageTableEntry::frame`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/page_table/struct.PageTableEntry.html#method.frame + +Let's test our translation function by translating some addresses: + +```rust +// in src/main.rs + +fn kernel_main(boot_info: &'static BootInfo) -> ! { + // new import + use blog_os::memory::translate_addr; + + […] // hello world and blog_os::init + + let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset); + + let addresses = [ + // the identity-mapped vga buffer page + 0xb8000, + // some code page + 0x201008, + // some stack page + 0x0100_0020_1a10, + // virtual address mapped to physical address 0 + boot_info.physical_memory_offset, + ]; + + for &address in &addresses { + let virt = VirtAddr::new(address); + let phys = unsafe { translate_addr(virt, phys_mem_offset) }; + println!("{:?} -> {:?}", virt, phys); + } + + […] // test_main(), "it did not crash" printing, and hlt_loop() +} +``` + +When we run it, we see the following output: + +![0xb8000 -> 0xb8000, 0x201008 -> 0x401008, 0x10000201a10 -> 0x279a10, "panicked at 'huge pages not supported'](qemu-translate-addr.png) + +As expected, the identity-mapped address `0xb8000` translates to the same physical address. The code page and the stack page translate to some arbitrary physical addresses, which depend on how the bootloader created the initial mapping for our kernel. It's worth noting that the last 12 bits always stay the same after translation, which makes sense because these bits are the [_page offset_] and not part of the translation. + +[_page offset_]: @/edition-2/posts/08-paging-introduction/index.md#paging-on-x86-64 + +Since each physical address can be accessed by adding the `physical_memory_offset`, the translation of the `physical_memory_offset` address itself should point to physical address `0`. However, the translation fails because the mapping uses huge pages for efficiency, which is not supported in our implementation yet. + +### Using `OffsetPageTable` + +Translating virtual to physical addresses is a common task in an OS kernel, therefore the `x86_64` crate provides an abstraction for it. The implementation already supports huge pages and several other page table functions apart from `translate_addr`, so we will use it in the following instead of adding huge page support to our own implementation. + +The base of the abstraction are two traits that define various page table mapping functions: + +- The [`Mapper`] trait is generic over the page size and provides functions that operate on pages. Examples are [`translate_page`], which translates a given page to a frame of the same size, and [`map_to`], which creates a new mapping in the page table. +- The [`Translate`] trait provides functions that work with multiple page sizes such as [`translate_addr`] or the general [`translate`]. + +[`Mapper`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Mapper.html +[`translate_page`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Mapper.html#tymethod.translate_page +[`map_to`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Mapper.html#method.map_to +[`Translate`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Translate.html +[`translate_addr`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Translate.html#method.translate_addr +[`translate`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Translate.html#tymethod.translate + +The traits only define the interface, they don't provide any implementation. The `x86_64` crate currently provides three types that implement the traits with different requirements. The [`OffsetPageTable`] type assumes that the complete physical memory is mapped to the virtual address space at some offset. The [`MappedPageTable`] is a bit more flexible: It only requires that each page table frame is mapped to the virtual address space at a calculable address. Finally, the [`RecursivePageTable`] type can be used to access page table frames through [recursive page tables](#recursive-page-tables). + +[`OffsetPageTable`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html +[`MappedPageTable`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.MappedPageTable.html +[`RecursivePageTable`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html + +In our case, the bootloader maps the complete physical memory at a virtual address specfied by the `physical_memory_offset` variable, so we can use the `OffsetPageTable` type. To initialize it, we create a new `init` function in our `memory` module: + +```rust +use x86_64::structures::paging::OffsetPageTable; + +/// Initialize a new OffsetPageTable. +/// +/// This function is unsafe because the caller must guarantee that the +/// complete physical memory is mapped to virtual memory at the passed +/// `physical_memory_offset`. Also, this function must be only called once +/// to avoid aliasing `&mut` references (which is undefined behavior). +pub unsafe fn init(physical_memory_offset: VirtAddr) -> OffsetPageTable<'static> { + let level_4_table = active_level_4_table(physical_memory_offset); + OffsetPageTable::new(level_4_table, physical_memory_offset) +} + +// make private +unsafe fn active_level_4_table(physical_memory_offset: VirtAddr) + -> &'static mut PageTable +{…} +``` + +The function takes the `physical_memory_offset` as an argument and returns a new `OffsetPageTable` instance with a `'static` lifetime. This means that the instance stays valid for the complete runtime of our kernel. In the function body, we first call the `active_level_4_table` function to retrieve a mutable reference to the level 4 page table. We then invoke the [`OffsetPageTable::new`] function with this reference. As the second parameter, the `new` function expects the virtual address at which the mapping of the physical memory starts, which is given in the `physical_memory_offset` variable. + +[`OffsetPageTable::new`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html#method.new + +The `active_level_4_table` function should be only called from the `init` function from now on because it can easily lead to aliased mutable references when called multiple times, which can cause undefined behavior. For this reason, we make the function private by removing the `pub` specifier. + +We now can use the `Translate::translate_addr` method instead of our own `memory::translate_addr` function. We only need to change a few lines in our `kernel_main`: + +```rust +// in src/main.rs + +fn kernel_main(boot_info: &'static BootInfo) -> ! { + // new: different imports + use blog_os::memory; + use x86_64::{structures::paging::Translate, VirtAddr}; + + […] // hello world and blog_os::init + + let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset); + // new: initialize a mapper + let mapper = unsafe { memory::init(phys_mem_offset) }; + + let addresses = […]; // same as before + + for &address in &addresses { + let virt = VirtAddr::new(address); + // new: use the `mapper.translate_addr` method + let phys = mapper.translate_addr(virt); + println!("{:?} -> {:?}", virt, phys); + } + + […] // test_main(), "it did not crash" printing, and hlt_loop() +} +``` + +We need to import the `Translate` trait in order to use the [`translate_addr`] method it provides. + +When we run it now, we see the same translation results as before, with the difference that the huge page translation now also works: + +![0xb8000 -> 0xb8000, 0x201008 -> 0x401008, 0x10000201a10 -> 0x279a10, 0x18000000000 -> 0x0](qemu-mapper-translate-addr.png) + +As expected, the translations of `0xb8000` and the code and stack addresses stay the same as with our own translation function. Additionally, we now see that the virtual address `physical_memory_offset` is mapped to the physical address `0x0`. + +By using the translation function of the `MappedPageTable` type we can spare ourselves the work of implementing huge page support. We also have access to other page functions such as `map_to`, which we will use in the next section. + +At this point we no longer need our `memory::translate_addr` and `memory::translate_addr_inner` functions, so we can delete them. + +### Creating a new Mapping + +Until now we only looked at the page tables without modifying anything. Let's change that by creating a new mapping for a previously unmapped page. + +We will use the [`map_to`] function of the [`Mapper`] trait for our implementation, so let's take a look at that function first. The documentation tells us that it takes four arguments: the page that we want to map, the frame that the page should be mapped to, a set of flags for the page table entry, and a `frame_allocator`. The frame allocator is needed because mapping the given page might require creating additional page tables, which need unused frames as backing storage. + +[`map_to`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/trait.Mapper.html#tymethod.map_to +[`Mapper`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/trait.Mapper.html + +#### A `create_example_mapping` Function + +The first step of our implementation is to create a new `create_example_mapping` function that maps a given virtual page to `0xb8000`, the physical frame of the VGA text buffer. We choose that frame because it allows us to easily test if the mapping was created correctly: We just need to write to the newly mapped page and see whether we see the write appear on the screen. + +The `create_example_mapping` function looks like this: + +```rust +// in src/memory.rs + +use x86_64::{ + PhysAddr, + structures::paging::{Page, PhysFrame, Mapper, Size4KiB, FrameAllocator} +}; + +/// Creates an example mapping for the given page to frame `0xb8000`. +pub fn create_example_mapping( + page: Page, + mapper: &mut OffsetPageTable, + frame_allocator: &mut impl FrameAllocator, +) { + use x86_64::structures::paging::PageTableFlags as Flags; + + let frame = PhysFrame::containing_address(PhysAddr::new(0xb8000)); + let flags = Flags::PRESENT | Flags::WRITABLE; + + let map_to_result = unsafe { + // FIXME: this is not safe, we do it only for testing + mapper.map_to(page, frame, flags, frame_allocator) + }; + map_to_result.expect("map_to failed").flush(); +} +``` + +In addition to the `page` that should be mapped, the function expects a mutable reference to an `OffsetPageTable` instance and a `frame_allocator`. The `frame_allocator` parameter uses the [`impl Trait`][impl-trait-arg] syntax to be [generic] over all types that implement the [`FrameAllocator`] trait. The trait is generic over the [`PageSize`] trait to work with both standard 4KiB pages and huge 2MiB/1GiB pages. We only want to create a 4KiB mapping, so we set the generic parameter to `Size4KiB`. + +[impl-trait-arg]: https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters +[generic]: https://doc.rust-lang.org/book/ch10-00-generics.html +[`FrameAllocator`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/trait.FrameAllocator.html +[`PageSize`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/page/trait.PageSize.html + +The [`map_to`] method is unsafe because the caller must ensure that the frame is not already in use. The reason for this is that mapping the same frame twice could result in undefined behavior, for example when two different `&mut` references point to the same physical memory location. In our case, we reuse the VGA text buffer frame, which is already mapped, so we break the required condition. However, the `create_example_mapping` function is only a temporary testing function and will be removed after this post, so it is ok. To remind us of the unsafety, we put a `FIXME` comment on the line. + +In addition to the `page` and the `unused_frame`, the `map_to` method takes a set of flags for the mapping and a reference to the `frame_allocator`, which will be explained in a moment. For the flags, we set the `PRESENT` flag because it is required for all valid entries and the `WRITABLE` flag to make the mapped page writable. For a list of all possible flags, see the [_Page Table Format_] section of the previous post. + +[_Page Table Format_]: @/edition-2/posts/08-paging-introduction/index.md#page-table-format + +The [`map_to`] function can fail, so it returns a [`Result`]. Since this is just some example code that does not need to be robust, we just use [`expect`] to panic when an error occurs. On success, the function returns a [`MapperFlush`] type that provides an easy way to flush the newly mapped page from the translation lookaside buffer (TLB) with its [`flush`] method. Like `Result`, the type uses the [`#[must_use]`][must_use] attribute to emit a warning when we accidentally forget to use it. + +[`Result`]: https://doc.rust-lang.org/core/result/enum.Result.html +[`expect`]: https://doc.rust-lang.org/core/result/enum.Result.html#method.expect +[`MapperFlush`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.MapperFlush.html +[`flush`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.MapperFlush.html#method.flush +[must_use]: https://doc.rust-lang.org/std/result/#results-must-be-used + +#### A dummy `FrameAllocator` + +To be able to call `create_example_mapping` we need to create a type that implements the `FrameAllocator` trait first. As noted above, the trait is responsible for allocating frames for new page table if they are needed by `map_to`. + +Let's start with the simple case and assume that we don't need to create new page tables. For this case, a frame allocator that always returns `None` suffices. We create such an `EmptyFrameAllocator` for testing our mapping function: + +```rust +// in src/memory.rs + +/// A FrameAllocator that always returns `None`. +pub struct EmptyFrameAllocator; + +unsafe impl FrameAllocator for EmptyFrameAllocator { + fn allocate_frame(&mut self) -> Option { + None + } +} +``` + +Implementing the `FrameAllocator` is unsafe because the implementer must guarantee that the allocator yields only unused frames. Otherwise undefined behavior might occur, for example when two virtual pages are mapped to the same physical frame. Our `EmptyFrameAllocator` only returns `None`, so this isn't a problem in this case. + +#### Choosing a Virtual Page + +We now have a simple frame allocator that we can pass to our `create_example_mapping` function. However, the allocator always returns `None`, so this will only work if no additional page table frames are needed for creating the mapping. To understand when additional page table frames are needed and when not, let's consider an example: + +![A virtual and a physical address space with a single mapped page and the page tables of all four levels](required-page-frames-example.svg) + +The graphic shows the virtual address space on the left, the physical address space on the right, and the page tables in between. The page tables are stored in physical memory frames, indicated by the dashed lines. The virtual address space contains a single mapped page at address `0x803fe00000`, marked in blue. To translate this page to its frame, the CPU walks the 4-level page table until it reaches the frame at address 36 KiB. + +Additionally, the graphic shows the physical frame of the VGA text buffer in red. Our goal is to map a previously unmapped virtual page to this frame using our `create_example_mapping` function. Since our `EmptyFrameAllocator` always returns `None`, we want to create the mapping so that no additional frames are needed from the allocator. This depends on the virtual page that we select for the mapping. + +The graphic shows two canditate pages in the virtual address space, both marked in yellow. One page is at address `0x803fdfd000`, which is 3 pages before the mapped page (in blue). While the level 4 and level 3 page table indices are the same as for the blue page, the level 2 and level 1 indices are different (see the [previous post][page-table-indices]). The different index into the level 2 table means that a different level 1 table is used for this page. Since this level 1 table does not exist yet, we would need to create it if we chose that page for our example mapping, which would require an additional unused physical frame. In contrast, the second candidate page at address `0x803fe02000` does not have this problem because it uses the same level 1 page table than the blue page. Thus, all required page tables already exist. + +[page-table-indices]: @/edition-2/posts/08-paging-introduction/index.md#paging-on-x86-64 + +In summary, the difficulty of creating a new mapping depends on the virtual page that we want to map. In the easiest case, the level 1 page table for the page already exists and we just need to write a single entry. In the most difficult case, the page is in a memory region for that no level 3 exists yet so that we need to create new level 3, level 2 and level 1 page tables first. + +For calling our `create_example_mapping` function with the `EmptyFrameAllocator`, we need to choose a page for that all page tables already exist. To find such a page, we can utilize the fact that the bootloader loads itself in the first megabyte of the virtual address space. This means that a valid level 1 table exists for all pages this region. Thus, we can choose any unused page in this memory region for our example mapping, such as the page at address `0`. Normally, this page should stay unused to guarantee that dereferencing a null pointer causes a page fault, so we know that the bootloader leaves it unmapped. + +#### Creating the Mapping + +We now have all the required parameters for calling our `create_example_mapping` function, so let's modify our `kernel_main` function to map the page at virtual address `0`. Since we map the page to the frame of the VGA text buffer, we should be able to write to the screen through it afterwards. The implementation looks like this: + +```rust +// in src/main.rs + +fn kernel_main(boot_info: &'static BootInfo) -> ! { + use blog_os::memory; + use x86_64::{structures::paging::Page, VirtAddr}; // new import + + […] // hello world and blog_os::init + + let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset); + let mut mapper = unsafe { memory::init(phys_mem_offset) }; + let mut frame_allocator = memory::EmptyFrameAllocator; + + // map an unused page + let page = Page::containing_address(VirtAddr::new(0)); + memory::create_example_mapping(page, &mut mapper, &mut frame_allocator); + + // write the string `New!` to the screen through the new mapping + let page_ptr: *mut u64 = page.start_address().as_mut_ptr(); + unsafe { page_ptr.offset(400).write_volatile(0x_f021_f077_f065_f04e)}; + + […] // test_main(), "it did not crash" printing, and hlt_loop() +} +``` + +We first create the mapping for the page at address `0` by calling our `create_example_mapping` function with a mutable reference to the `mapper` and the `frame_allocator` instances. This maps the page to the VGA text buffer frame, so we should see any write to it on the screen. + +Then we convert the page to a raw pointer and write a value to offset `400`. We don't write to the start of the page because the top line of the VGA buffer is directly shifted off the screen by the next `println`. We write the value `0x_f021_f077_f065_f04e`, which represents the string _"New!"_ on white background. As we learned [in the _“VGA Text Mode”_ post], writes to the VGA buffer should be volatile, so we use the [`write_volatile`] method. + +[in the _“VGA Text Mode”_ post]: @/edition-2/posts/03-vga-text-buffer/index.md#volatile +[`write_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_volatile + +When we run it in QEMU, we see the following output: + +![QEMU printing "It did not crash!" with four completely white cells in the middle of the screen](qemu-new-mapping.png) + +The _"New!"_ on the screen is by our write to page `0`, which means that we successfully created a new mapping in the page tables. + +Creating that mapping only worked because the level 1 table responsible for the page at address `0` already exists. When we try to map a page for that no level 1 table exists yet, the `map_to` function fails because it tries to allocate frames from the `EmptyFrameAllocator` for creating new page tables. We can see that happen when we try to map page `0xdeadbeaf000` instead of `0`: + +```rust +// in src/main.rs + +fn kernel_main(boot_info: &'static BootInfo) -> ! { + […] + let page = Page::containing_address(VirtAddr::new(0xdeadbeaf000)); + […] +} +``` + +When we run it, a panic with the following error message occurs: + +``` +panicked at 'map_to failed: FrameAllocationFailed', /…/result.rs:999:5 +``` + +To map pages that don't have a level 1 page table yet we need to create a proper `FrameAllocator`. But how do we know which frames are unused and how much physical memory is available? + +### Allocating Frames + +In order to create new page tables, we need to create a proper frame allocator. For that we use the `memory_map` that is passed by the bootloader as part of the `BootInfo` struct: + +```rust +// in src/memory.rs + +use bootloader::bootinfo::MemoryMap; + +/// A FrameAllocator that returns usable frames from the bootloader's memory map. +pub struct BootInfoFrameAllocator { + memory_map: &'static MemoryMap, + next: usize, +} + +impl BootInfoFrameAllocator { + /// Create a FrameAllocator from the passed memory map. + /// + /// This function is unsafe because the caller must guarantee that the passed + /// memory map is valid. The main requirement is that all frames that are marked + /// as `USABLE` in it are really unused. + pub unsafe fn init(memory_map: &'static MemoryMap) -> Self { + BootInfoFrameAllocator { + memory_map, + next: 0, + } + } +} +``` + +The struct has two fields: A `'static` reference to the memory map passed by the bootloader and a `next` field that keeps track of number of the next frame that the allocator should return. + +As we explained in the [_Boot Information_](#boot-information) section, the memory map is provided by the BIOS/UEFI firmware. It can only be queried very early in the boot process, so the bootloader already calls the respective functions for us. The memory map consists of a list of [`MemoryRegion`] structs, which contain the start address, the length, and the type (e.g. unused, reserved, etc.) of each memory region. + +The `init` function initializes a `BootInfoFrameAllocator` with a given memory map. The `next` field is initialized with `0` and will be increased for every frame allocation to avoid returning the same frame twice. Since we don't know if the usable frames of the memory map were already used somewhere else, our `init` function must be `unsafe` to require additional guarantees from the caller. + +#### A `usable_frames` Method + +Before we implement the `FrameAllocator` trait, we add an auxiliary method that converts the memory map into an iterator of usable frames: + +```rust +// in src/memory.rs + +use bootloader::bootinfo::MemoryRegionType; + +impl BootInfoFrameAllocator { + /// Returns an iterator over the usable frames specified in the memory map. + fn usable_frames(&self) -> impl Iterator { + // get usable regions from memory map + let regions = self.memory_map.iter(); + let usable_regions = regions + .filter(|r| r.region_type == MemoryRegionType::Usable); + // map each region to its address range + let addr_ranges = usable_regions + .map(|r| r.range.start_addr()..r.range.end_addr()); + // transform to an iterator of frame start addresses + let frame_addresses = addr_ranges.flat_map(|r| r.step_by(4096)); + // create `PhysFrame` types from the start addresses + frame_addresses.map(|addr| PhysFrame::containing_address(PhysAddr::new(addr))) + } +} +``` + +This function uses iterator combinator methods to transform the initial `MemoryMap` into an iterator of usable physical frames: + +- First, we call the `iter` method to convert the memory map to an iterator of [`MemoryRegion`]s. +- Then we use the [`filter`] method to skip any reserved or otherwise unavailable regions. The bootloader updates the memory map for all the mappings it creates, so frames that are used by our kernel (code, data or stack) or to store the boot information are already marked as `InUse` or similar. Thus we can be sure that `Usable` frames are not used somewhere else. +- Afterwards, we use the [`map`] combinator and Rust's [range syntax] to transform our iterator of memory regions to an iterator of address ranges. +- Next, we use [`flat_map`] to transform the address ranges into an iterator of frame start addresses, choosing every 4096th address using [`step_by`]. Since 4096 bytes (= 4 KiB) is the page size, we get the start address of each frame. The bootloader page aligns all usable memory areas so that we don't need any alignment or rounding code here. By using [`flat_map`] instead of `map`, we get an `Iterator` instead of an `Iterator>`. +- Finally, we convert the start addresses to `PhysFrame` types to construct the an `Iterator`. + +[`MemoryRegion`]: https://docs.rs/bootloader/0.6.4/bootloader/bootinfo/struct.MemoryRegion.html +[`filter`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.filter +[`map`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.map +[range syntax]: https://doc.rust-lang.org/core/ops/struct.Range.html +[`step_by`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.step_by +[`flat_map`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.flat_map + +The return type of the function uses the [`impl Trait`] feature. This way, we can specify that we return some type that implements the [`Iterator`] trait with item type `PhysFrame`, but don't need to name the concrete return type. This is important here because we _can't_ name the concrete type since it depends on unnamable closure types. + +[`impl Trait`]: https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits +[`Iterator`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html + +#### Implementing the `FrameAllocator` Trait + +Now we can implement the `FrameAllocator` trait: + +```rust +// in src/memory.rs + +unsafe impl FrameAllocator for BootInfoFrameAllocator { + fn allocate_frame(&mut self) -> Option { + let frame = self.usable_frames().nth(self.next); + self.next += 1; + frame + } +} +``` + +We first use the `usable_frames` method to get an iterator of usable frames from the memory map. Then, we use the [`Iterator::nth`] function to get the frame with index `self.next` (thereby skipping `(self.next - 1)` frames). Before returning that frame, we increase `self.next` by one so that we return the following frame on the next call. + +[`Iterator::nth`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.nth + +This implementation is not quite optimal since it recreates the `usable_frame` allocator on every allocation. It would be better to directly store the iterator as a struct field instead. Then we wouldn't need the `nth` method and could just call [`next`] on every allocation. The problem with this approach is that it's not possible to store an `impl Trait` type in a struct field currently. It might work someday when [_named existential types_] are fully implemented. + +[`next`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#tymethod.next +[_named existential types_]: https://github.com/rust-lang/rfcs/pull/2071 + +#### Using the `BootInfoFrameAllocator` + +We can now modify our `kernel_main` function to pass a `BootInfoFrameAllocator` instance instead of an `EmptyFrameAllocator`: + +```rust +// in src/main.rs + +fn kernel_main(boot_info: &'static BootInfo) -> ! { + use blog_os::memory::BootInfoFrameAllocator; + […] + let mut frame_allocator = unsafe { + BootInfoFrameAllocator::init(&boot_info.memory_map) + }; + […] +} +``` + +With the boot info frame allocator, the mapping succeeds and we see the black-on-white _"New!"_ on the screen again. Behind the scenes, the `map_to` method creates the missing page tables in the following way: + +- Allocate an unused frame from the passed `frame_allocator`. +- Zero the frame to create a new, empty page table. +- Map the entry of the higher level table to that frame. +- Continue with the next table level. + +While our `create_example_mapping` function is just some example code, we are now able to create new mappings for arbitrary pages. This will be essential for allocating memory or implementing multithreading in future posts. + +At this point, we should delete the `create_example_mapping` function again to avoid accidentally invoking undefined behavior, as explained [above](#a-create-example-mapping-function). + +## Summary + +In this post we learned about different techniques to access the physical frames of page tables, including identity mapping, mapping of the complete physical memory, temporary mapping, and recursive page tables. We chose to map the complete physical memory since it's simple, portable, and powerful. + +We can't map the physical memory from our kernel without page table access, so we needed support from the bootloader. The `bootloader` crate supports creating the required mapping through optional cargo features. It passes the required information to our kernel in the form of a `&BootInfo` argument to our entry point function. + +For our implementation, we first manually traversed the page tables to implement a translation function, and then used the `MappedPageTable` type of the `x86_64` crate. We also learned how to create new mappings in the page table and how to create the necessary `FrameAllocator` on top of the memory map passed by the bootloader. + +## What's next? + +The next post will create a heap memory region for our kernel, which will allow us to [allocate memory] and use various [collection types]. + +[allocate memory]: https://doc.rust-lang.org/alloc/boxed/struct.Box.html +[collection types]: https://doc.rust-lang.org/alloc/collections/index.html From 21516fe8212e5af46f09707d0dc530ff801f609d Mon Sep 17 00:00:00 2001 From: woodyZootopia Date: Sun, 6 Jun 2021 11:48:15 +0900 Subject: [PATCH 02/28] Add file and translate a bit --- .../09-paging-implementation/index.ja.md | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md index 73925812..b1f1bef5 100644 --- a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -34,64 +34,70 @@ translators = ["woodyZootopia"] To implement the approach, we will need support from the bootloader, so we'll configure it first. Afterward, we will implement a function that traverses the page table hierarchy in order to translate virtual to physical addresses. Finally, we learn how to create new mappings in the page tables and how to find unused memory frames for creating new page tables. -## Accessing Page Tables +この方法を実装するには、ブートローダーからの補助が必要になるので、まずこれに設定を加えます。その後で、ページテーブルの階層構造を移動して、仮想アドレスを物理アドレスに変換する関数を実装します。最後に、ページテーブルに新しい対応関係を作る方法と、それを作るための未使用メモリを見つける方法を学びます。 -Accessing the page tables from our kernel is not as easy as it may seem. To understand the problem let's take a look at the example 4-level page table hierarchy of the previous post again: +## ページテーブルにアクセスする + +私達のカーネルからページテーブルにアクセスするのは案外難しいです。この問題を理解するために、前回の記事の4層ページテーブルをもう一度見てみましょう: ![An example 4-level page hierarchy with each page table shown in physical memory](../paging-introduction/x86_64-page-table-translation.svg) -The important thing here is that each page entry stores the _physical_ address of the next table. This avoids the need to run a translation for these addresses too, which would be bad for performance and could easily cause endless translation loops. +ここで需要なのは、それぞれのページテーブルのエントリは次のテーブルの**物理**アドレスであるということです。これにより、それらのアドレスに対しても変換することを避けられます。もしこの変換が行われたとしたら、性能的にも良くないですし、容易に変換の無限ループに陥りかねません。 -The problem for us is that we can't directly access physical addresses from our kernel since our kernel also runs on top of virtual addresses. For example, when we access address `4 KiB` we access the _virtual_ address `4 KiB`, not the _physical_ address `4 KiB` where the level 4 page table is stored. When we want to access the physical address `4 KiB`, we can only do so through some virtual address that maps to it. +問題は、私達のカーネル自体も仮想アドレスの上で動いているため、カーネルから直接物理アドレスにアクセスすることができないということです。例えば、アドレス`4KiB`にアクセスしたとき、私達は**仮想**アドレス`4KiB`にアクセスしているのであって、レベル4ページテーブルが格納されている**物理**アドレス`4KiB`にアクセスしているのではありません。物理アドレス`4KiB`にアクセスしたいなら、それに対応づけられている何らかの仮想アドレスを通じてのみ可能です。 -So in order to access page table frames, we need to map some virtual pages to them. There are different ways to create these mappings that all allow us to access arbitrary page table frames. +そのため、ページテーブルのフレームにアクセスするためには、どこかの仮想ページをそれに対応づけなければいけません。このような、任意のページテーブルのフレームにアクセスできるようにしてくれる対応付けを作る方法にはいくつかあります。 -### Identity Mapping +### 恒等対応 -A simple solution is to **identity map all page tables**: +シンプルな方法として、**すべてのページテーブルを恒等対応させる**ということが考えられるでしょう: ![A virtual and a physical address space with various virtual pages mapped to the physical frame with the same address](identity-mapped-page-tables.svg) -In this example, we see various identity-mapped page table frames. This way the physical addresses of page tables are also valid virtual addresses so that we can easily access the page tables of all levels starting from the CR3 register. +この例では、いくつかの恒等対応したページテーブルのフレームが見てとれます。こうすることで、ページテーブルの物理アドレスは仮想アドレスとしても正当になり、よってCR3レジスタから始めることで全てのレベルのページテーブルに簡単にアクセスできます。 -However, it clutters the virtual address space and makes it more difficult to find continuous memory regions of larger sizes. For example, imagine that we want to create a virtual memory region of size 1000 KiB in the above graphic, e.g. for [memory-mapping a file]. We can't start the region at `28 KiB` because it would collide with the already mapped page at `1004 KiB`. So we have to look further until we find a large enough unmapped area, for example at `1008 KiB`. This is a similar fragmentation problem as with [segmentation]. +しかし、この方法では仮想アドレス空間が散らかってしまい、より大きいサイズの連続したメモリを見つけることが難しくなります。例えば、上の図において、[ファイルをメモリにマップする][memory-mapping a file]ために1000KiBの大きさの仮想メモリ領域を作りたいとします。`28KiB`を始点として領域を作ろうとすると、`1004KiB`のところで既存のページと衝突してしまうのでうまくいきません。そのため、`1008KiB`のような、十分な広さで対応付けのない領域が見つかるまで更に探さないといけません。これは[セグメンテーション][segmentation]の時にみた断片化の問題に似ています。 [memory-mapping a file]: https://en.wikipedia.org/wiki/Memory-mapped_file [segmentation]: @/edition-2/posts/08-paging-introduction/index.md#fragmentation Equally, it makes it much more difficult to create new page tables, because we need to find physical frames whose corresponding pages aren't already in use. For example, let's assume that we reserved the _virtual_ 1000 KiB memory region starting at `1008 KiB` for our memory-mapped file. Now we can't use any frame with a _physical_ address between `1000 KiB` and `2008 KiB` anymore, because we can't identity map it. +同様に、新しいページテーブルを作ることもずっと難しくなります。なぜなら、対応するページがまだ使われていない物理フレームを見つけないといけないからです。例えば、メモリマップト (に対応づけられた) ファイルのために`1008KiB`から1000KiBにわたって仮想メモリを占有したとしましょう。すると、すると、物理アドレス`1000KiB`から`2008KiB`までのフレームは、もう恒等対応を作ることができないので、使用することができません。 -### Map at a Fixed Offset +### 固定オフセットの対応 To avoid the problem of cluttering the virtual address space, we can **use a separate memory region for page table mappings**. So instead of identity mapping page table frames, we map them at a fixed offset in the virtual address space. For example, the offset could be 10 TiB: +仮想アドレス空間を散らかしてしまうという問題を回避するために、**ページテーブルの対応づけのために別のメモリ領域を使う**ことができます。ページテーブルを恒等対応させる代わりに、仮想アドレス空間で一定のオフセットをおいて対応づけてみましょう。例えば、オフセットを10TiBにしてみましょう: ![The same figure as for the identity mapping, but each mapped virtual page is offset by 10 TiB.](page-tables-mapped-at-offset.svg) By using the virtual memory in the range `10TiB..(10TiB + physical memory size)` exclusively for page table mappings, we avoid the collision problems of the identity mapping. Reserving such a large region of the virtual address space is only possible if the virtual address space is much larger than the physical memory size. This isn't a problem on x86_64 since the 48-bit address space is 256 TiB large. +`10TiB`から`10TiB+物理メモリ全体の大きさ`の範囲の仮想メモリをページテーブルの対応付け専用に使うことで、恒等対応のときに存在していた衝突問題を回避しています。このように巨大な領域を仮想アドレス空間内に用意するのは、仮想アドレス空間が物理メモリの大きさより遥かに大きい場合にのみ可能です。x86_64については、(x86_64で用いられている)48bit(仮想)アドレス空間は256TiBもの大きさがあるので、これは問題ではありません。 -This approach still has the disadvantage that we need to create a new mapping whenever we create a new page table. Also, it does not allow accessing page tables of other address spaces, which would be useful when creating a new process. +この方法では、新しいページテーブルを作るたびに新しい対応付けを作る必要があるという欠点があります。また、他のアドレス空間のページテーブルにアクセスすることができると、新しいプロセスを作るときに便利なのですがこれも不可能です。 -### Map the Complete Physical Memory +### 物理メモリ全体を対応付ける -We can solve these problems by **mapping the complete physical memory** instead of only page table frames: +これらの問題はページテーブルのフレームだけと言わず**物理メモリ全体を対応付け**てしまえば解決します: ![The same figure as for the offset mapping, but every physical frame has a mapping (at 10TiB + X) instead of only page table frames.](map-complete-physical-memory.svg) -This approach allows our kernel to access arbitrary physical memory, including page table frames of other address spaces. The reserved virtual memory range has the same size as before, with the difference that it no longer contains unmapped pages. +この方法を使えば、私達のカーネルは他のアドレス空間を含め任意の物理メモリにアクセスできます。用意する仮想メモリの範囲は以前と同じであり、違うのは全てのページが対応付けられているということです。 -The disadvantage of this approach is that additional page tables are needed for storing the mapping of the physical memory. These page tables need to be stored somewhere, so they use up a part of physical memory, which can be a problem on devices with a small amount of memory. +この方法の欠点は、物理メモリへの対応付けを格納するために、追加でページテーブルが必要になるところです。これらのページテーブルもどこかに格納されなければならず、したがって物理メモリの一部を占有することになります。これはメモリの量が少ないデバイスにおいては問題となりえます。 -On x86_64, however, we can use [huge pages] with size 2MiB for the mapping, instead of the default 4KiB pages. This way, mapping 32 GiB of physical memory only requires 132 KiB for page tables since only one level 3 table and 32 level 2 tables are needed. Huge pages are also more cache efficient since they use fewer entries in the translation lookaside buffer (TLB). +しかし、x86_64においては、通常の4KiBサイズのページに代わって、大きさ2MiBの[huge pages]を対応付けに使うことができます。こうすれば、例えば32GiBの物理メモリを対応付けるのに、レベル3テーブル1個とレベル2テーブル32個があればいいので、たったの132KiBしか必要ではありません。huge pagesは、トランスレーション・ルックアサイド・バッファ (TLB) のエントリをあまり使わないので、キャッシュ的にも効率が良いです。 [huge pages]: https://en.wikipedia.org/wiki/Page_%28computer_memory%29#Multiple_page_sizes -### Temporary Mapping +### 一時的な対応関係 -For devices with very small amounts of physical memory, we could **map the page tables frames only temporarily** when we need to access them. To be able to create the temporary mappings we only need a single identity-mapped level 1 table: +物理メモリの量が非常に限られたデバイスについては、アクセスする必要があるときだけ**ページテーブルのフレームを一時的に対応づける**という方法が考えられます。そのような一時的な対応を作りたいときには、たった一つだけ恒等対応させられたレベル1テーブルがあれば良いです: ![A virtual and a physical address space with an identity mapped level 1 table, which maps its 0th entry to the level 2 table frame, thereby mapping that frame to page with address 0](temporarily-mapped-page-tables.svg) The level 1 table in this graphic controls the first 2 MiB of the virtual address space. This is because it is reachable by starting at the CR3 register and following the 0th entry in the level 4, level 3, and level 2 page tables. The entry with index `8` maps the virtual page at address `32 KiB` to the physical frame at address `32 KiB`, thereby identity mapping the level 1 table itself. The graphic shows this identity-mapping by the horizontal arrow at `32 KiB`. +この図におけるレベル1テーブルは仮想アドレス空間の最初の2MiBを制御しています。なぜなら、CR3レジスタから始めて、レベル4、3、2のページテーブルの0番目のエントリを辿ることで到達できるからです。 By writing to the identity-mapped level 1 table, our kernel can create up to 511 temporary mappings (512 minus the entry required for the identity mapping). In the above example, the kernel created two temporary mappings: From fcabba07511592b0987955c03ea2b9a3c668d9a8 Mon Sep 17 00:00:00 2001 From: woodyZootopia Date: Fri, 13 Aug 2021 11:57:33 +0900 Subject: [PATCH 03/28] rebase to current origin/main --- .../09-paging-implementation/index.ja.md | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md index b1f1bef5..ad05eae9 100644 --- a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -6,7 +6,7 @@ date = 2019-03-14 [extra] chapter = "Memory Management" -translation_based_on_commit = "bf4f88107966c7ab1327c3cdc0ebfbd76bad5c5f" +translation_based_on_commit = "27ab4518acbb132e327ed4f4f0508393e9d4d684" translators = ["woodyZootopia"] +++ @@ -227,7 +227,7 @@ The above code assumes that the last level 4 entry with index `0o777` (511) is r Alternatively to performing the bitwise operations by hand, you can use the [`RecursivePageTable`] type of the `x86_64` crate, which provides safe abstractions for various page table operations. For example, the code below shows how to translate a virtual address to its mapped physical address: -[`RecursivePageTable`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html +[`RecursivePageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html ```rust // in src/memory.rs @@ -445,7 +445,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { First, we convert the `physical_memory_offset` of the `BootInfo` struct to a [`VirtAddr`] and pass it to the `active_level_4_table` function. We then use the `iter` function to iterate over the page table entries and the [`enumerate`] combinator to additionally add an index `i` to each element. We only print non-empty entries because all 512 entries wouldn't fit on the screen. -[`VirtAddr`]: https://docs.rs/x86_64/0.13.2/x86_64/addr/struct.VirtAddr.html +[`VirtAddr`]: https://docs.rs/x86_64/0.14.2/x86_64/addr/struct.VirtAddr.html [`enumerate`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.enumerate When we run it, we see the following output: @@ -558,7 +558,7 @@ The `VirtAddr` struct already provides methods to compute the indexes into the p Inside the loop, we again use the `physical_memory_offset` to convert the frame into a page table reference. We then read the entry of the current page table and use the [`PageTableEntry::frame`] function to retrieve the mapped frame. If the entry is not mapped to a frame we return `None`. If the entry maps a huge 2MiB or 1GiB page we panic for now. -[`PageTableEntry::frame`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/page_table/struct.PageTableEntry.html#method.frame +[`PageTableEntry::frame`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/page_table/struct.PageTableEntry.html#method.frame Let's test our translation function by translating some addresses: @@ -613,20 +613,20 @@ The base of the abstraction are two traits that define various page table mappin - The [`Mapper`] trait is generic over the page size and provides functions that operate on pages. Examples are [`translate_page`], which translates a given page to a frame of the same size, and [`map_to`], which creates a new mapping in the page table. - The [`Translate`] trait provides functions that work with multiple page sizes such as [`translate_addr`] or the general [`translate`]. -[`Mapper`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Mapper.html -[`translate_page`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Mapper.html#tymethod.translate_page -[`map_to`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Mapper.html#method.map_to -[`Translate`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Translate.html -[`translate_addr`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Translate.html#method.translate_addr -[`translate`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/trait.Translate.html#tymethod.translate +[`Mapper`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Mapper.html +[`translate_page`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Mapper.html#tymethod.translate_page +[`map_to`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Mapper.html#method.map_to +[`Translate`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Translate.html +[`translate_addr`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Translate.html#method.translate_addr +[`translate`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Translate.html#tymethod.translate The traits only define the interface, they don't provide any implementation. The `x86_64` crate currently provides three types that implement the traits with different requirements. The [`OffsetPageTable`] type assumes that the complete physical memory is mapped to the virtual address space at some offset. The [`MappedPageTable`] is a bit more flexible: It only requires that each page table frame is mapped to the virtual address space at a calculable address. Finally, the [`RecursivePageTable`] type can be used to access page table frames through [recursive page tables](#recursive-page-tables). -[`OffsetPageTable`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html -[`MappedPageTable`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.MappedPageTable.html -[`RecursivePageTable`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html +[`OffsetPageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html +[`MappedPageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.MappedPageTable.html +[`RecursivePageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html -In our case, the bootloader maps the complete physical memory at a virtual address specfied by the `physical_memory_offset` variable, so we can use the `OffsetPageTable` type. To initialize it, we create a new `init` function in our `memory` module: +In our case, the bootloader maps the complete physical memory at a virtual address specified by the `physical_memory_offset` variable, so we can use the `OffsetPageTable` type. To initialize it, we create a new `init` function in our `memory` module: ```rust use x86_64::structures::paging::OffsetPageTable; @@ -650,7 +650,7 @@ unsafe fn active_level_4_table(physical_memory_offset: VirtAddr) The function takes the `physical_memory_offset` as an argument and returns a new `OffsetPageTable` instance with a `'static` lifetime. This means that the instance stays valid for the complete runtime of our kernel. In the function body, we first call the `active_level_4_table` function to retrieve a mutable reference to the level 4 page table. We then invoke the [`OffsetPageTable::new`] function with this reference. As the second parameter, the `new` function expects the virtual address at which the mapping of the physical memory starts, which is given in the `physical_memory_offset` variable. -[`OffsetPageTable::new`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html#method.new +[`OffsetPageTable::new`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html#method.new The `active_level_4_table` function should be only called from the `init` function from now on because it can easily lead to aliased mutable references when called multiple times, which can cause undefined behavior. For this reason, we make the function private by removing the `pub` specifier. @@ -701,8 +701,8 @@ Until now we only looked at the page tables without modifying anything. Let's ch We will use the [`map_to`] function of the [`Mapper`] trait for our implementation, so let's take a look at that function first. The documentation tells us that it takes four arguments: the page that we want to map, the frame that the page should be mapped to, a set of flags for the page table entry, and a `frame_allocator`. The frame allocator is needed because mapping the given page might require creating additional page tables, which need unused frames as backing storage. -[`map_to`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/trait.Mapper.html#tymethod.map_to -[`Mapper`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/trait.Mapper.html +[`map_to`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/trait.Mapper.html#tymethod.map_to +[`Mapper`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/trait.Mapper.html #### A `create_example_mapping` Function @@ -741,8 +741,8 @@ In addition to the `page` that should be mapped, the function expects a mutable [impl-trait-arg]: https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters [generic]: https://doc.rust-lang.org/book/ch10-00-generics.html -[`FrameAllocator`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/trait.FrameAllocator.html -[`PageSize`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/page/trait.PageSize.html +[`FrameAllocator`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/trait.FrameAllocator.html +[`PageSize`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/page/trait.PageSize.html The [`map_to`] method is unsafe because the caller must ensure that the frame is not already in use. The reason for this is that mapping the same frame twice could result in undefined behavior, for example when two different `&mut` references point to the same physical memory location. In our case, we reuse the VGA text buffer frame, which is already mapped, so we break the required condition. However, the `create_example_mapping` function is only a temporary testing function and will be removed after this post, so it is ok. To remind us of the unsafety, we put a `FIXME` comment on the line. @@ -754,8 +754,8 @@ The [`map_to`] function can fail, so it returns a [`Result`]. Since this is just [`Result`]: https://doc.rust-lang.org/core/result/enum.Result.html [`expect`]: https://doc.rust-lang.org/core/result/enum.Result.html#method.expect -[`MapperFlush`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.MapperFlush.html -[`flush`]: https://docs.rs/x86_64/0.13.2/x86_64/structures/paging/mapper/struct.MapperFlush.html#method.flush +[`MapperFlush`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.MapperFlush.html +[`flush`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.MapperFlush.html#method.flush [must_use]: https://doc.rust-lang.org/std/result/#results-must-be-used #### A dummy `FrameAllocator` @@ -789,7 +789,7 @@ The graphic shows the virtual address space on the left, the physical address sp Additionally, the graphic shows the physical frame of the VGA text buffer in red. Our goal is to map a previously unmapped virtual page to this frame using our `create_example_mapping` function. Since our `EmptyFrameAllocator` always returns `None`, we want to create the mapping so that no additional frames are needed from the allocator. This depends on the virtual page that we select for the mapping. -The graphic shows two canditate pages in the virtual address space, both marked in yellow. One page is at address `0x803fdfd000`, which is 3 pages before the mapped page (in blue). While the level 4 and level 3 page table indices are the same as for the blue page, the level 2 and level 1 indices are different (see the [previous post][page-table-indices]). The different index into the level 2 table means that a different level 1 table is used for this page. Since this level 1 table does not exist yet, we would need to create it if we chose that page for our example mapping, which would require an additional unused physical frame. In contrast, the second candidate page at address `0x803fe02000` does not have this problem because it uses the same level 1 page table than the blue page. Thus, all required page tables already exist. +The graphic shows two candidate pages in the virtual address space, both marked in yellow. One page is at address `0x803fdfd000`, which is 3 pages before the mapped page (in blue). While the level 4 and level 3 page table indices are the same as for the blue page, the level 2 and level 1 indices are different (see the [previous post][page-table-indices]). The different index into the level 2 table means that a different level 1 table is used for this page. Since this level 1 table does not exist yet, we would need to create it if we chose that page for our example mapping, which would require an additional unused physical frame. In contrast, the second candidate page at address `0x803fe02000` does not have this problem because it uses the same level 1 page table than the blue page. Thus, all required page tables already exist. [page-table-indices]: @/edition-2/posts/08-paging-introduction/index.md#paging-on-x86-64 From ed14ee779d432286d664a90a170f2f7cde30d174 Mon Sep 17 00:00:00 2001 From: woodyZootopia Date: Fri, 13 Aug 2021 13:33:55 +0900 Subject: [PATCH 04/28] =?UTF-8?q?=E7=BF=BB=E8=A8=B3=E3=82=92=E9=80=B2?= =?UTF-8?q?=E3=82=81=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../09-paging-implementation/index.ja.md | 62 +++++++++---------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md index ad05eae9..58f62a57 100644 --- a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -32,8 +32,6 @@ translators = ["woodyZootopia"] [end of previous post]: @/edition-2/posts/08-paging-introduction/index.md#accessing-the-page-tables -To implement the approach, we will need support from the bootloader, so we'll configure it first. Afterward, we will implement a function that traverses the page table hierarchy in order to translate virtual to physical addresses. Finally, we learn how to create new mappings in the page tables and how to find unused memory frames for creating new page tables. - この方法を実装するには、ブートローダーからの補助が必要になるので、まずこれに設定を加えます。その後で、ページテーブルの階層構造を移動して、仮想アドレスを物理アドレスに変換する関数を実装します。最後に、ページテーブルに新しい対応関係を作る方法と、それを作るための未使用メモリを見つける方法を学びます。 ## ページテーブルにアクセスする @@ -42,7 +40,7 @@ To implement the approach, we will need support from the bootloader, so we'll co ![An example 4-level page hierarchy with each page table shown in physical memory](../paging-introduction/x86_64-page-table-translation.svg) -ここで需要なのは、それぞれのページテーブルのエントリは次のテーブルの**物理**アドレスであるということです。これにより、それらのアドレスに対しても変換することを避けられます。もしこの変換が行われたとしたら、性能的にも良くないですし、容易に変換の無限ループに陥りかねません。 +ここで重要なのは、それぞれのページテーブルのエントリは次のテーブルの**物理**アドレスであるということです。これにより、それらのアドレスに対しても変換することを避けられます。もしこの変換が行われたとしたら、性能的にも良くないですし、容易に変換の無限ループに陥りかねません。 問題は、私達のカーネル自体も仮想アドレスの上で動いているため、カーネルから直接物理アドレスにアクセスすることができないということです。例えば、アドレス`4KiB`にアクセスしたとき、私達は**仮想**アドレス`4KiB`にアクセスしているのであって、レベル4ページテーブルが格納されている**物理**アドレス`4KiB`にアクセスしているのではありません。物理アドレス`4KiB`にアクセスしたいなら、それに対応づけられている何らかの仮想アドレスを通じてのみ可能です。 @@ -56,23 +54,20 @@ To implement the approach, we will need support from the bootloader, so we'll co この例では、いくつかの恒等対応したページテーブルのフレームが見てとれます。こうすることで、ページテーブルの物理アドレスは仮想アドレスとしても正当になり、よってCR3レジスタから始めることで全てのレベルのページテーブルに簡単にアクセスできます。 -しかし、この方法では仮想アドレス空間が散らかってしまい、より大きいサイズの連続したメモリを見つけることが難しくなります。例えば、上の図において、[ファイルをメモリにマップする][memory-mapping a file]ために1000KiBの大きさの仮想メモリ領域を作りたいとします。`28KiB`を始点として領域を作ろうとすると、`1004KiB`のところで既存のページと衝突してしまうのでうまくいきません。そのため、`1008KiB`のような、十分な広さで対応付けのない領域が見つかるまで更に探さないといけません。これは[セグメンテーション][segmentation]の時にみた断片化の問題に似ています。 +しかし、この方法では仮想アドレス空間が散らかってしまい、より大きいサイズの連続したメモリを見つけることが難しくなります。例えば、上の図において、[ファイルをメモリにマップする][memory-mapping a file]ために1000KiBの大きさの仮想メモリ領域を作りたいとします。`28KiB`を始点として領域を作ろうとすると、`1004KiB`のところで既存のページと衝突してしまうのでうまくいきません。そのため、`1008KiB`のような、十分な広さで対応付けのない領域が見つかるまで更に探さないといけません。これは[セグメンテーション][segmentation]の時に見た断片化の問題に似ています。 [memory-mapping a file]: https://en.wikipedia.org/wiki/Memory-mapped_file [segmentation]: @/edition-2/posts/08-paging-introduction/index.md#fragmentation -Equally, it makes it much more difficult to create new page tables, because we need to find physical frames whose corresponding pages aren't already in use. For example, let's assume that we reserved the _virtual_ 1000 KiB memory region starting at `1008 KiB` for our memory-mapped file. Now we can't use any frame with a _physical_ address between `1000 KiB` and `2008 KiB` anymore, because we can't identity map it. 同様に、新しいページテーブルを作ることもずっと難しくなります。なぜなら、対応するページがまだ使われていない物理フレームを見つけないといけないからです。例えば、メモリマップト (に対応づけられた) ファイルのために`1008KiB`から1000KiBにわたって仮想メモリを占有したとしましょう。すると、すると、物理アドレス`1000KiB`から`2008KiB`までのフレームは、もう恒等対応を作ることができないので、使用することができません。 -### 固定オフセットの対応 +### 固定オフセットの対応づけ -To avoid the problem of cluttering the virtual address space, we can **use a separate memory region for page table mappings**. So instead of identity mapping page table frames, we map them at a fixed offset in the virtual address space. For example, the offset could be 10 TiB: 仮想アドレス空間を散らかしてしまうという問題を回避するために、**ページテーブルの対応づけのために別のメモリ領域を使う**ことができます。ページテーブルを恒等対応させる代わりに、仮想アドレス空間で一定のオフセットをおいて対応づけてみましょう。例えば、オフセットを10TiBにしてみましょう: ![The same figure as for the identity mapping, but each mapped virtual page is offset by 10 TiB.](page-tables-mapped-at-offset.svg) -By using the virtual memory in the range `10TiB..(10TiB + physical memory size)` exclusively for page table mappings, we avoid the collision problems of the identity mapping. Reserving such a large region of the virtual address space is only possible if the virtual address space is much larger than the physical memory size. This isn't a problem on x86_64 since the 48-bit address space is 256 TiB large. -`10TiB`から`10TiB+物理メモリ全体の大きさ`の範囲の仮想メモリをページテーブルの対応付け専用に使うことで、恒等対応のときに存在していた衝突問題を回避しています。このように巨大な領域を仮想アドレス空間内に用意するのは、仮想アドレス空間が物理メモリの大きさより遥かに大きい場合にのみ可能です。x86_64については、(x86_64で用いられている)48bit(仮想)アドレス空間は256TiBもの大きさがあるので、これは問題ではありません。 +`10TiB`から`10TiB+物理メモリ全体の大きさ`の範囲の仮想メモリをページテーブルの対応付け専用に使うことで、恒等対応のときに存在していた衝突問題を回避しています。このように巨大な領域を仮想アドレス空間内に用意するのは、仮想アドレス空間が物理メモリの大きさより遥かに大きい場合にのみ可能です。x86_64で用いられている48bit(仮想)アドレス空間は256TiBもの大きさがあるので、これは問題ではありません。 この方法では、新しいページテーブルを作るたびに新しい対応付けを作る必要があるという欠点があります。また、他のアドレス空間のページテーブルにアクセスすることができると、新しいプロセスを作るときに便利なのですがこれも不可能です。 @@ -96,61 +91,60 @@ By using the virtual memory in the range `10TiB..(10TiB + physical memory size)` ![A virtual and a physical address space with an identity mapped level 1 table, which maps its 0th entry to the level 2 table frame, thereby mapping that frame to page with address 0](temporarily-mapped-page-tables.svg) -The level 1 table in this graphic controls the first 2 MiB of the virtual address space. This is because it is reachable by starting at the CR3 register and following the 0th entry in the level 4, level 3, and level 2 page tables. The entry with index `8` maps the virtual page at address `32 KiB` to the physical frame at address `32 KiB`, thereby identity mapping the level 1 table itself. The graphic shows this identity-mapping by the horizontal arrow at `32 KiB`. -この図におけるレベル1テーブルは仮想アドレス空間の最初の2MiBを制御しています。なぜなら、CR3レジスタから始めて、レベル4、3、2のページテーブルの0番目のエントリを辿ることで到達できるからです。 +この図におけるレベル1テーブルは仮想アドレス空間の最初の2MiBを制御しています。なぜなら、このテーブルにはCR3レジスタから始めて、レベル4、3、2のページテーブルの0番目のエントリを辿ることで到達できるからです。8番目のエントリは、アドレス`32 KiB`の仮想アドレスページをアドレス`32 KiB`の物理アドレスページに対応付けるので、レベル1テーブル自体を恒等対応させています。この図ではその恒等対応を`32 KiB`のところの横向きの(茶色の)矢印で表しています。 -By writing to the identity-mapped level 1 table, our kernel can create up to 511 temporary mappings (512 minus the entry required for the identity mapping). In the above example, the kernel created two temporary mappings: +恒等対応させたレベル1テーブルに書き込むことによって、カーネルは最大511個の一時的な対応を作ることができます(512から、恒等対応に必要な1つを除く)。上の例では、カーネルは2つの一時的な対応を作りました: -- By mapping the 0th entry of the level 1 table to the frame with address `24 KiB`, it created a temporary mapping of the virtual page at `0 KiB` to the physical frame of the level 2 page table, indicated by the dashed arrow. -- By mapping the 9th entry of the level 1 table to the frame with address `4 KiB`, it created a temporary mapping of the virtual page at `36 KiB` to the physical frame of the level 4 page table, indicated by the dashed arrow. +- レベル1テーブルの0番目のエントリをアドレス`24 KiB`のフレームに対応付けることで、破線の矢印で示されているように`0 KiB`の仮想ページからレベル2ページテーブルの物理フレームへの一時的対応付けを行いました。 +- レベル1テーブルの9番目のエントリをアドレス`4 KiB`のフレームに対応付けることで、破線の矢印で示されているように`36 KiB`の仮想ページからレベル4ページテーブルの物理フレームへの一時的対応付を行いました。 -Now the kernel can access the level 2 page table by writing to page `0 KiB` and the level 4 page table by writing to page `36 KiB`. +これで、カーネルは`0 KiB`に書き込むことによってレベル2ページテーブルに、`36 KiB`に書き込むことによってレベル4ページテーブルにアクセスできるようになりました。 -The process for accessing an arbitrary page table frame with temporary mappings would be: +任意のページテーブルに一時的対応付けを用いてアクセスする手続きは以下のようになるでしょう: -- Search for a free entry in the identity-mapped level 1 table. -- Map that entry to the physical frame of the page table that we want to access. -- Access the target frame through the virtual page that maps to the entry. -- Set the entry back to unused thereby removing the temporary mapping again. +- 恒等対応しているレベル1テーブルのうち、使われていないエントリを探す。 +- そのエントリを私達のアクセスしたいページテーブルの物理フレームに対応付ける。 +- そのエントリに対応付けられている仮想ページを通じて、対象のフレームにアクセスする。 +- エントリを未使用に戻すことで、一時的対応付けを削除する。 -This approach reuses the same 512 virtual pages for creating the mappings and thus requires only 4KiB of physical memory. The drawback is that it is a bit cumbersome, especially since a new mapping might require modifications of multiple table levels, which means that we would need to repeat the above process multiple times. +この方法では、同じ512個の下層ページを対応付けを作成するために再利用するため、物理メモリは4KiBしか必要としません。欠点としては、やや面倒であるということが言えるでしょう。特に、新しい対応付けを作る際に複数のページテーブルの変更が必要になるかもしれず、上の手続きを複数回繰り返さなくてはならないかもしれません。 -### Recursive Page Tables +### 再帰的ページテーブル -Another interesting approach, that requires no additional page tables at all, is to **map the page table recursively**. The idea behind this approach is to map some entry of the level 4 page table to the level 4 table itself. By doing this, we effectively reserve a part of the virtual address space and map all current and future page table frames to that space. +他に興味深いアプローチとして、**再帰的にページテーブルを対応付ける**方法があり、この方法では追加のページテーブルは一切不要です。発想としては、レベル4ページテーブルのエントリのどれかをレベル4ページテーブル自体に対応付けるのです。こうすることにより、仮想アドレス空間の一部を予約しておき、現在及び将来のあらゆるページテーブルフレームをその空間に対応付けているのと同じことになります。 -Let's go through an example to understand how this all works: +これがうまく行く理由を説明するために、例を見てみましょう: ![An example 4-level page hierarchy with each page table shown in physical memory. Entry 511 of the level 4 page is mapped to frame 4KiB, the frame of the level 4 table itself.](recursive-page-table.png) -The only difference to the [example at the beginning of this post] is the additional entry at index `511` in the level 4 table, which is mapped to physical frame `4 KiB`, the frame of the level 4 table itself. +[この記事の最初での例][example at the beginning of this post]との唯一の違いは、レベル4テーブルの511番目に、物理フレーム`4 KiB`すなわちレベル4テーブル自体のフレームに対応付けられたエントリが追加されていることです。 -[example at the beginning of this post]: #accessing-page-tables +[example at the beginning of this post]: #peziteburuniakusesusuru -By letting the CPU follow this entry on a translation, it doesn't reach a level 3 table, but the same level 4 table again. This is similar to a recursive function that calls itself, therefore this table is called a _recursive page table_. The important thing is that the CPU assumes that every entry in the level 4 table points to a level 3 table, so it now treats the level 4 table as a level 3 table. This works because tables of all levels have the exact same layout on x86_64. +CPUにこのエントリを辿らせるようにすると、レベル3テーブルではなく、そのレベル4テーブルに再び到達します。これは再帰的関数(自らを呼び出す関数)に似ているので、**再帰的ページテーブル**と呼ばれます。レベル4テーブルのすべてのエントリはレベル3テーブルを指しているとCPUは思っているので、CPUはいまレベル4テーブルをレベル3テーブルとして扱っているということに注目してください。これがうまく行くのは、x86_64においてはすべてのレベルのテーブルが全く同じレイアウトを持っているためです。 -By following the recursive entry one or multiple times before we start the actual translation, we can effectively shorten the number of levels that the CPU traverses. For example, if we follow the recursive entry once and then proceed to the level 3 table, the CPU thinks that the level 3 table is a level 2 table. Going further, it treats the level 2 table as a level 1 table and the level 1 table as the mapped frame. This means that we can now read and write the level 1 page table because the CPU thinks that it is the mapped frame. The graphic below illustrates the 5 translation steps: +実際に変換を始める前に、この再帰エントリを1回以上たどることで、CPUのたどる階層の数を短くできます。例えば、一度再帰的エントリを辿ったあとでレベル3テーブルに進むと、CPUはレベル3テーブルをレベル2テーブルだと思い込みます。同様に、レベル2テーブルをレベル1テーブルだと、レベル1テーブルを対応付けられた(物理)フレームだと思います。CPUがこれを物理フレームだと思っているということは、レベル1ページテーブルを読み書きできるということを意味します。下の図はこの5回の変換ステップを示しています: ![The above example 4-level page hierarchy with 5 arrows: "Step 0" from CR4 to level 4 table, "Step 1" from level 4 table to level 4 table, "Step 2" from level 4 table to level 3 table, "Step 3" from level 3 table to level 2 table, and "Step 4" from level 2 table to level 1 table.](recursive-page-table-access-level-1.png) -Similarly, we can follow the recursive entry twice before starting the translation to reduce the number of traversed levels to two: +同様に、変換の前に再帰エントリを2回たどることで、階層移動の回数を2回に減らせます: ![The same 4-level page hierarchy with the following 4 arrows: "Step 0" from CR4 to level 4 table, "Steps 1&2" from level 4 table to level 4 table, "Step 3" from level 4 table to level 3 table, and "Step 4" from level 3 table to level 2 table.](recursive-page-table-access-level-2.png) -Let's go through it step by step: First, the CPU follows the recursive entry on the level 4 table and thinks that it reaches a level 3 table. Then it follows the recursive entry again and thinks that it reaches a level 2 table. But in reality, it is still on the level 4 table. When the CPU now follows a different entry, it lands on a level 3 table but thinks it is already on a level 1 table. So while the next entry points at a level 2 table, the CPU thinks that it points to the mapped frame, which allows us to read and write the level 2 table. +ステップごとにこれを見てみましょう:まず、CPUはレベル4テーブルの再帰エントリをたどり、レベル3テーブルに着いたと思い込みます。同じ再帰エントリを再びたどり、レベル2テーブルに着いたと考えます。しかし実際にはまだレベル4テーブルから動いていません。CPUが異なるエントリをたどると、レベル3テーブルに到着するのですが、CPUはレベル1にすでにいるのだと思っています。そのため、次のエントリはレベル2テーブルを指しているのですが、CPUは対応付けられた物理フレームを指していると思うので、私達はレベル2テーブルを読み書きできるというわけです。 -Accessing the tables of levels 3 and 4 works in the same way. For accessing the level 3 table, we follow the recursive entry three times, tricking the CPU into thinking it is already on a level 1 table. Then we follow another entry and reach a level 3 table, which the CPU treats as a mapped frame. For accessing the level 4 table itself, we just follow the recursive entry four times until the CPU treats the level 4 table itself as the mapped frame (in blue in the graphic below). +レベル3や4のテーブルにアクセスするのも同じやり方でできます。レベル3テーブルにアクセスするためには、再帰エントリを3回たどることでCPUを騙し、すでにレベル1テーブルにいると思い込ませます。そこで別のエントリをたどりレベル3テーブルに着くと、CPUはそれを対応付けられたフレームとして扱います。レベル4テーブル自体にアクセスするには、再帰エントリを4回辿ればCPUはそのレベル4テーブル自体を対応付けられたフレームとして扱ってくれるというわけです(下の青紫の矢印)。 ![The same 4-level page hierarchy with the following 3 arrows: "Step 0" from CR4 to level 4 table, "Steps 1,2,3" from level 4 table to level 4 table, and "Step 4" from level 4 table to level 3 table. In blue the alternative "Steps 1,2,3,4" arrow from level 4 table to level 4 table.](recursive-page-table-access-level-3.png) -It might take some time to wrap your head around the concept, but it works quite well in practice. +この概念を理解するのは難しいかもしれませんが、実際これは非常にうまく行くのです。 -In the section below we explain how to construct virtual addresses for following the recursive entry one or multiple times. We will not use recursive paging for our implementation, so you don't need to read it to continue with the post. If it interests you, just click on _"Address Calculation"_ to expand it. +下のセクションでは、再帰エントリをたどるための仮想アドレスを構成する方法について説明します。私達の(カーネルの)実装には再帰的ページングは使わないので、これを読まずに記事の続きを読み進めても構いません。もし興味がおありでしたら、下の「アドレス計算」をクリックして展開してください。 ---
-

Address Calculation

+

アドレス計算

We saw that we can access tables of all levels by following the recursive entry once or multiple times before the actual translation. Since the indexes into the tables of the four levels are derived directly from the virtual address, we need to construct special virtual addresses for this technique. Remember, the page table indexes are derived from the address in the following way: From 803d2e6c7a1966e55e17c6d1c3887459706eb9da Mon Sep 17 00:00:00 2001 From: woodyZootopia Date: Sun, 15 Aug 2021 14:55:34 +0900 Subject: [PATCH 05/28] Translate till the end --- .../09-paging-implementation/index.ja.md | 475 +++++++++--------- 1 file changed, 245 insertions(+), 230 deletions(-) diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md index 58f62a57..34540189 100644 --- a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -10,7 +10,7 @@ translation_based_on_commit = "27ab4518acbb132e327ed4f4f0508393e9d4d684" translators = ["woodyZootopia"] +++ -この記事では私達のカーネルをページングに対応させる方法についてお伝えします。まず物理ページテーブルのフレームにカーネルがアクセスできるようにする様々な方法を示し、それらの利点と欠点について議論します。次にアドレス変換関数を、ついで新しいマッピングを作るための関数を実装します。 +この記事では私達のカーネルをページングに対応させる方法についてお伝えします。まずページテーブルの物理フレームにカーネルがアクセスできるようにする様々な方法を示し、それらの利点と欠点について議論します。次にアドレス変換関数を、ついで新しい対応付けを作るための関数を実装します。 @@ -24,6 +24,8 @@ translators = ["woodyZootopia"] ## 導入 +## 記事へのリンクを日本語のものに直す + [1つ前の記事][previous post]ではページングの概念を説明しました。セグメンテーションと比較することによってページングのメリットを示し、ページングとページテーブルの仕組みを説明し、そして`x86_64`における4層ページテーブルの設計を導入しました。ブートローダはすでにページテーブルの階層構造を設定してしまっているので、私達のカーネルは既に仮想アドレス上で動いているということを学びました。これにより、不正なメモリアクセスは、任意の物理メモリを書き換えてしまう代わりにページフォルト例外を発生させるので、安全性が向上しています。 [previous post]: @/edition-2/posts/08-paging-introduction/index.ja.md @@ -52,24 +54,24 @@ translators = ["woodyZootopia"] ![A virtual and a physical address space with various virtual pages mapped to the physical frame with the same address](identity-mapped-page-tables.svg) -この例では、いくつかの恒等対応したページテーブルのフレームが見てとれます。こうすることで、ページテーブルの物理アドレスは仮想アドレスとしても正当になり、よってCR3レジスタから始めることで全てのレベルのページテーブルに簡単にアクセスできます。 +この例では、いくつかの恒等対応したページテーブルのフレームが見てとれます。こうすることで、ページテーブルの物理アドレスは仮想アドレスと同じ値になり、よってCR3レジスタから始めることで全ての階層のページテーブルに簡単にアクセスできます。 -しかし、この方法では仮想アドレス空間が散らかってしまい、より大きいサイズの連続したメモリを見つけることが難しくなります。例えば、上の図において、[ファイルをメモリにマップする][memory-mapping a file]ために1000KiBの大きさの仮想メモリ領域を作りたいとします。`28KiB`を始点として領域を作ろうとすると、`1004KiB`のところで既存のページと衝突してしまうのでうまくいきません。そのため、`1008KiB`のような、十分な広さで対応付けのない領域が見つかるまで更に探さないといけません。これは[セグメンテーション][segmentation]の時に見た断片化の問題に似ています。 +しかし、この方法では仮想アドレス空間が散らかってしまい、大きいサイズの連続したメモリを見つけることが難しくなります。例えば、上の図において、[ファイルをメモリにマップする][memory-mapping a file]ために1000KiBの大きさの仮想メモリ領域を作りたいとします。`28KiB`を始点として領域を作ろうとすると、`1004KiB`のところで既存のページと衝突してしまうのでうまくいきません。そのため、`1008KiB`のような、十分な広さで対応付けのない領域が見つかるまで更に探さないといけません。これは[セグメンテーション][segmentation]の時に見た断片化の問題に似ています。 [memory-mapping a file]: https://en.wikipedia.org/wiki/Memory-mapped_file [segmentation]: @/edition-2/posts/08-paging-introduction/index.md#fragmentation -同様に、新しいページテーブルを作ることもずっと難しくなります。なぜなら、対応するページがまだ使われていない物理フレームを見つけないといけないからです。例えば、メモリマップト (に対応づけられた) ファイルのために`1008KiB`から1000KiBにわたって仮想メモリを占有したとしましょう。すると、すると、物理アドレス`1000KiB`から`2008KiB`までのフレームは、もう恒等対応を作ることができないので、使用することができません。 +同様に、新しいページテーブルを作ることもずっと難しくなります。なぜなら、対応するページがまだ使われていない物理フレームを見つけないといけないからです。例えば、メモリマップト (に対応づけられた) ファイルのために`1008KiB`から1000KiBにわたって仮想メモリを占有したとしましょう。すると、すると、物理アドレス`1000KiB`から`2008KiB`までのフレームは、もう恒等対応を作ることができないので使用することができません。 ### 固定オフセットの対応づけ -仮想アドレス空間を散らかしてしまうという問題を回避するために、**ページテーブルの対応づけのために別のメモリ領域を使う**ことができます。ページテーブルを恒等対応させる代わりに、仮想アドレス空間で一定のオフセットをおいて対応づけてみましょう。例えば、オフセットを10TiBにしてみましょう: +仮想アドレス空間を散らかしてしまうという問題を回避するために、**ページテーブルの対応づけのために別のメモリ領域を使う**ことができます。ページテーブルを恒等対応させる代わりに、仮想アドレス空間で一定の補正値 (オフセット) をおいて対応づけてみましょう。例えば、オフセットを10TiBにしてみましょう: ![The same figure as for the identity mapping, but each mapped virtual page is offset by 10 TiB.](page-tables-mapped-at-offset.svg) `10TiB`から`10TiB+物理メモリ全体の大きさ`の範囲の仮想メモリをページテーブルの対応付け専用に使うことで、恒等対応のときに存在していた衝突問題を回避しています。このように巨大な領域を仮想アドレス空間内に用意するのは、仮想アドレス空間が物理メモリの大きさより遥かに大きい場合にのみ可能です。x86_64で用いられている48bit(仮想)アドレス空間は256TiBもの大きさがあるので、これは問題ではありません。 -この方法では、新しいページテーブルを作るたびに新しい対応付けを作る必要があるという欠点があります。また、他のアドレス空間のページテーブルにアクセスすることができると、新しいプロセスを作るときに便利なのですがこれも不可能です。 +この方法では、新しいページテーブルを作るたびに新しい対応付けを作る必要があるという欠点があります。また、他のアドレス空間のページテーブルにアクセスすることができると新しいプロセスを作るときに便利なのですが、これも不可能です。 ### 物理メモリ全体を対応付ける @@ -81,7 +83,7 @@ translators = ["woodyZootopia"] この方法の欠点は、物理メモリへの対応付けを格納するために、追加でページテーブルが必要になるところです。これらのページテーブルもどこかに格納されなければならず、したがって物理メモリの一部を占有することになります。これはメモリの量が少ないデバイスにおいては問題となりえます。 -しかし、x86_64においては、通常の4KiBサイズのページに代わって、大きさ2MiBの[huge pages]を対応付けに使うことができます。こうすれば、例えば32GiBの物理メモリを対応付けるのに、レベル3テーブル1個とレベル2テーブル32個があればいいので、たったの132KiBしか必要ではありません。huge pagesは、トランスレーション・ルックアサイド・バッファ (TLB) のエントリをあまり使わないので、キャッシュ的にも効率が良いです。 +しかし、x86_64においては、通常の4KiBサイズのページに代わって、大きさ2MiBの[huge page][huge pages]を対応付けに使うことができます。こうすれば、例えば32GiBの物理メモリを対応付けるのに、レベル3テーブル1個とレベル2テーブル32個があればいいので、たったの132KiBしか必要ではありません。huge pagesは、トランスレーション・ルックアサイド・バッファ (TLB) のエントリをあまり使わないので、キャッシュ的にも効率が良いです。 [huge pages]: https://en.wikipedia.org/wiki/Page_%28computer_memory%29#Multiple_page_sizes @@ -123,7 +125,7 @@ translators = ["woodyZootopia"] CPUにこのエントリを辿らせるようにすると、レベル3テーブルではなく、そのレベル4テーブルに再び到達します。これは再帰的関数(自らを呼び出す関数)に似ているので、**再帰的ページテーブル**と呼ばれます。レベル4テーブルのすべてのエントリはレベル3テーブルを指しているとCPUは思っているので、CPUはいまレベル4テーブルをレベル3テーブルとして扱っているということに注目してください。これがうまく行くのは、x86_64においてはすべてのレベルのテーブルが全く同じレイアウトを持っているためです。 -実際に変換を始める前に、この再帰エントリを1回以上たどることで、CPUのたどる階層の数を短くできます。例えば、一度再帰的エントリを辿ったあとでレベル3テーブルに進むと、CPUはレベル3テーブルをレベル2テーブルだと思い込みます。同様に、レベル2テーブルをレベル1テーブルだと、レベル1テーブルを対応付けられた(物理)フレームだと思います。CPUがこれを物理フレームだと思っているということは、レベル1ページテーブルを読み書きできるということを意味します。下の図はこの5回の変換ステップを示しています: +実際に変換を始める前に、この再帰エントリを1回以上たどることで、CPUのたどる階層の数を短くできます。例えば、一度再帰エントリを辿ったあとでレベル3テーブルに進むと、CPUはレベル3テーブルをレベル2テーブルだと思い込みます。同様に、レベル2テーブルをレベル1テーブルだと、レベル1テーブルを対応付けられた(物理)フレームだと思います。CPUがこれを物理フレームだと思っているということは、レベル1ページテーブルを読み書きできるということを意味します。下の図はこの5回の変換ステップを示しています: ![The above example 4-level page hierarchy with 5 arrows: "Step 0" from CR4 to level 4 table, "Step 1" from level 4 table to level 4 table, "Step 2" from level 4 table to level 3 table, "Step 3" from level 3 table to level 2 table, and "Step 4" from level 2 table to level 1 table.](recursive-page-table-access-level-1.png) @@ -139,74 +141,75 @@ CPUにこのエントリを辿らせるようにすると、レベル3テーブ この概念を理解するのは難しいかもしれませんが、実際これは非常にうまく行くのです。 -下のセクションでは、再帰エントリをたどるための仮想アドレスを構成する方法について説明します。私達の(カーネルの)実装には再帰的ページングは使わないので、これを読まずに記事の続きを読み進めても構いません。もし興味がおありでしたら、下の「アドレス計算」をクリックして展開してください。 +下のセクションでは、再帰エントリをたどるための仮想アドレスを構成する方法について説明します。私達の(OSの)実装には再帰的ページングは使わないので、これを読まずに記事の続きを読み進めても構いません。もし興味がおありでしたら、下の「アドレス計算」をクリックして展開してください。 ---

アドレス計算

-We saw that we can access tables of all levels by following the recursive entry once or multiple times before the actual translation. Since the indexes into the tables of the four levels are derived directly from the virtual address, we need to construct special virtual addresses for this technique. Remember, the page table indexes are derived from the address in the following way: +実際の変換の前に再帰的移動を1回または複数回行うことですべての階層のテーブルにアクセスできるということを見てきました。4つのテーブルそれぞれのどのインデクスが使われるかは仮想アドレスから直接計算されていましたから、再帰エントリを使うためには特別な仮想アドレスを作り出す必要があります。ページテーブルのインデクスは仮想アドレスから以下のように計算されていたことを思い出してください: ![Bits 0–12 are the page offset, bits 12–21 the level 1 index, bits 21–30 the level 2 index, bits 30–39 the level 3 index, and bits 39–48 the level 4 index](../paging-introduction/x86_64-table-indices-from-address.svg) -Let's assume that we want to access the level 1 page table that maps a specific page. As we learned above, this means that we have to follow the recursive entry one time before continuing with the level 4, level 3, and level 2 indexes. To do that we move each block of the address one block to the right and set the original level 4 index to the index of the recursive entry: +あるページを対応付けているレベル1テーブルにアクセスしたいとします。上で学んだように、このためには再帰エントリを1度辿ってからレベル4,3,2のインデクスへと続けていく必要があります。これをするために、それぞれのアドレスブロックを一つ右にずらし、レベル4のインデクスがあったところに再帰エントリのインデクスをセットします: ![Bits 0–12 are the offset into the level 1 table frame, bits 12–21 the level 2 index, bits 21–30 the level 3 index, bits 30–39 the level 4 index, and bits 39–48 the index of the recursive entry](table-indices-from-address-recursive-level-1.svg) -For accessing the level 2 table of that page, we move each index block two blocks to the right and set both the blocks of the original level 4 index and the original level 3 index to the index of the recursive entry: +そのページのレベル2テーブルにアクセスしたい場合、それぞれのブロックを2つ右にずらし、レベル4と3のインデクスがあったところに再帰エントリのインデクスをセットします: ![Bits 0–12 are the offset into the level 2 table frame, bits 12–21 the level 3 index, bits 21–30 the level 4 index, and bits 30–39 and bits 39–48 are the index of the recursive entry](table-indices-from-address-recursive-level-2.svg) -Accessing the level 3 table works by moving each block three blocks to the right and using the recursive index for the original level 4, level 3, and level 2 address blocks: +レベル3テーブルにアクセスする場合、それぞれのブロックを3つ右にずらし、レベル4,3,2のインデクスがあったところに再帰インデクスを使います: ![Bits 0–12 are the offset into the level 3 table frame, bits 12–21 the level 4 index, and bits 21–30, bits 30–39 and bits 39–48 are the index of the recursive entry](table-indices-from-address-recursive-level-3.svg) -Finally, we can access the level 4 table by moving each block four blocks to the right and using the recursive index for all address blocks except for the offset: +最後に、レベル4テーブルにはそれぞれのブロックを4ブロックずらし、オフセットを除いてすべてのアドレスブロックに再帰インデクスを使うことでアクセスできます: ![Bits 0–12 are the offset into the level l table frame and bits 12–21, bits 21–30, bits 30–39 and bits 39–48 are the index of the recursive entry](table-indices-from-address-recursive-level-4.svg) We can now calculate virtual addresses for the page tables of all four levels. We can even calculate an address that points exactly to a specific page table entry by multiplying its index by 8, the size of a page table entry. +これで、4つの階層すべてのページテーブルの仮想アドレスを計算できます。 -The table below summarizes the address structure for accessing the different kinds of frames: +下の表は、それぞれの種類のフレームにアクセスするためのアドレス構造をまとめたものです: -Virtual Address for | Address Structure ([octal]) -------------------- | ------------------------------- -Page | `0o_SSSSSS_AAA_BBB_CCC_DDD_EEEE` -Level 1 Table Entry | `0o_SSSSSS_RRR_AAA_BBB_CCC_DDDD` -Level 2 Table Entry | `0o_SSSSSS_RRR_RRR_AAA_BBB_CCCC` -Level 3 Table Entry | `0o_SSSSSS_RRR_RRR_RRR_AAA_BBBB` -Level 4 Table Entry | `0o_SSSSSS_RRR_RRR_RRR_RRR_AAAA` +……の仮想アドレス | アドレス構造([8進][octal]) +------------------- | ------------------------------- +ページ | `0o_SSSSSS_AAA_BBB_CCC_DDD_EEEE` +レベル1テーブルエントリ | `0o_SSSSSS_RRR_AAA_BBB_CCC_DDDD` +レベル2テーブルエントリ | `0o_SSSSSS_RRR_RRR_AAA_BBB_CCCC` +レベル3テーブルエントリ | `0o_SSSSSS_RRR_RRR_RRR_AAA_BBBB` +レベル4テーブルエントリ | `0o_SSSSSS_RRR_RRR_RRR_RRR_AAAA` [octal]: https://en.wikipedia.org/wiki/Octal -Whereas `AAA` is the level 4 index, `BBB` the level 3 index, `CCC` the level 2 index, and `DDD` the level 1 index of the mapped frame, and `EEEE` the offset into it. `RRR` is the index of the recursive entry. When an index (three digits) is transformed to an offset (four digits), it is done by multiplying it by 8 (the size of a page table entry). With this offset, the resulting address directly points to the respective page table entry. +ただし、`AAA`がレベル4インデクス、`BBB`がレベル3インデクス、`CCC`がレベル2インデクス、`DDD`が対応付けられたフレームのレベル1インデクス、`EEE`がオフセットです。`RRR`が再帰エントリのインデクスです。インデクス(3ケタ)をオフセット(4ケタ)に変換するときは、8倍(ページテーブルエントリのサイズ倍)しています。 -`SSSSSS` are sign extension bits, which means that they are all copies of bit 47. This is a special requirement for valid addresses on the x86_64 architecture. We explained it in the [previous post][sign extension]. +`SSSSS`は符号拡張ビットです、すなわち47番目のビットのコピーです。これはx86_64におけるアドレスの特殊な要求の一つです。これは[前回の記事][sign extension]で説明しました。 [sign extension]: @/edition-2/posts/08-paging-introduction/index.md#paging-on-x86-64 -We use [octal] numbers for representing the addresses since each octal character represents three bits, which allows us to clearly separate the 9-bit indexes of the different page table levels. This isn't possible with the hexadecimal system where each character represents four bits. +[8進][octal]数を用いたのは、8進数の1文字が3ビットを表すため、9ビットからなるそれぞれのページテーブルをきれいに分けることができるためです。4ビットからなる16進ではこうはいきません。 -##### In Rust Code +##### Rustのコードでは…… -To construct such addresses in Rust code, you can use bitwise operations: +これらのアドレスをRustのコードで構成するには、ビット演算を用いるとよいです: ```rust -// the virtual address whose corresponding page tables you want to access +// この仮想アドレスに対応するページテーブルにアクセスしたい let addr: usize = […]; -let r = 0o777; // recursive index -let sign = 0o177777 << 48; // sign extension +let r = 0o777; // 再帰インデクス +let sign = 0o177777 << 48; // 符号拡張 -// retrieve the page table indices of the address that we want to translate -let l4_idx = (addr >> 39) & 0o777; // level 4 index -let l3_idx = (addr >> 30) & 0o777; // level 3 index -let l2_idx = (addr >> 21) & 0o777; // level 2 index -let l1_idx = (addr >> 12) & 0o777; // level 1 index +// 変換したいアドレスのページテーブルインデクスを取得する +let l4_idx = (addr >> 39) & 0o777; // レベル4インデクス +let l3_idx = (addr >> 30) & 0o777; // レベル3インデクス +let l2_idx = (addr >> 21) & 0o777; // レベル2インデクス +let l1_idx = (addr >> 12) & 0o777; // レベル1インデクス let page_offset = addr & 0o7777; -// calculate the table addresses +// テーブルアドレスを計算する let level_4_table_addr = sign | (r << 39) | (r << 30) | (r << 21) | (r << 12); let level_3_table_addr = @@ -217,9 +220,10 @@ let level_1_table_addr = sign | (r << 39) | (l4_idx << 30) | (l3_idx << 21) | (l2_idx << 12); ``` -The above code assumes that the last level 4 entry with index `0o777` (511) is recursively mapped. This isn't the case currently, so the code won't work yet. See below on how to tell the bootloader to set up the recursive mapping. +上のコードは、レベル4エントリの最後(インデクス`0o777`すなわち511)が再帰対応していると仮定しています。この対応はまだ行っていないので、この仮定は正しくありません。以下でブートローダに再帰対応付けを設定させる方法を説明します。 Alternatively to performing the bitwise operations by hand, you can use the [`RecursivePageTable`] type of the `x86_64` crate, which provides safe abstractions for various page table operations. For example, the code below shows how to translate a virtual address to its mapped physical address: +ビット演算を自前で行う代わりに、`x86_64`クレートの[`RecursivePageTable`]型を使うこともできます。これは様々なページ操作の安全な抽象化を提供します。例えば、以下のコードは仮想アドレスを対応付けられた物理アドレスに変換する方法を示しています [`RecursivePageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html @@ -229,7 +233,7 @@ Alternatively to performing the bitwise operations by hand, you can use the [`Re use x86_64::structures::paging::{Mapper, Page, PageTable, RecursivePageTable}; use x86_64::{VirtAddr, PhysAddr}; -/// Creates a RecursivePageTable instance from the level 4 address. +/// レベル4アドレスからRecursivePageTableインスタンスをつくる let level_4_table_addr = […]; let level_4_table_ptr = level_4_table_addr as *mut PageTable; let recursive_page_table = unsafe { @@ -238,63 +242,65 @@ let recursive_page_table = unsafe { } -/// Retrieve the physical address for the given virtual address +/// 与えられた仮想アドレスの物理アドレスを取得する let addr: u64 = […] let addr = VirtAddr::new(addr); let page: Page = Page::containing_address(addr); -// perform the translation +// 変換を実行する let frame = recursive_page_table.translate_page(page); frame.map(|frame| frame.start_address() + u64::from(addr.page_offset())) ``` -Again, a valid recursive mapping is required for this code. With such a mapping, the missing `level_4_table_addr` can be calculated as in the first code example. +繰り返しになりますが、このコード(が正しく実行される)には正しい再帰対応がなされていることが必要となります。この対応付けがあるなら、空欄になっている`level_4_table_addr`を最初のコード例と同じ値にすればよいです。
--- -Recursive Paging is an interesting technique that shows how powerful a single mapping in a page table can be. It is relatively easy to implement and only requires a minimal amount of setup (just a single recursive entry), so it's a good choice for first experiments with paging. +再帰的ページングは、ページテーブルのたった一つの対応付けがいかに強力に使えるかを示す興味深いテクニックです。比較的実装するのが簡単であり、ほとんど設定も必要でない(一つ再帰エントリを作るだけ)ので、ページングを使って最初に実装するのに格好の対象でしょう。 -However, it also has some disadvantages: +しかし、いくつか欠点もあります: -- It occupies a large amount of virtual memory (512GiB). This isn't a big problem in the large 48-bit address space, but it might lead to suboptimal cache behavior. -- It only allows accessing the currently active address space easily. Accessing other address spaces is still possible by changing the recursive entry, but a temporary mapping is required for switching back. We described how to do this in the (outdated) [_Remap The Kernel_] post. -- It heavily relies on the page table format of x86 and might not work on other architectures. +- 大量の仮想メモリ領域(512GiB)を占有してしまう。私達の使っている48bitアドレス空間は巨大なのでこのことはさしたる問題にはなりませんが、キャッシュの挙動が最適でなくなってしまうかもしれません。 +- 現在有効なアドレス空間にしか簡単にはアクセスできない。他のアドレス空間にアクセスするのは再帰エントリを変更することで可能ではあるものの、もとに戻すためには一時的対応付けが必要。これを行う方法については[カーネルをリマップする][_Remap The Kernel_](未訳、また旧版のため情報が古い)という記事を読んでください。 +- x86のページテーブルの方式に強く依存しており、他のアーキテクチャでは動作しないかもしれない。 [_Remap The Kernel_]: https://os.phil-opp.com/remap-the-kernel/#overview -## Bootloader Support +## ブートローダのサポート -All of these approaches require page table modifications for their setup. For example, mappings for the physical memory need to be created or an entry of the level 4 table needs to be mapped recursively. The problem is that we can't create these required mappings without an existing way to access the page tables. +これらのアプローチはすべて、準備のためにページテーブルに対する修正が必要になります。例えば、物理メモリへの対応付けを作ったり、レベル4テーブルのエントリを再帰的に対応付けたりなどです。問題は、これらの必要な対応付けを作るためには、すでにページテーブルにアクセスできるようになっていなければいけないということです。 -This means that we need the help of the bootloader, which creates the page tables that our kernel runs on. The bootloader has access to the page tables, so it can create any mappings that we need. In its current implementation, the `bootloader` crate has support for two of the above approaches, controlled through [cargo features]: +これが意味するのは、私達のカーネルが使うページテーブルを作っている、ブートローダの手助けが必要になるということです。ブートローダはページテーブルへのアクセスができますから、私達の必要とするどんな対応付けも作れます。`bootloader`クレートは上の2つのアプローチをどちらもサポートしており、現在の実装においては[cargoのfeatures][cargo features]を使ってこれらをコントロールします。 [cargo features]: https://doc.rust-lang.org/cargo/reference/features.html#the-features-section -- The `map_physical_memory` feature maps the complete physical memory somewhere into the virtual address space. Thus, the kernel can access all physical memory and can follow the [_Map the Complete Physical Memory_](#map-the-complete-physical-memory) approach. -- With the `recursive_page_table` feature, the bootloader maps an entry of the level 4 page table recursively. This allows the kernel to access the page tables as described in the [_Recursive Page Tables_](#recursive-page-tables) section. +- `map_physical_memory` featureを使うと、全物理メモリを仮想アドレス空間のどこかに対応付けます。そのため、カーネルはすべての物理メモリにアクセスでき、[上で述べた方法に従って物理メモリ全体を対応付ける](#wu-li-memoriquan-ti-wodui-ying-fu-keru)ことができます。 +- `recursive_page_table` featureでは、ブートローダはレベル4ページテーブルのエントリを再帰的に対応付けます。これによりカーネルは[再帰的ページテーブル](#zai-gui-de-peziteburu)で述べた方法に従ってページテーブルにアクセスすることができます。 + +私達のカーネルには、シンプルでプラットフォーム非依存でより強力である(ページテーブルのフレームでないメモリにもアクセスできる)1つ目の方法を取ることにします。必要なブートローダの機能 (feature) を有効化するために、`map_physical_memory` featureを`bootloader`のdependencyに追加します。 -We choose the first approach for our kernel since it is simple, platform-independent, and more powerful (it also allows access to non-page-table-frames). To enable the required bootloader support, we add the `map_physical_memory` feature to our `bootloader` dependency: ```toml [dependencies] bootloader = { version = "0.9.8", features = ["map_physical_memory"]} ``` -With this feature enabled, the bootloader maps the complete physical memory to some unused virtual address range. To communicate the virtual address range to our kernel, the bootloader passes a _boot information_ structure. +この機能を有効化すると、ブートローダは物理メモリの全体を、とある未使用の仮想アドレス空間に対応付けます。この仮想アドレスの範囲をカーネルに伝えるために、ブートローダは**boot information**構造体を渡します。 + ### Boot Information -The `bootloader` crate defines a [`BootInfo`] struct that contains all the information it passes to our kernel. The struct is still in an early stage, so expect some breakage when updating to future [semver-incompatible] bootloader versions. With the `map_physical_memory` feature enabled, it currently has the two fields `memory_map` and `physical_memory_offset`: +`bootloader`クレートは、カーネルに渡されるすべての情報を格納する[`BootInfo`]構造体を定義しています。この構造体はまだ開発の初期段階にあり、将来の[対応していないsemverの][semver-incompatible]ブートローダのバージョンに更新した際には、うまく動かなくなることが予想されます。`map_physical_memory` featureが有効化されているので、いまこれは`memory_map`と`physical_memory_offset`という2つのフィールドを持っています: [`BootInfo`]: https://docs.rs/bootloader/0.9.3/bootloader/bootinfo/struct.BootInfo.html [semver-incompatible]: https://doc.rust-lang.org/stable/cargo/reference/specifying-dependencies.html#caret-requirements -- The `memory_map` field contains an overview of the available physical memory. This tells our kernel how much physical memory is available in the system and which memory regions are reserved for devices such as the VGA hardware. The memory map can be queried from the BIOS or UEFI firmware, but only very early in the boot process. For this reason, it must be provided by the bootloader because there is no way for the kernel to retrieve it later. We will need the memory map later in this post. -- The `physical_memory_offset` tells us the virtual start address of the physical memory mapping. By adding this offset to a physical address, we get the corresponding virtual address. This allows us to access arbitrary physical memory from our kernel. +- `memory_map`フィールドは、利用可能な物理メモリの情報の概要を保持しています。システムの利用可能な物理メモリがどのくらいかや、どのメモリ領域がVGAハードウェアのようなデバイスのために予約されているかをカーネルに伝えます。これらのメモリ対応付けはBIOSやUEFIファームウェアからブートのごく初期に限り取得することが可能です。そのため、これらをカーネルが後で取得することはできないので、ブートローダによって提供する必要があるわけです。このメモリ対応付けは後で必要となります。 +- `physical_memory_offset`は、物理メモリの対応付けの始まっている仮想アドレスです。このオフセットを物理アドレスに追加することによって、対応する仮想アドレスを得られます。これによって、カーネルから任意の物理アドレスにアクセスできます。 -The bootloader passes the `BootInfo` struct to our kernel in the form of a `&'static BootInfo` argument to our `_start` function. We don't have this argument declared in our function yet, so let's add it: +ブートローダは`BootInfo`構造体を`_start`関数の`&'static BootInfo`引数という形でカーネルに渡します。この引数は私達の関数ではまだ宣言していなかったので追加します: ```rust // in src/main.rs @@ -302,18 +308,18 @@ The bootloader passes the `BootInfo` struct to our kernel in the form of a `&'st use bootloader::BootInfo; #[no_mangle] -pub extern "C" fn _start(boot_info: &'static BootInfo) -> ! { // new argument +pub extern "C" fn _start(boot_info: &'static BootInfo) -> ! { // 新しい引数 […] } ``` -It wasn't a problem to leave off this argument before because the x86_64 calling convention passes the first argument in a CPU register. Thus, the argument is simply ignored when it isn't declared. However, it would be a problem if we accidentally used a wrong argument type, since the compiler doesn't know the correct type signature of our entry point function. +今までこの引数を無視していましたが、x86_64の呼出し規約は最初の引数をCPUレジスタに渡していたため、これは問題ではありませんでした。つまり、引数が宣言されていなかったとき、単に無視されていたわけです。しかし、もし引数の型を間違えてしまうと、コンパイラが私達のエントリポイント関数の正しい型シグネチャがわからなくなってしまうので、それは問題です。 -### The `entry_point` Macro +### `entry_point`マクロ -Since our `_start` function is called externally from the bootloader, no checking of our function signature occurs. This means that we could let it take arbitrary arguments without any compilation errors, but it would fail or cause undefined behavior at runtime. +私達の`_start`関数はブートローダから外部呼び出しされるので、私達の関数のシグネチャに対する検査は行われません。これにより、コンパイルエラーなしにあらゆる引数を取ることを許してしまい、いざ実行時にエラーになったり未定義動作を起こしてしまいます。 -To make sure that the entry point function has always the correct signature that the bootloader expects, the `bootloader` crate provides an [`entry_point`] macro that provides a type-checked way to define a Rust function as the entry point. Let's rewrite our entry point function to use this macro: +私達のエントリポイント関数が常にブートローダの期待する正しいシグネチャを持っていることを保証するために、`bootloader`クレートは[`entry_point`]マクロによって、Rustの関数をエントリポイントとして型チェックしながら定義する方法を提供します。私達のエントリポイントをこのマクロを使って書き直してみましょう: [`entry_point`]: https://docs.rs/bootloader/0.6.4/bootloader/macro.entry_point.html @@ -329,9 +335,9 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { } ``` -We no longer need to use `extern "C"` or `no_mangle` for our entry point, as the macro defines the real lower level `_start` entry point for us. The `kernel_main` function is now a completely normal Rust function, so we can choose an arbitrary name for it. The important thing is that it is type-checked so that a compilation error occurs when we use a wrong function signature, for example by adding an argument or changing the argument type. +このマクロが本物の`_start`エントリポイントをより低レベルに定義してくれるので、`extern "C"`や`no_mangle`をエントリポイントに使う必要はもうありません。`kernel_main`関数は今や完全に普通のRustの関数なので、自由に名前をつけることができます。そして重要なのは、これは型チェックされているので、間違った関数シグネチャ(例えば引数を増やしたり引数の型を変えたり)にするとコンパイルエラーが発生するということです。 -Let's perform the same change in our `lib.rs`: +`lib.rs`に同じ変更を施しましょう: ```rust // in src/lib.rs @@ -342,23 +348,23 @@ use bootloader::{entry_point, BootInfo}; #[cfg(test)] entry_point!(test_kernel_main); -/// Entry point for `cargo test` +/// `cargo test`のエントリポイント #[cfg(test)] fn test_kernel_main(_boot_info: &'static BootInfo) -> ! { - // like before + // 前と同じ init(); test_main(); hlt_loop(); } ``` -Since the entry point is only used in test mode, we add the `#[cfg(test)]` attribute to all items. We give our test entry point the distinct name `test_kernel_main` to avoid confusion with the `kernel_main` of our `main.rs`. We don't use the `BootInfo` parameter for now, so we prefix the parameter name with a `_` to silence the unused variable warning. +こちらのエントリポイントはテストモードのときにのみ使用するので、`#[cfg(test)]`属性をすべての要素に付しています。`main.rs`の`kernel_main`関数と混同しないよう、`test_kernel_main`という別の名前をつけました。いまのところ`BootInfo`引数は使わないので、引数名の先頭に`_`をつけることでunused variable (未使用変数) 警告が出てくるのを防いでいます。 -## Implementation +## 実装 -Now that we have access to physical memory, we can finally start to implement our page table code. First, we will take a look at the currently active page tables that our kernel runs on. In the second step, we will create a translation function that returns the physical address that a given virtual address is mapped to. As the last step, we will try to modify the page tables in order to create a new mapping. +物理メモリへのアクセスができるようになったので、いよいよページテーブルのコードを実装できます。そのためにまず、現在有効な、私達のカーネルが使用しているページテーブルを見てみます。次に、与えられた仮想アドレスが対応付けられている物理アドレスを返す変換関数を作ります。最後に新しい対応付けを作るためにページテーブルを修正してみます。 -Before we begin, we create a new `memory` module for our code: +始める前に、`memory`モジュールを作ります: ```rust // in src/lib.rs @@ -366,11 +372,11 @@ Before we begin, we create a new `memory` module for our code: pub mod memory; ``` -For the module we create an empty `src/memory.rs` file. +このモジュールに合わせて`src/memory.rs`ファイルを作ります。 -### Accessing the Page Tables +### ページテーブルにアクセスする -At the [end of the previous post], we tried to take a look at the page tables our kernel runs on, but failed since we couldn't access the physical frame that the `CR3` register points to. We're now able to continue from there by creating an `active_level_4_table` function that returns a reference to the active level 4 page table: +[前の記事の最後]で、私達のカーネルの実行しているページテーブルを見てみようとしましたが、`CR3`レジスタの指す物理フレームにアクセスすることができなかったためそれはできませんでした。前回の続きとして、`active_level_4_table`という、現在有効 (アクティブ) なレベル4ページテーブルへの参照を返す関数を定義するところから始めましょう: [end of the previous post]: @/edition-2/posts/08-paging-introduction/index.md#accessing-the-page-tables @@ -382,12 +388,14 @@ use x86_64::{ VirtAddr, }; -/// Returns a mutable reference to the active level 4 table. +/// 有効なレベル4テーブルへの可変参照を返す。 /// -/// This function is unsafe because the caller must guarantee that the -/// complete physical memory is mapped to virtual memory at the passed -/// `physical_memory_offset`. Also, this function must be only called once -/// to avoid aliasing `&mut` references (which is undefined behavior). +/// この関数はunsafeである:全物理メモリが、渡された +/// `physical_memory_offset`(だけずらしたうえ)で +/// 仮想メモリへと対応付けられていることを呼び出し元が +/// 保証しなければならない。また、`&mut`参照が複数の +/// 名称を持つこと (mutable aliasingといい、動作が未定義) +/// につながるため、この関数は一度しか呼び出してはならない。 pub unsafe fn active_level_4_table(physical_memory_offset: VirtAddr) -> &'static mut PageTable { @@ -403,11 +411,11 @@ pub unsafe fn active_level_4_table(physical_memory_offset: VirtAddr) } ``` -First, we read the physical frame of the active level 4 table from the `CR3` register. We then take its physical start address, convert it to an `u64`, and add it to `physical_memory_offset` to get the virtual address where the page table frame is mapped. Finally, we convert the virtual address to a `*mut PageTable` raw pointer through the `as_mut_ptr` method and then unsafely create a `&mut PageTable` reference from it. We create a `&mut` reference instead of a `&` reference because we will mutate the page tables later in this post. +まず、有効なレベル4テーブルの物理フレームを`CR3`レジスタから読みます。その開始物理アドレスを取り出し、`u64`に変換し、`physical_memory_offset`に足すことでそのページテーブルフレームに対応する仮想アドレスを得ます。最後に、`as_mut_ptr`メソッドを使ってこの仮想アドレスを`*mut PageTable`生ポインタに変換し、これから`&mut PageTable`参照を作ります(ここがunsafe)。`&`参照ではなく`&mut`参照にしているのは、後でこのページテーブルを変更するためです。 -We don't need to use an unsafe block here because Rust treats the complete body of an `unsafe fn` like a large `unsafe` block. This makes our code more dangerous since we could accidentally introduce an unsafe operation in previous lines without noticing. It also makes it much more difficult to spot the unsafe operations. There is an [RFC](https://github.com/rust-lang/rfcs/pull/2585) to change this behavior. +Rustは`unsafe fn`の中身全体を大きな`unsafe`ブロックであるかのように扱うので、ここでunsafeブロックを使う必要はありません。これでは、(unsafeを意図した)最後の行より前の行に間違ってunsafeな操作を書いても気づけないので、コードがより危険になります。また、どこがunsafeな操作であるのかを探すのも非常に難しくなります。そのため、この挙動を変更する[RFC](https://github.com/rust-lang/rfcs/pull/2585)が提案されています。 -We can now use this function to print the entries of the level 4 table: +この関数を使って、レベル4テーブルのエントリを出力してみましょう: ```rust // in src/main.rs @@ -437,34 +445,34 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { } ``` -First, we convert the `physical_memory_offset` of the `BootInfo` struct to a [`VirtAddr`] and pass it to the `active_level_4_table` function. We then use the `iter` function to iterate over the page table entries and the [`enumerate`] combinator to additionally add an index `i` to each element. We only print non-empty entries because all 512 entries wouldn't fit on the screen. +まず、`BootInfo`構造体の`physical_memory_offset`を[`VirtAddr`]に変換し、`active_level_4_table`関数に渡します。つぎに`iter`関数を使ってページテーブルの全エントリに対してfor文を回し、[`enumerate`]コンビネータをつかってそれぞれの要素にインデックス`i`を追加します。全512エントリを出力すると画面に収まらないので、 (から) でないエントリのみ出力します。 [`VirtAddr`]: https://docs.rs/x86_64/0.14.2/x86_64/addr/struct.VirtAddr.html [`enumerate`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.enumerate -When we run it, we see the following output: +実行すると、以下の出力を得ます: ![QEMU printing entry 0 (0x2000, PRESENT, WRITABLE, ACCESSED), entry 1 (0x894000, PRESENT, WRITABLE, ACCESSED, DIRTY), entry 31 (0x88e000, PRESENT, WRITABLE, ACCESSED, DIRTY), entry 175 (0x891000, PRESENT, WRITABLE, ACCESSED, DIRTY), and entry 504 (0x897000, PRESENT, WRITABLE, ACCESSED, DIRTY)](qemu-print-level-4-table.png) -We see that there are various non-empty entries, which all map to different level 3 tables. There are so many regions because kernel code, kernel stack, the physical memory mapping, and the boot information all use separate memory areas. +いくつかの空でないエントリがあり、いずれも異なるレベル3テーブルに対応づけられていることがわかります。このようにたくさんの領域があるのは、カーネルコード、カーネルスタック、物理メモリ対応、ブート情報が互いに離れたメモリ領域を使っているためです。 -To traverse the page tables further and take a look at a level 3 table, we can take the mapped frame of an entry convert it to a virtual address again: +ページテーブルを更に辿りレベル3テーブルを見るには、エントリに対応するフレームを取り出し再び仮想アドレスに変換すればよいです: ```rust -// in the `for` loop in src/main.rs +// src/main.rsのforループ内にて…… use x86_64::structures::paging::PageTable; if !entry.is_unused() { println!("L4 Entry {}: {:?}", i, entry); - // get the physical address from the entry and convert it + // このエントリから物理アドレスを得て、それを変換する let phys = entry.frame().unwrap().start_address(); let virt = phys.as_u64() + boot_info.physical_memory_offset; let ptr = VirtAddr::new(virt).as_mut_ptr(); let l3_table: &PageTable = unsafe { &*ptr }; - // print non-empty entries of the level 3 table + // レベル3テーブルの空でないエントリを出力する for (i, entry) in l3_table.iter().enumerate() { if !entry.is_unused() { println!(" L3 Entry {}: {:?}", i, entry); @@ -473,25 +481,25 @@ if !entry.is_unused() { } ``` -For looking at the level 2 and level 1 tables, we repeat that process for the level 3 and level 2 entries. As you can imagine, this gets very verbose quickly, so we don't show the full code here. +レベル2やレベル1のテーブルも、同じ手続きをレベル3とレベル2のエントリに対して繰り返すことで見ることができます。お察しの通りそれを書くとかなり長くなるので、コードの全てはここには示しません。 -Traversing the page tables manually is interesting because it helps to understand how the CPU performs the translation. However, most of the time we are only interested in the mapped physical address for a given virtual address, so let's create a function for that. +ページテーブルを手作業で辿ると、CPUが変換を行う様子を理解できて面白いです。しかし、多くの場合は与えられた仮想アドレスに対応する物理アドレスにのみ興味があるので、そのための関数を作りましょう。 -### Translating Addresses +### アドレスの変換 -For translating a virtual to a physical address, we have to traverse the four-level page table until we reach the mapped frame. Let's create a function that performs this translation: +仮想アドレスを物理アドレスに変換するには、4層のページテーブルを辿って対応するフレームにたどり着けばよいです。この変換を行う関数を作りましょう: ```rust // in src/memory.rs use x86_64::PhysAddr; -/// Translates the given virtual address to the mapped physical address, or -/// `None` if the address is not mapped. +/// 与えられた仮想アドレスを対応する物理アドレスに変換し、 +/// そのアドレスが対応付けられていないなら`None`を返す。 /// -/// This function is unsafe because the caller must guarantee that the -/// complete physical memory is mapped to virtual memory at the passed -/// `physical_memory_offset`. +/// この関数はunsafeである。なぜなら、呼び出し元は全物理メモリが与えられた +/// `physical_memory_offset`(だけずらした上)で対応付けられていることを +/// 保証しなくてはならないからである。 pub unsafe fn translate_addr(addr: VirtAddr, physical_memory_offset: VirtAddr) -> Option { @@ -499,25 +507,26 @@ pub unsafe fn translate_addr(addr: VirtAddr, physical_memory_offset: VirtAddr) } ``` -We forward the function to a safe `translate_addr_inner` function to limit the scope of `unsafe`. As we noted above, Rust treats the complete body of an unsafe fn like a large unsafe block. By calling into a private safe function, we make each `unsafe` operation explicit again. +`unsafe`の範囲を制限するために、この関数は、すぐにunsafeでない`translate_addr_inner`関数に制御を渡しています。先に述べたように、Rustはunsafeな関数の全体をunsafeブロックとして扱ってしまいます。呼び出した非公開の (プライベートな) unsafeでない関数の中にコードを書くことで、それぞれのunsafeな操作を明確にします。 -The private inner function contains the real implementation: +非公開な内部の関数に本当の実装を書いていきます: ```rust // in src/memory.rs -/// Private function that is called by `translate_addr`. +/// `translate_addr`により呼び出される非公開関数。 /// -/// This function is safe to limit the scope of `unsafe` because Rust treats -/// the whole body of unsafe functions as an unsafe block. This function must -/// only be reachable through `unsafe fn` from outside of this module. +/// Rustはunsafeな関数の全体をunsafeブロックとして扱ってしまうので、 +/// unsafeの範囲を絞るためにこの関数はunsafeにしていない。 +/// この関数をモジュール外から呼び出すときは、 +/// unsafeな関数を通じてのみ呼び出すこと。 fn translate_addr_inner(addr: VirtAddr, physical_memory_offset: VirtAddr) -> Option { use x86_64::structures::paging::page_table::FrameError; use x86_64::registers::control::Cr3; - // read the active level 4 frame from the CR3 register + // 有効なレベル4フレームをCR3レジスタから読む let (level_4_table_frame, _) = Cr3::read(); let table_indexes = [ @@ -525,56 +534,57 @@ fn translate_addr_inner(addr: VirtAddr, physical_memory_offset: VirtAddr) ]; let mut frame = level_4_table_frame; - // traverse the multi-level page table + // 複数層のページテーブルを辿る for &index in &table_indexes { - // convert the frame into a page table reference + // フレームをページテーブルの参照に変換する let virt = physical_memory_offset + frame.start_address().as_u64(); let table_ptr: *const PageTable = virt.as_ptr(); let table = unsafe {&*table_ptr}; - // read the page table entry and update `frame` + // ページテーブルエントリを読んで、`frame`を更新する let entry = &table[index]; frame = match entry.frame() { Ok(frame) => frame, Err(FrameError::FrameNotPresent) => return None, Err(FrameError::HugeFrame) => panic!("huge pages not supported"), + //huge pageはサポートしていません }; } - // calculate the physical address by adding the page offset + // ページオフセットを足すことで、目的の物理アドレスを計算する Some(frame.start_address() + u64::from(addr.page_offset())) } ``` -Instead of reusing our `active_level_4_table` function, we read the level 4 frame from the `CR3` register again. We do this because it simplifies this prototype implementation. Don't worry, we will create a better solution in a moment. +先程作った`active_level_4_table`関数を再利用せず、`CR3`レジスタからレベル4フレームを読み出すコードを再び書いています。これは簡単に試作するためであり、後でもっと良い方法で作り直すのでご心配なく。 -The `VirtAddr` struct already provides methods to compute the indexes into the page tables of the four levels. We store these indexes in a small array because it allows us to traverse the page tables using a `for` loop. Outside of the loop, we remember the last visited `frame` to calculate the physical address later. The `frame` points to page table frames while iterating, and to the mapped frame after the last iteration, i.e. after following the level 1 entry. +`Virtaddr`構造体には、インデクスから4つの階層のページテーブルを計算してくれるメソッドが備わっています。この4つのインデクスを配列に格納することで、これらを`for`ループを使って辿ります。`for`ループを抜けたら、最後に計算した`frame`を覚えているので、物理アドレスを計算できます。この`frame`は、forループの中ではページテーブルのフレームを指していて、最後のループのあと(すなわちレベル1エントリを辿ったあと)では対応する(物理)フレームを指しています。 -Inside the loop, we again use the `physical_memory_offset` to convert the frame into a page table reference. We then read the entry of the current page table and use the [`PageTableEntry::frame`] function to retrieve the mapped frame. If the entry is not mapped to a frame we return `None`. If the entry maps a huge 2MiB or 1GiB page we panic for now. +ループの中の話をします。前と同じように`physical_memory_offset`を使ってフレームをページテーブルの参照に変換します。次に、そのページテーブルのエントリを読み、[`PageTableEntry::frame`]関数を使って対応するフレームを取得します。もしエントリがフレームに対応付けられていなければ`None`を返します。もしエントリが2MiBや1GiBのhuge pageに対応付けられていたら、今のところはpanicすることにします。 [`PageTableEntry::frame`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/page_table/struct.PageTableEntry.html#method.frame -Let's test our translation function by translating some addresses: +いくつかのアドレスを変換して、この変換関数がうまく行くかテストしてみましょう: ```rust // in src/main.rs fn kernel_main(boot_info: &'static BootInfo) -> ! { - // new import + // 新しいインポート use blog_os::memory::translate_addr; - […] // hello world and blog_os::init + […] // hello world と blog_os::init let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset); let addresses = [ - // the identity-mapped vga buffer page + // 恒等対応しているVGAバッファのページ 0xb8000, - // some code page + // コードページのどこか 0x201008, - // some stack page + // スタックページのどこか 0x0100_0020_1a10, - // virtual address mapped to physical address 0 + // 物理アドレス "0" に対応付けられている仮想アドレス boot_info.physical_memory_offset, ]; @@ -584,28 +594,28 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { println!("{:?} -> {:?}", virt, phys); } - […] // test_main(), "it did not crash" printing, and hlt_loop() + […] // test_main(), "it did not crash" の出力, および hlt_loop() } ``` -When we run it, we see the following output: +実行すると、以下の出力を得ます: ![0xb8000 -> 0xb8000, 0x201008 -> 0x401008, 0x10000201a10 -> 0x279a10, "panicked at 'huge pages not supported'](qemu-translate-addr.png) -As expected, the identity-mapped address `0xb8000` translates to the same physical address. The code page and the stack page translate to some arbitrary physical addresses, which depend on how the bootloader created the initial mapping for our kernel. It's worth noting that the last 12 bits always stay the same after translation, which makes sense because these bits are the [_page offset_] and not part of the translation. +期待したとおり、恒等対応しているアドレス`0xb8000`は同じ物理アドレスに変換されました。コードページとスタックページは物理アドレスのどこかしかに変換されていますが、その場所はブートローダが私達のカーネルのために最初に作った対応づけに依存します。また、下から12ビットは変換のあとも常に同じであるということも注目に値します:この部分は[ページオフセット][_page offset_]であり、変換には関わらないためです。 [_page offset_]: @/edition-2/posts/08-paging-introduction/index.md#paging-on-x86-64 -Since each physical address can be accessed by adding the `physical_memory_offset`, the translation of the `physical_memory_offset` address itself should point to physical address `0`. However, the translation fails because the mapping uses huge pages for efficiency, which is not supported in our implementation yet. +それぞれの物理アドレスは`physical_memory_offset`を足すことでアクセスできるわけですから、`physical_memory_offset`自体を(仮想アドレスとして)変換すると物理アドレス`0`を指すはずです。しかし、効率よく対応付けを行うためにここではhuge pageが使われており、これはまだサポートしていないので変換には失敗しています。 -### Using `OffsetPageTable` +### `OffsetPageTable`を使う -Translating virtual to physical addresses is a common task in an OS kernel, therefore the `x86_64` crate provides an abstraction for it. The implementation already supports huge pages and several other page table functions apart from `translate_addr`, so we will use it in the following instead of adding huge page support to our own implementation. +仮想アドレスから物理アドレスへの変換はOSのカーネルがよく行うことですから、`x86_64`クレートはそのための抽象化を提供しています。この実装はすでにhuge pageや`translate_addr`以外の様々な関数もサポートしているので、以下ではhuge pageのサポートを自前で実装する代わりにこれを使うことにします。 -The base of the abstraction are two traits that define various page table mapping functions: +この抽象化の基礎となっているのは、様々なページテーブル対応付け関数を定義している2つのトレイトです。 -- The [`Mapper`] trait is generic over the page size and provides functions that operate on pages. Examples are [`translate_page`], which translates a given page to a frame of the same size, and [`map_to`], which creates a new mapping in the page table. -- The [`Translate`] trait provides functions that work with multiple page sizes such as [`translate_addr`] or the general [`translate`]. +- [`Mapper`]トレイトはページサイズを型引数とする汎用型 (ジェネリクス) です。例えば、[`translate_page`]は与えられたページを同じサイズのフレームに変換し、[`map_to`]はページテーブルに新しい対応付けを作成します。 +- [`Translate`] トレイトは[`translate_addr`]や一般の[`translate`]のような、さまざまなページサイズに対して動くような関数を提供します。 [`Mapper`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Mapper.html [`translate_page`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Mapper.html#tymethod.translate_page @@ -614,95 +624,97 @@ The base of the abstraction are two traits that define various page table mappin [`translate_addr`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Translate.html#method.translate_addr [`translate`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Translate.html#tymethod.translate -The traits only define the interface, they don't provide any implementation. The `x86_64` crate currently provides three types that implement the traits with different requirements. The [`OffsetPageTable`] type assumes that the complete physical memory is mapped to the virtual address space at some offset. The [`MappedPageTable`] is a bit more flexible: It only requires that each page table frame is mapped to the virtual address space at a calculable address. Finally, the [`RecursivePageTable`] type can be used to access page table frames through [recursive page tables](#recursive-page-tables). +これらのトレイトはインターフェイスを定義しているだけであり、その実装は何一つ提供していません。`x86_64`クレートは現在、このトレイトを実装する型を異なる要件に合わせて3つ用意しています。[`OffsetPageTable`]型は、全物理メモリがあるオフセットで仮想アドレスに対応していることを前提とします。[`MappedPageTable`]はもう少し融通が効き、それぞれのページテーブルフレームが計算可能などこかの仮想アドレスに対応していることだけを前提とします。最後に[`RecursivePageTable`]型は、ページテーブルのフレームに[再帰的ページテーブル](#zai-gui-de-peziteburu)を使ってアクセスするときに使えます。 [`OffsetPageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html [`MappedPageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.MappedPageTable.html [`RecursivePageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html -In our case, the bootloader maps the complete physical memory at a virtual address specified by the `physical_memory_offset` variable, so we can use the `OffsetPageTable` type. To initialize it, we create a new `init` function in our `memory` module: +私達の場合、ブートローダは全物理メモリを`physical_memory_offset`変数で指定された仮想アドレスで物理メモリに対応付けているので、`OffsetPageTable`型を使えます。これを初期化するために、`memory`モジュールに新しく`init`関数を作りましょう: ```rust use x86_64::structures::paging::OffsetPageTable; -/// Initialize a new OffsetPageTable. +/// 新しいOffsetPageTableを初期化する。 /// -/// This function is unsafe because the caller must guarantee that the -/// complete physical memory is mapped to virtual memory at the passed -/// `physical_memory_offset`. Also, this function must be only called once -/// to avoid aliasing `&mut` references (which is undefined behavior). +/// この関数はunsafeである:全物理メモリが、渡された +/// `physical_memory_offset`(だけずらしたうえ)で +/// 仮想メモリへと対応付けられていることを呼び出し元が +/// 保証しなければならない。また、`&mut`参照が複数の +/// 名称を持つこと (mutable aliasingといい、動作が未定義) +/// につながるため、この関数は一度しか呼び出してはならない。 pub unsafe fn init(physical_memory_offset: VirtAddr) -> OffsetPageTable<'static> { let level_4_table = active_level_4_table(physical_memory_offset); OffsetPageTable::new(level_4_table, physical_memory_offset) } -// make private +// これは非公開にする unsafe fn active_level_4_table(physical_memory_offset: VirtAddr) -> &'static mut PageTable {…} ``` -The function takes the `physical_memory_offset` as an argument and returns a new `OffsetPageTable` instance with a `'static` lifetime. This means that the instance stays valid for the complete runtime of our kernel. In the function body, we first call the `active_level_4_table` function to retrieve a mutable reference to the level 4 page table. We then invoke the [`OffsetPageTable::new`] function with this reference. As the second parameter, the `new` function expects the virtual address at which the mapping of the physical memory starts, which is given in the `physical_memory_offset` variable. +この関数は`physical_memory_offset`を引数としてとり、`'static`ライフタイムを持つ`OffsetPageTable`を作って返します。このライフタイムは、私達のカーネルが実行している間この実体 (インスタンス) はずっと有効であるという意味です。関数の中ではまず`active_level_4_table`関数を呼び出し、レベル4ページテーブルへの可変参照を取得します。次に[`OffsetPageTable::new`]関数をこの参照を使って呼び出します。この`new`関数の第二引数には、物理メモリの対応付けの始まる仮想アドレスが入ることになっています。つまり`physical_memory_offset`です。 [`OffsetPageTable::new`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html#method.new -The `active_level_4_table` function should be only called from the `init` function from now on because it can easily lead to aliased mutable references when called multiple times, which can cause undefined behavior. For this reason, we make the function private by removing the `pub` specifier. +可変参照が複数の名称を持つと未定義動作を起こす可能性があるので、以降`active_level_4_table`関数は`init`関数から一度呼び出されることを除いては呼び出されてはなりません。そのため、`pub`指定子を外してこの関数を非公開にしています。 -We now can use the `Translate::translate_addr` method instead of our own `memory::translate_addr` function. We only need to change a few lines in our `kernel_main`: +これで、自前の`memory::translate_addr`関数の代わりに`Translate::translate_addr`メソッドを使うことができます。これには`kernel_main`を数行だけ書き換えればよいです: ```rust // in src/main.rs fn kernel_main(boot_info: &'static BootInfo) -> ! { - // new: different imports + // インポートが追加・変更されている use blog_os::memory; use x86_64::{structures::paging::Translate, VirtAddr}; - […] // hello world and blog_os::init + […] // hello worldとblog_os::init let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset); - // new: initialize a mapper + // 追加:mapperを初期化 let mapper = unsafe { memory::init(phys_mem_offset) }; - let addresses = […]; // same as before + let addresses = […]; // 前と同じ for &address in &addresses { let virt = VirtAddr::new(address); - // new: use the `mapper.translate_addr` method + // 追加:`mapper.translate_addr`メソッドを使う let phys = mapper.translate_addr(virt); println!("{:?} -> {:?}", virt, phys); } - […] // test_main(), "it did not crash" printing, and hlt_loop() + […] // test_main(), "it did not crash" の出力, および hlt_loop() } ``` -We need to import the `Translate` trait in order to use the [`translate_addr`] method it provides. +[`translate_addr`]メソッドを使うために、それを提供している`Translate`トレイトをインポートする必要があります。 -When we run it now, we see the same translation results as before, with the difference that the huge page translation now also works: +これを実行すると、同じ変換結果が得られますが、今度はhuge pageの変換もうまく行っています: ![0xb8000 -> 0xb8000, 0x201008 -> 0x401008, 0x10000201a10 -> 0x279a10, 0x18000000000 -> 0x0](qemu-mapper-translate-addr.png) -As expected, the translations of `0xb8000` and the code and stack addresses stay the same as with our own translation function. Additionally, we now see that the virtual address `physical_memory_offset` is mapped to the physical address `0x0`. +想定通り、`0xb8000`やコード・スタックアドレスの変換結果は自前の変換関数と同じになっています。また、`physical_memory_offset`は物理アドレス`0x0`に対応付けられているのもわかります。 -By using the translation function of the `MappedPageTable` type we can spare ourselves the work of implementing huge page support. We also have access to other page functions such as `map_to`, which we will use in the next section. +`MappedPageTable`型の変換関数を使うことで、huge pageをサポートする手間が省けます。また`map_to`のような他のページング関数も利用でき、これは次のセクションで使います。 -At this point we no longer need our `memory::translate_addr` and `memory::translate_addr_inner` functions, so we can delete them. +この時点で、自作した`memory::translate_addr`関数や`memory::translate_addr_inner`関数はもう必要ではないので、削除して構いません。 -### Creating a new Mapping +### 新しい対応を作る -Until now we only looked at the page tables without modifying anything. Let's change that by creating a new mapping for a previously unmapped page. +これまでページテーブルを見てきましたが修正はしていませんでした。対応のなかったページに対応を作ることで、ページテーブルを修正してみましょう。 -We will use the [`map_to`] function of the [`Mapper`] trait for our implementation, so let's take a look at that function first. The documentation tells us that it takes four arguments: the page that we want to map, the frame that the page should be mapped to, a set of flags for the page table entry, and a `frame_allocator`. The frame allocator is needed because mapping the given page might require creating additional page tables, which need unused frames as backing storage. +これを実装するには[`Mapper`]トレイトの[`map_to`]関数を使うので、この関数について少し見てみましょう。ドキュメントによると四つ引数があります:対応に使うページ、ページを対応させるフレーム、ページテーブルエントリにつかうフラグの集合、そして`frame_allocator`です。フレームアロケータ (frame allocator) (フレームを割り当てる (アロケートする) 機能を持つ)が必要な理由は、与えられたページを対応付けるために追加でページテーブルを作成する必要があるかもしれず、これを格納するためには使われていないフレームが必要となるからです。 [`map_to`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/trait.Mapper.html#tymethod.map_to [`Mapper`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/trait.Mapper.html -#### A `create_example_mapping` Function +#### `create_example_mapping`関数 -The first step of our implementation is to create a new `create_example_mapping` function that maps a given virtual page to `0xb8000`, the physical frame of the VGA text buffer. We choose that frame because it allows us to easily test if the mapping was created correctly: We just need to write to the newly mapped page and see whether we see the write appear on the screen. +私達が実装していく最初のステップとして、`create_example_mapping`関数という、与えられた仮想ページを`0xb8000`すなわちVGAテキストバッファの物理フレームに対応付ける関数を作ってみましょう。このフレームを選んだ理由は、対応付けが正しくなされたかをテストするのが容易だからです:対応付けたページに書き込んで、それが画面に現れるか確認するだけでよいのですから。 -The `create_example_mapping` function looks like this: +`create_example_mapping`は以下のようになります: ```rust // in src/memory.rs @@ -712,7 +724,7 @@ use x86_64::{ structures::paging::{Page, PhysFrame, Mapper, Size4KiB, FrameAllocator} }; -/// Creates an example mapping for the given page to frame `0xb8000`. +/// 与えられたページをフレーム`0xb8000`に試しに対応付ける。 pub fn create_example_mapping( page: Page, mapper: &mut OffsetPageTable, @@ -724,27 +736,27 @@ pub fn create_example_mapping( let flags = Flags::PRESENT | Flags::WRITABLE; let map_to_result = unsafe { - // FIXME: this is not safe, we do it only for testing + // FIXME: unsafeであり、テストのためにのみ行う mapper.map_to(page, frame, flags, frame_allocator) }; map_to_result.expect("map_to failed").flush(); } ``` -In addition to the `page` that should be mapped, the function expects a mutable reference to an `OffsetPageTable` instance and a `frame_allocator`. The `frame_allocator` parameter uses the [`impl Trait`][impl-trait-arg] syntax to be [generic] over all types that implement the [`FrameAllocator`] trait. The trait is generic over the [`PageSize`] trait to work with both standard 4KiB pages and huge 2MiB/1GiB pages. We only want to create a 4KiB mapping, so we set the generic parameter to `Size4KiB`. +この関数は、対応付ける`page`に加え`OffsetPageTable`のインスタンスと`frame_allocator`への可変参照を引数に取ります。`frame_allocator`引数は[`impl Trait`][impl-trait-arg]構文により[`FrameAllocator`]トレイトを実装するあらゆる型の[汎用型][generic]になっています。`FrameAllocator`トレイトは[`PageSize`]トレイトを実装するなら(引数のサイズが)4KiBでも2MiBや1GiBのhuge pageでも大丈夫な汎用 (ジェネリック) トレイトです。私達は4KiBの対応付けのみを作りたいので、ジェネリック引数は`Size4KiB`にしています。 [impl-trait-arg]: https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters [generic]: https://doc.rust-lang.org/book/ch10-00-generics.html [`FrameAllocator`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/trait.FrameAllocator.html [`PageSize`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/page/trait.PageSize.html -The [`map_to`] method is unsafe because the caller must ensure that the frame is not already in use. The reason for this is that mapping the same frame twice could result in undefined behavior, for example when two different `&mut` references point to the same physical memory location. In our case, we reuse the VGA text buffer frame, which is already mapped, so we break the required condition. However, the `create_example_mapping` function is only a temporary testing function and will be removed after this post, so it is ok. To remind us of the unsafety, we put a `FIXME` comment on the line. +[`map_to`]メソッドは、呼び出し元がフレームはまだ使われていないことを保証しないといけないので、unsafeです。なぜなら、同じフレームを二度対応付けると(例えば2つの異なる`&mut`参照が物理メモリの同じ場所を指すことで)未定義動作を起こす可能性があるからです。今回、VGAテキストバッファのフレームという、すでに対応付けられているフレームを再度使っているので、この要件を破ってしまっています。しかしながら、`create_example_mapping`関数は一時的なテスト関数でありこの記事のあとには取り除かれるので、大丈夫です。この危険性 (unsafety) のことを忘れないようにするために、その行に`FIXME` (要修正) コメントをつけておきます。 -In addition to the `page` and the `unused_frame`, the `map_to` method takes a set of flags for the mapping and a reference to the `frame_allocator`, which will be explained in a moment. For the flags, we set the `PRESENT` flag because it is required for all valid entries and the `WRITABLE` flag to make the mapped page writable. For a list of all possible flags, see the [_Page Table Format_] section of the previous post. +`map_to`関数が`page`と`unused_frame`に加えてフラグの集合と`frame_allocator`への参照を取りますが、これについてはすぐに説明します。フラグについては、`PRESENT`フラグという有効なエントリ全てに必須のフラグと、`WRITABLE`フラグという対応するページを書き込み可能にするフラグをセットしています。フラグの一覧については、前記事の[ページテーブルの形式][_Page Table Format_]を参照してください。 [_Page Table Format_]: @/edition-2/posts/08-paging-introduction/index.md#page-table-format -The [`map_to`] function can fail, so it returns a [`Result`]. Since this is just some example code that does not need to be robust, we just use [`expect`] to panic when an error occurs. On success, the function returns a [`MapperFlush`] type that provides an easy way to flush the newly mapped page from the translation lookaside buffer (TLB) with its [`flush`] method. Like `Result`, the type uses the [`#[must_use]`][must_use] attribute to emit a warning when we accidentally forget to use it. +[`map_to`]関数は失敗しうるので、[`Result`]を返します。これは失敗しても構わない単なるテストコードなので、エラーが起きたときは[`expect`]を使ってパニックしてしまうことにします。この関数は成功したとき[`MapperFlush`]型を返します。この型の[`flush`]メソッドを使うと、新しく対応させたページをトランスレーション・ルックアサイド・バッファ (TLB) から簡単にflushすることができます。この型は`Result`と同じく[`#[must_use]`][must_use]属性を使っており、使用し忘れると警告を出します。 [`Result`]: https://doc.rust-lang.org/core/result/enum.Result.html [`expect`]: https://doc.rust-lang.org/core/result/enum.Result.html#method.expect @@ -752,16 +764,16 @@ The [`map_to`] function can fail, so it returns a [`Result`]. Since this is just [`flush`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.MapperFlush.html#method.flush [must_use]: https://doc.rust-lang.org/std/result/#results-must-be-used -#### A dummy `FrameAllocator` +#### ダミーの`FrameAllocator` -To be able to call `create_example_mapping` we need to create a type that implements the `FrameAllocator` trait first. As noted above, the trait is responsible for allocating frames for new page table if they are needed by `map_to`. +`create_example_mapping`関数を呼べるようにするためには、まず`FrameAllocator`トレイトを実装する型を作成する必要があります。上で述べたように、このトレイトは新しいページのためのフレームを`map_to`が必要としたときに割り当てる役割を持っています。 -Let's start with the simple case and assume that we don't need to create new page tables. For this case, a frame allocator that always returns `None` suffices. We create such an `EmptyFrameAllocator` for testing our mapping function: +単純なケースを考えましょう:新しいページテーブルを作る必要がないと仮定してしまいます。この場合、常に`None`を返すフレームアロケータで十分です。私達の対応付け関数をテストするために、そのような`EmptyFrameAllocator`を作ります。 ```rust // in src/memory.rs -/// A FrameAllocator that always returns `None`. +/// つねに`None`を返すFrameAllocator pub struct EmptyFrameAllocator; unsafe impl FrameAllocator for EmptyFrameAllocator { @@ -771,69 +783,70 @@ unsafe impl FrameAllocator for EmptyFrameAllocator { } ``` -Implementing the `FrameAllocator` is unsafe because the implementer must guarantee that the allocator yields only unused frames. Otherwise undefined behavior might occur, for example when two virtual pages are mapped to the same physical frame. Our `EmptyFrameAllocator` only returns `None`, so this isn't a problem in this case. +`FrameAllocator`を実装するのはunsafeです。なぜなら、実装する人は、作ったアロケータが未使用のフレームのみ取得することを保証しなければならないからです。さもなくば、例えば二つの仮想ページが同じ物理フレームに対応付けられたときに未定義動作が起こるかもしれません。この`EmptyFrameAllocator`は`None`しか返さないので、これは問題ではありません。 -#### Choosing a Virtual Page +#### 仮想ページを選ぶ -We now have a simple frame allocator that we can pass to our `create_example_mapping` function. However, the allocator always returns `None`, so this will only work if no additional page table frames are needed for creating the mapping. To understand when additional page table frames are needed and when not, let's consider an example: +`create_example_mapping`関数に渡すための単純なフレームアロケータを手に入れました。しかし、このアロケータは常に`None`を返すので、対応を作る際に追加のページテーブルフレームが必要でなかったときにのみうまく行きます。いつ追加のページテーブルフレームが必要でありいつそうでないのかを知るために、例をとって考えてみましょう: ![A virtual and a physical address space with a single mapped page and the page tables of all four levels](required-page-frames-example.svg) -The graphic shows the virtual address space on the left, the physical address space on the right, and the page tables in between. The page tables are stored in physical memory frames, indicated by the dashed lines. The virtual address space contains a single mapped page at address `0x803fe00000`, marked in blue. To translate this page to its frame, the CPU walks the 4-level page table until it reaches the frame at address 36 KiB. +この図の左は仮想アドレス空間を、右は物理アドレス空間を、真ん中はページテーブルを示します。このページテーブルが格納されている物理フレームが破線で示されています。仮想アドレス空間は一つの対応付けられたページをアドレス`0x803fe00000`に持っており、これは青色で示されています。このページをフレームに変換するために、CPUは4層のページテーブルを辿り、アドレス36KiBのフレームに到達します。 -Additionally, the graphic shows the physical frame of the VGA text buffer in red. Our goal is to map a previously unmapped virtual page to this frame using our `create_example_mapping` function. Since our `EmptyFrameAllocator` always returns `None`, we want to create the mapping so that no additional frames are needed from the allocator. This depends on the virtual page that we select for the mapping. +また、この図はVGAテキストバッファの物理フレームを赤色で示しています。私達の目的は、`create_example_mapping`関数を使ってまだ対応付けられていない仮想ページをこのフレームに対応付けることです。私達の`EmptyFrameAllocator`は常に`None`を返すので、アロケータからフレームを追加する必要がないように対応付けを作りたいです。これができるかは、私達が対応付けにどの仮想ページを使うかに依存します。 -The graphic shows two candidate pages in the virtual address space, both marked in yellow. One page is at address `0x803fdfd000`, which is 3 pages before the mapped page (in blue). While the level 4 and level 3 page table indices are the same as for the blue page, the level 2 and level 1 indices are different (see the [previous post][page-table-indices]). The different index into the level 2 table means that a different level 1 table is used for this page. Since this level 1 table does not exist yet, we would need to create it if we chose that page for our example mapping, which would require an additional unused physical frame. In contrast, the second candidate page at address `0x803fe02000` does not have this problem because it uses the same level 1 page table than the blue page. Thus, all required page tables already exist. + +この図の仮想アドレス空間には、2つの候補となるページを黄色で示しています。ページのうち一つはアドレス`0x803fe00000`で、これは(青で示された)対応付けられたページの3つ前です。レベル4と3のテーブルのインデクスは青いページと同じですが、レベル2と1のインデクスは違います([前の記事][page-table-indices]を参照)。レベル2テーブルのインデクスが違うということは、異なるレベル1テーブルが使われることを意味します。そんなレベル1テーブルは存在しないので、もしこちらを使っていたら、使われていない物理フレームを追加(でアロケート)する必要が出てきます。対して、2つ目のアドレス`0x803fe02000`にある候補のページは、青のページと同じレベル1ページテーブルを使うのでこの問題は発生しません。よって、必要となるすべてのページテーブルはすでに存在しています。 [page-table-indices]: @/edition-2/posts/08-paging-introduction/index.md#paging-on-x86-64 -In summary, the difficulty of creating a new mapping depends on the virtual page that we want to map. In the easiest case, the level 1 page table for the page already exists and we just need to write a single entry. In the most difficult case, the page is in a memory region for that no level 3 exists yet so that we need to create new level 3, level 2 and level 1 page tables first. +まとめると、新しい対応を作るときの難易度は、対応付けようとしている仮想ページに依存するということです。作ろうとしているページのレベル1ページテーブルがすでに存在すると最も簡単で、エントリを一つ書き込むだけです。ページがレベル3のテーブルすら存在しない領域にある場合が最も難しく、その場合まずレベル3,2,1のページテーブルを新しく作る必要があります。 -For calling our `create_example_mapping` function with the `EmptyFrameAllocator`, we need to choose a page for that all page tables already exist. To find such a page, we can utilize the fact that the bootloader loads itself in the first megabyte of the virtual address space. This means that a valid level 1 table exists for all pages this region. Thus, we can choose any unused page in this memory region for our example mapping, such as the page at address `0`. Normally, this page should stay unused to guarantee that dereferencing a null pointer causes a page fault, so we know that the bootloader leaves it unmapped. +`EmptyFrameAllocator`を使って`create_example_mapping`を呼び出すためには、すべての(階層の)ページテーブルがすでに存在しているページを選ぶ必要があります。そんなページを探すにあたっては、ブートローダが自分自身を仮想アドレス空間の最初の1メガバイトに読み込んでいるということを利用できます。つまり、この領域のすべてのページについて、レベル1テーブルがきちんと存在しているということです。したがって、試しに対応を作るときに、このメモリ領域のいずれかの未使用ページ、例えばアドレス`0`を使えばよいです。普通このページは、ヌルポインタの参照外しがページフォルトを引き起こすことを保証するために使用しないので、ブートローダもここを対応させてはいないはずです。 -#### Creating the Mapping +#### 対応を作る -We now have all the required parameters for calling our `create_example_mapping` function, so let's modify our `kernel_main` function to map the page at virtual address `0`. Since we map the page to the frame of the VGA text buffer, we should be able to write to the screen through it afterwards. The implementation looks like this: +というわけで、`create_example_mapping`関数を呼び出すために必要なすべての引数を手に入れたので、仮想アドレス`0`を対応付けるよう`kernel_main`関数を変更していきましょう。このページはVGAテキストバッファのフレームに対応付けているので、以後、画面に書き込むことができるはずです。実装は以下のようになります: ```rust // in src/main.rs fn kernel_main(boot_info: &'static BootInfo) -> ! { use blog_os::memory; - use x86_64::{structures::paging::Page, VirtAddr}; // new import + use x86_64::{structures::paging::Page, VirtAddr}; // 新しいインポート - […] // hello world and blog_os::init + […] // hello worldとblog_os::init let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset); let mut mapper = unsafe { memory::init(phys_mem_offset) }; let mut frame_allocator = memory::EmptyFrameAllocator; - // map an unused page + // 未使用のページを対応付ける let page = Page::containing_address(VirtAddr::new(0)); memory::create_example_mapping(page, &mut mapper, &mut frame_allocator); - // write the string `New!` to the screen through the new mapping + // 新しい対応付けを使って、文字列`New!`を画面に書き出す let page_ptr: *mut u64 = page.start_address().as_mut_ptr(); unsafe { page_ptr.offset(400).write_volatile(0x_f021_f077_f065_f04e)}; - […] // test_main(), "it did not crash" printing, and hlt_loop() + […] // test_main(), "it did not crash" printing, および hlt_loop() } ``` -We first create the mapping for the page at address `0` by calling our `create_example_mapping` function with a mutable reference to the `mapper` and the `frame_allocator` instances. This maps the page to the VGA text buffer frame, so we should see any write to it on the screen. +まず、`mapper`と`frame_allocator`インスタンスの可変参照を渡して`create_example_mapping`を呼ぶことで、アドレス`0`のページに対応を作っています。これはVGAテキストバッファのフレームに対応付けているので、これに書き込んだものは何であれ画面に出てくるはずです。 -Then we convert the page to a raw pointer and write a value to offset `400`. We don't write to the start of the page because the top line of the VGA buffer is directly shifted off the screen by the next `println`. We write the value `0x_f021_f077_f065_f04e`, which represents the string _"New!"_ on white background. As we learned [in the _“VGA Text Mode”_ post], writes to the VGA buffer should be volatile, so we use the [`write_volatile`] method. +次にページを生ポインタに変更して、オフセット`400`に値を書き込みます。このページの最初に書き込むとVGAバッファの一番上の行になり、次のprintlnで即座に画面外に流れていってしまうのでそれはしません。値`0x_f021_f077_f065_f04e`は、白背景の"New!"という文字列を表します。[VGAテキストモードの記事][in the _“VGA Text Mode”_ post]で学んだように、VGAバッファへの書き込みはvolatileでなければならないので、[`write_volatile`]メソッドを使っています。 [in the _“VGA Text Mode”_ post]: @/edition-2/posts/03-vga-text-buffer/index.md#volatile [`write_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_volatile -When we run it in QEMU, we see the following output: +QEMUで実行すると、以下の出力を得ます: ![QEMU printing "It did not crash!" with four completely white cells in the middle of the screen](qemu-new-mapping.png) -The _"New!"_ on the screen is by our write to page `0`, which means that we successfully created a new mapping in the page tables. +画面の"New!"はページ`0`への書き込みによるものなので、ページテーブルへの新しい対応付けの作成が成功したということを意味します。 -Creating that mapping only worked because the level 1 table responsible for the page at address `0` already exists. When we try to map a page for that no level 1 table exists yet, the `map_to` function fails because it tries to allocate frames from the `EmptyFrameAllocator` for creating new page tables. We can see that happen when we try to map page `0xdeadbeaf000` instead of `0`: +この対応付けが成功したのは、アドレス`0`を管轄するレベル1テーブルがすでに存在していたからに過ぎません。レベル1テーブルがまだ存在しないページを対応付けようとすると、`map_to`関数は新しいページテーブルを作るために`EmptyFrameAllocator`からフレームを割り当てようとしてエラーになります。`0`の代わりに`0xdeadbeaf000`を対応付けようとするとそれが発生するのが見られます。 ```rust // in src/main.rs @@ -845,35 +858,37 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { } ``` -When we run it, a panic with the following error message occurs: +これを実行すると、以下のエラーメッセージとともにパニックします: ``` panicked at 'map_to failed: FrameAllocationFailed', /…/result.rs:999:5 ``` -To map pages that don't have a level 1 page table yet we need to create a proper `FrameAllocator`. But how do we know which frames are unused and how much physical memory is available? +レベル1テーブルのまだ存在しないページを対応付けるためには、ちゃんとした`FrameAllocator`を作らないといけません。しかし、どのフレームが未使用で、どのフレームが利用可能かはどうすればわかるのでしょう? -### Allocating Frames +### フレームを割り当てる -In order to create new page tables, we need to create a proper frame allocator. For that we use the `memory_map` that is passed by the bootloader as part of the `BootInfo` struct: +新しいページテーブルを作成するためには、ちゃんとしたフレームアロケータを作る必要があります。このためには、ブートローダによって渡される`BootInfo`構造体の一部である`memory_map`を使います: ```rust // in src/memory.rs use bootloader::bootinfo::MemoryMap; -/// A FrameAllocator that returns usable frames from the bootloader's memory map. +/// ブートローダのメモリマップから、使用可能な +/// フレームを返すFrameAllocator pub struct BootInfoFrameAllocator { memory_map: &'static MemoryMap, next: usize, } impl BootInfoFrameAllocator { - /// Create a FrameAllocator from the passed memory map. + /// 渡されたメモリマップからFrameAllocatorを作る。 /// - /// This function is unsafe because the caller must guarantee that the passed - /// memory map is valid. The main requirement is that all frames that are marked - /// as `USABLE` in it are really unused. + /// この関数はunsafeである:呼び出し元は渡された + /// メモリマップが有効であることを保証しなければ + /// ならない。特に、`USABLE`なフレームは実際に + /// 未使用でなくてはならない。 pub unsafe fn init(memory_map: &'static MemoryMap) -> Self { BootInfoFrameAllocator { memory_map, @@ -883,15 +898,15 @@ impl BootInfoFrameAllocator { } ``` -The struct has two fields: A `'static` reference to the memory map passed by the bootloader and a `next` field that keeps track of number of the next frame that the allocator should return. +この構造体は2つのフィールドを持ちます。ブートローダによって渡されたメモリマップへの`'static`な参照と、アロケータが次に返すべきフレームの番号を覚えておくための`next`フィールドです。 -As we explained in the [_Boot Information_](#boot-information) section, the memory map is provided by the BIOS/UEFI firmware. It can only be queried very early in the boot process, so the bootloader already calls the respective functions for us. The memory map consists of a list of [`MemoryRegion`] structs, which contain the start address, the length, and the type (e.g. unused, reserved, etc.) of each memory region. +[_Boot Information_](#boot-information)節で説明したように、このメモリマップはBIOS/UEFIファームウェアから提供されます。これはブートプロセスのごく初期にのみ取得できるので、ブートローダがそのための関数を呼ぶようになっています。メモリマップは`MemoryRegion`構造体のリストからなり、この構造体はそれぞれのメモリ領域の開始アドレス、長さ、型(未使用、予約済み、など)を格納しています。 -The `init` function initializes a `BootInfoFrameAllocator` with a given memory map. The `next` field is initialized with `0` and will be increased for every frame allocation to avoid returning the same frame twice. Since we don't know if the usable frames of the memory map were already used somewhere else, our `init` function must be `unsafe` to require additional guarantees from the caller. +`init`関数は`BootInfoFrameAllocator`を与えられたメモリマップで初期化します。`next`フィールドは`0`で初期化し、フレームを割当てるたびに値を増やすことで同じフレームを二度返すことを防ぎます。メモリマップのusable (使用可能) なフレームが他の誰かに使われたりしていないかは知ることができないので、この`init`関数はそれを呼び出し元に追加で保証させるために`unsafe`でないといけません。 -#### A `usable_frames` Method +#### `usable_frames`メソッド -Before we implement the `FrameAllocator` trait, we add an auxiliary method that converts the memory map into an iterator of usable frames: +`FrameAllocator`トレイトを実装していく前に、渡されたメモリマップをusableなフレームのイテレータに変換する補助メソッドを追加します: ```rust // in src/memory.rs @@ -899,30 +914,30 @@ Before we implement the `FrameAllocator` trait, we add an auxiliary method that use bootloader::bootinfo::MemoryRegionType; impl BootInfoFrameAllocator { - /// Returns an iterator over the usable frames specified in the memory map. + /// メモリマップによって指定されたusableなフレームのイテレータを返す。 fn usable_frames(&self) -> impl Iterator { - // get usable regions from memory map + // メモリマップからusableな領域を得る let regions = self.memory_map.iter(); let usable_regions = regions .filter(|r| r.region_type == MemoryRegionType::Usable); - // map each region to its address range + // それぞれの領域をアドレス範囲にmapで変換する let addr_ranges = usable_regions .map(|r| r.range.start_addr()..r.range.end_addr()); - // transform to an iterator of frame start addresses + // フレームの開始アドレスのイテレータへと変換する let frame_addresses = addr_ranges.flat_map(|r| r.step_by(4096)); - // create `PhysFrame` types from the start addresses + // 開始アドレスから`PhysFrame`型を作る frame_addresses.map(|addr| PhysFrame::containing_address(PhysAddr::new(addr))) } } ``` -This function uses iterator combinator methods to transform the initial `MemoryMap` into an iterator of usable physical frames: +この関数はイテレータのコンビネータメソッドを使って、最初に与えられる`MemoryMap`を使用可能な物理フレームのイテレータに変換します: -- First, we call the `iter` method to convert the memory map to an iterator of [`MemoryRegion`]s. -- Then we use the [`filter`] method to skip any reserved or otherwise unavailable regions. The bootloader updates the memory map for all the mappings it creates, so frames that are used by our kernel (code, data or stack) or to store the boot information are already marked as `InUse` or similar. Thus we can be sure that `Usable` frames are not used somewhere else. -- Afterwards, we use the [`map`] combinator and Rust's [range syntax] to transform our iterator of memory regions to an iterator of address ranges. -- Next, we use [`flat_map`] to transform the address ranges into an iterator of frame start addresses, choosing every 4096th address using [`step_by`]. Since 4096 bytes (= 4 KiB) is the page size, we get the start address of each frame. The bootloader page aligns all usable memory areas so that we don't need any alignment or rounding code here. By using [`flat_map`] instead of `map`, we get an `Iterator` instead of an `Iterator>`. -- Finally, we convert the start addresses to `PhysFrame` types to construct the an `Iterator`. +- まず`iter`メソッドを使ってメモリマップを[`MemoryRegion`]のイテレータに変える。 +- 次に[`filter`]メソッドを使って、予約済みなどの理由で使用不可能な領域を飛ばすようにする。ブートローダは作った対応付けに使ったメモリマップはきちんと更新するので、私達のカーネル(コード、データ、スタック)に使われているフレームやブート情報を格納するのに使われているフレームはすでに`InUse` (使用中) などでマークされています。そのため`Usable`なフレームは他の場所では使われていないはずとわかります。 +- つぎに、[`map`]コンビネータとRustの[range構文][range syntax]を使って、メモリ領域のイテレータからアドレス範囲のイテレータへと変換する。 +- つぎに、アドレス範囲から[`step_by`]で4096個ごとにアドレスを選び、[`flat_map`]を使うことでフレームの最初のアドレスのイテレータを得る。4096バイト(=4KiB)はページのサイズに等しいので、それぞれのフレームの開始地点のアドレスが得られます。ブートローダのページは使用可能なメモリ領域をすべてアラインするので、ここで改めてアラインや丸めを行う必要はありません。`map`ではなく[`flat_map`]を使うことで、`Iterator>`ではなく`Iterator`を得ています。 +- 最後に、開始アドレスの型を`PhysFrame`に変更することで`Iterator`を得ている。 [`MemoryRegion`]: https://docs.rs/bootloader/0.6.4/bootloader/bootinfo/struct.MemoryRegion.html [`filter`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.filter @@ -931,14 +946,14 @@ This function uses iterator combinator methods to transform the initial `MemoryM [`step_by`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.step_by [`flat_map`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.flat_map -The return type of the function uses the [`impl Trait`] feature. This way, we can specify that we return some type that implements the [`Iterator`] trait with item type `PhysFrame`, but don't need to name the concrete return type. This is important here because we _can't_ name the concrete type since it depends on unnamable closure types. +この関数の戻り型は[`impl Trait`]機能を用いています。こうすると、`PhysFrame`をitemの型として持つような[`Iterator`]トレイトを実装する何らかの型を返すのだと指定できます。これは重要です――なぜなら、戻り値の型は名前のつけられないクロージャ型に依存し、具体的な名前をつけるのが**不可能だ**からです。 [`impl Trait`]: https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits [`Iterator`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html -#### Implementing the `FrameAllocator` Trait +#### `FrameAllocator`トレイトを実装する -Now we can implement the `FrameAllocator` trait: +これで`FrameAllocator`トレイトを実装できます: ```rust // in src/memory.rs @@ -952,18 +967,18 @@ unsafe impl FrameAllocator for BootInfoFrameAllocator { } ``` -We first use the `usable_frames` method to get an iterator of usable frames from the memory map. Then, we use the [`Iterator::nth`] function to get the frame with index `self.next` (thereby skipping `(self.next - 1)` frames). Before returning that frame, we increase `self.next` by one so that we return the following frame on the next call. +まず`usable_frames`メソッドを使ってメモリマップからusableなフレームのイテレータを得ます。つぎに、[`Iterator::nth`]関数で`self.next`番目の(つまり`(self.next - 1)`だけ飛ばして)フレームを得ます。このフレームを返してリターンする前に、`self.next`を1だけ増やして次の呼び出しで1つ後のフレームが得られるようにします。 [`Iterator::nth`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.nth -This implementation is not quite optimal since it recreates the `usable_frame` allocator on every allocation. It would be better to directly store the iterator as a struct field instead. Then we wouldn't need the `nth` method and could just call [`next`] on every allocation. The problem with this approach is that it's not possible to store an `impl Trait` type in a struct field currently. It might work someday when [_named existential types_] are fully implemented. +この実装は割当てを行うごとに`usable_frames`アロケータを作り直しているので、あまり最適ではありません。イテレータを構造体のフィールドとして直接格納するほうが良いでしょう。すると`nth`メソッドを使う必要はなくなり、割り当てのたびに[`next`]を使えばいいだけです。このアプローチの問題は、今の所構造体のフィールドに`impl Trait`型(の変数)を格納することができないことです。いつの日か、[named existential type][_named existential types_]が完全に実装されたときにはこれが可能になるかもしれません。 [`next`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#tymethod.next [_named existential types_]: https://github.com/rust-lang/rfcs/pull/2071 -#### Using the `BootInfoFrameAllocator` +#### `BootInfoFrameAllocator`を使う -We can now modify our `kernel_main` function to pass a `BootInfoFrameAllocator` instance instead of an `EmptyFrameAllocator`: +`kernel_main`関数を修正して`EmptyFrameAllocator`のインスタンスの代わりに`BootInfoFrameAllocator`を渡しましょう: ```rust // in src/main.rs @@ -978,28 +993,28 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { } ``` -With the boot info frame allocator, the mapping succeeds and we see the black-on-white _"New!"_ on the screen again. Behind the scenes, the `map_to` method creates the missing page tables in the following way: +ブート情報を使うフレームアロケータのおかげで対応付けは成功し、白背景に黒文字の"New!"が再び画面に現れました。舞台裏では、`map_to`メソッドが不足しているページテーブルを以下のやり方で作っています: -- Allocate an unused frame from the passed `frame_allocator`. -- Zero the frame to create a new, empty page table. -- Map the entry of the higher level table to that frame. -- Continue with the next table level. +- 渡された`frame_allocator`を使って未使用のフレームを割り当てる。 +- フレームをゼロで埋め、新しい空のページテーブルを作る。 +- 上位のテーブルのエントリをそのフレームに対応付ける。 +- 次の層で同じことを続ける。 -While our `create_example_mapping` function is just some example code, we are now able to create new mappings for arbitrary pages. This will be essential for allocating memory or implementing multithreading in future posts. +`create_example_mapping`関数はただのお試しコードにすぎませんが、今や私達は任意のページに対応付けを作れるようになりました。これは、今後の記事で行うメモリ割り当てやマルチスレッディングにおいて不可欠です。 -At this point, we should delete the `create_example_mapping` function again to avoid accidentally invoking undefined behavior, as explained [above](#a-create-example-mapping-function). +[上](#create-example-mappingguan-shu)で説明したような未定義動作を誤って引き起こしてしまうことのないよう、この時点で`create_example_mapping`関数を再び取り除いておきましょう。 -## Summary +## まとめ -In this post we learned about different techniques to access the physical frames of page tables, including identity mapping, mapping of the complete physical memory, temporary mapping, and recursive page tables. We chose to map the complete physical memory since it's simple, portable, and powerful. +この記事ではページテーブルのある物理フレームにアクセスするための様々なテクニックを学びました。恒等対応、物理メモリ全体の対応付け、一時的な対応、再帰的ページテーブルなどです。このうち、シンプルでポータブル(アーキテクチャ非依存という意味)で強力な、物理メモリ全体の対応付けを選びました。 -We can't map the physical memory from our kernel without page table access, so we needed support from the bootloader. The `bootloader` crate supports creating the required mapping through optional cargo features. It passes the required information to our kernel in the form of a `&BootInfo` argument to our entry point function. +ページテーブルにアクセスできなければ物理メモリを対応付けられないので、ブートローダの補助が必要でした。`bootloader`クレートはcargoのfeaturesというオプションを通じて、必要となる対応付けの作成をサポートしています。さらに、必要となる情報をエントリポイント関数の`&BootInfo`引数という形で私達のカーネルに渡してくれます。 -For our implementation, we first manually traversed the page tables to implement a translation function, and then used the `MappedPageTable` type of the `x86_64` crate. We also learned how to create new mappings in the page table and how to create the necessary `FrameAllocator` on top of the memory map passed by the bootloader. +実装について。最初は手作業でページテーブルを辿ることで変換関数を実装し、そのあとで`x86_64`クレートの`MappedPageTable`型を使いました。また、ページテーブルに新しい対応を作る方法や、そのために必要な`FrameAllocator`をブートローダに渡されたメモリマップをラップすることで作る方法を学びました。 -## What's next? +## 次は? -The next post will create a heap memory region for our kernel, which will allow us to [allocate memory] and use various [collection types]. +次の記事では、私達のカーネルのためのヒープメモリ領域を作り、それによって[メモリの割り当て][allocate memory]や各種の[コレクション型][collection types]を使うことが可能になります。 [allocate memory]: https://doc.rust-lang.org/alloc/boxed/struct.Box.html [collection types]: https://doc.rust-lang.org/alloc/collections/index.html From 575547963d269ff53c44e9fb720f3b9655cc166f Mon Sep 17 00:00:00 2001 From: woodyZootopia Date: Sun, 15 Aug 2021 15:15:20 +0900 Subject: [PATCH 06/28] Fix links to Japanese articles --- .../09-paging-implementation/index.ja.md | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md index 34540189..fb70e770 100644 --- a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -24,15 +24,13 @@ translators = ["woodyZootopia"] ## 導入 -## 記事へのリンクを日本語のものに直す - [1つ前の記事][previous post]ではページングの概念を説明しました。セグメンテーションと比較することによってページングのメリットを示し、ページングとページテーブルの仕組みを説明し、そして`x86_64`における4層ページテーブルの設計を導入しました。ブートローダはすでにページテーブルの階層構造を設定してしまっているので、私達のカーネルは既に仮想アドレス上で動いているということを学びました。これにより、不正なメモリアクセスは、任意の物理メモリを書き換えてしまう代わりにページフォルト例外を発生させるので、安全性が向上しています。 [previous post]: @/edition-2/posts/08-paging-introduction/index.ja.md 記事の最後で、[ページテーブルにカーネルからアクセスできない][end of previous post]という問題が起きていました。この問題は、ページテーブルは物理メモリ内に格納されている一方、私達のカーネルは既に仮想アドレス上で実行されているために発生します。この記事ではその続きとして、私達のカーネルからページテーブルのフレームにアクセスするための様々な方法を探ります。それぞれの方法の利点と欠点を議論し、カーネルに採用する手法を決めます。 -[end of previous post]: @/edition-2/posts/08-paging-introduction/index.md#accessing-the-page-tables +[end of previous post]: @/edition-2/posts/08-paging-introduction/index.ja.md#peziteburuhenoakusesu この方法を実装するには、ブートローダーからの補助が必要になるので、まずこれに設定を加えます。その後で、ページテーブルの階層構造を移動して、仮想アドレスを物理アドレスに変換する関数を実装します。最後に、ページテーブルに新しい対応関係を作る方法と、それを作るための未使用メモリを見つける方法を学びます。 @@ -59,7 +57,7 @@ translators = ["woodyZootopia"] しかし、この方法では仮想アドレス空間が散らかってしまい、大きいサイズの連続したメモリを見つけることが難しくなります。例えば、上の図において、[ファイルをメモリにマップする][memory-mapping a file]ために1000KiBの大きさの仮想メモリ領域を作りたいとします。`28KiB`を始点として領域を作ろうとすると、`1004KiB`のところで既存のページと衝突してしまうのでうまくいきません。そのため、`1008KiB`のような、十分な広さで対応付けのない領域が見つかるまで更に探さないといけません。これは[セグメンテーション][segmentation]の時に見た断片化の問題に似ています。 [memory-mapping a file]: https://en.wikipedia.org/wiki/Memory-mapped_file -[segmentation]: @/edition-2/posts/08-paging-introduction/index.md#fragmentation +[segmentation]: @/edition-2/posts/08-paging-introduction/index.ja.md#duan-pian-hua-fragmentation 同様に、新しいページテーブルを作ることもずっと難しくなります。なぜなら、対応するページがまだ使われていない物理フレームを見つけないといけないからです。例えば、メモリマップト (に対応づけられた) ファイルのために`1008KiB`から1000KiBにわたって仮想メモリを占有したとしましょう。すると、すると、物理アドレス`1000KiB`から`2008KiB`までのフレームは、もう恒等対応を作ることができないので使用することができません。 @@ -187,7 +185,7 @@ We can now calculate virtual addresses for the page tables of all four levels. W `SSSSS`は符号拡張ビットです、すなわち47番目のビットのコピーです。これはx86_64におけるアドレスの特殊な要求の一つです。これは[前回の記事][sign extension]で説明しました。 -[sign extension]: @/edition-2/posts/08-paging-introduction/index.md#paging-on-x86-64 +[sign extension]: @/edition-2/posts/08-paging-introduction/index.ja.md#x86-64niokerupezingu [8進][octal]数を用いたのは、8進数の1文字が3ビットを表すため、9ビットからなるそれぞれのページテーブルをきれいに分けることができるためです。4ビットからなる16進ではこうはいきません。 @@ -376,9 +374,9 @@ pub mod memory; ### ページテーブルにアクセスする -[前の記事の最後]で、私達のカーネルの実行しているページテーブルを見てみようとしましたが、`CR3`レジスタの指す物理フレームにアクセスすることができなかったためそれはできませんでした。前回の続きとして、`active_level_4_table`という、現在有効 (アクティブ) なレベル4ページテーブルへの参照を返す関数を定義するところから始めましょう: +[前の記事の最後][end of the previous post]で、私達のカーネルの実行しているページテーブルを見てみようとしましたが、`CR3`レジスタの指す物理フレームにアクセスすることができなかったためそれはできませんでした。前回の続きとして、`active_level_4_table`という、現在有効 (アクティブ) なレベル4ページテーブルへの参照を返す関数を定義するところから始めましょう: -[end of the previous post]: @/edition-2/posts/08-paging-introduction/index.md#accessing-the-page-tables +[end of the previous post]: @/edition-2/posts/08-paging-introduction/index.ja.md#peziteburuhenoakusesu ```rust // in src/memory.rs @@ -604,7 +602,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { 期待したとおり、恒等対応しているアドレス`0xb8000`は同じ物理アドレスに変換されました。コードページとスタックページは物理アドレスのどこかしかに変換されていますが、その場所はブートローダが私達のカーネルのために最初に作った対応づけに依存します。また、下から12ビットは変換のあとも常に同じであるということも注目に値します:この部分は[ページオフセット][_page offset_]であり、変換には関わらないためです。 -[_page offset_]: @/edition-2/posts/08-paging-introduction/index.md#paging-on-x86-64 +[_page offset_]: @/edition-2/posts/08-paging-introduction/index.ja.md#x86-64niokerupezingu それぞれの物理アドレスは`physical_memory_offset`を足すことでアクセスできるわけですから、`physical_memory_offset`自体を(仮想アドレスとして)変換すると物理アドレス`0`を指すはずです。しかし、効率よく対応付けを行うためにここではhuge pageが使われており、これはまだサポートしていないので変換には失敗しています。 @@ -754,7 +752,7 @@ pub fn create_example_mapping( `map_to`関数が`page`と`unused_frame`に加えてフラグの集合と`frame_allocator`への参照を取りますが、これについてはすぐに説明します。フラグについては、`PRESENT`フラグという有効なエントリ全てに必須のフラグと、`WRITABLE`フラグという対応するページを書き込み可能にするフラグをセットしています。フラグの一覧については、前記事の[ページテーブルの形式][_Page Table Format_]を参照してください。 -[_Page Table Format_]: @/edition-2/posts/08-paging-introduction/index.md#page-table-format +[_Page Table Format_]: @/edition-2/posts/08-paging-introduction/index.ja.md#peziteburunoxing-shi [`map_to`]関数は失敗しうるので、[`Result`]を返します。これは失敗しても構わない単なるテストコードなので、エラーが起きたときは[`expect`]を使ってパニックしてしまうことにします。この関数は成功したとき[`MapperFlush`]型を返します。この型の[`flush`]メソッドを使うと、新しく対応させたページをトランスレーション・ルックアサイド・バッファ (TLB) から簡単にflushすることができます。この型は`Result`と同じく[`#[must_use]`][must_use]属性を使っており、使用し忘れると警告を出します。 @@ -798,7 +796,7 @@ unsafe impl FrameAllocator for EmptyFrameAllocator { この図の仮想アドレス空間には、2つの候補となるページを黄色で示しています。ページのうち一つはアドレス`0x803fe00000`で、これは(青で示された)対応付けられたページの3つ前です。レベル4と3のテーブルのインデクスは青いページと同じですが、レベル2と1のインデクスは違います([前の記事][page-table-indices]を参照)。レベル2テーブルのインデクスが違うということは、異なるレベル1テーブルが使われることを意味します。そんなレベル1テーブルは存在しないので、もしこちらを使っていたら、使われていない物理フレームを追加(でアロケート)する必要が出てきます。対して、2つ目のアドレス`0x803fe02000`にある候補のページは、青のページと同じレベル1ページテーブルを使うのでこの問題は発生しません。よって、必要となるすべてのページテーブルはすでに存在しています。 -[page-table-indices]: @/edition-2/posts/08-paging-introduction/index.md#paging-on-x86-64 +[page-table-indices]: @/edition-2/posts/08-paging-introduction/index.ja.md#x86-64niokerupezingu まとめると、新しい対応を作るときの難易度は、対応付けようとしている仮想ページに依存するということです。作ろうとしているページのレベル1ページテーブルがすでに存在すると最も簡単で、エントリを一つ書き込むだけです。ページがレベル3のテーブルすら存在しない領域にある場合が最も難しく、その場合まずレベル3,2,1のページテーブルを新しく作る必要があります。 @@ -837,7 +835,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { 次にページを生ポインタに変更して、オフセット`400`に値を書き込みます。このページの最初に書き込むとVGAバッファの一番上の行になり、次のprintlnで即座に画面外に流れていってしまうのでそれはしません。値`0x_f021_f077_f065_f04e`は、白背景の"New!"という文字列を表します。[VGAテキストモードの記事][in the _“VGA Text Mode”_ post]で学んだように、VGAバッファへの書き込みはvolatileでなければならないので、[`write_volatile`]メソッドを使っています。 -[in the _“VGA Text Mode”_ post]: @/edition-2/posts/03-vga-text-buffer/index.md#volatile +[in the _“VGA Text Mode”_ post]: @/edition-2/posts/03-vga-text-buffer/index.ja.md#volatile [`write_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_volatile QEMUで実行すると、以下の出力を得ます: From 282ed23a99979e704ce6b1064c8a87b57df70640 Mon Sep 17 00:00:00 2001 From: woodyZootopia Date: Tue, 24 Aug 2021 12:03:52 +0900 Subject: [PATCH 07/28] =?UTF-8?q?=E7=BF=BB=E8=A8=B3=E3=82=92=E3=81=95?= =?UTF-8?q?=E3=82=89=E3=81=AB=E6=A0=A1=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../09-paging-implementation/index.ja.md | 102 +++++++++--------- 1 file changed, 50 insertions(+), 52 deletions(-) diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md index fb70e770..791a8f4f 100644 --- a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -40,7 +40,7 @@ translators = ["woodyZootopia"] ![An example 4-level page hierarchy with each page table shown in physical memory](../paging-introduction/x86_64-page-table-translation.svg) -ここで重要なのは、それぞれのページテーブルのエントリは次のテーブルの**物理**アドレスであるということです。これにより、それらのアドレスに対しても変換することを避けられます。もしこの変換が行われたとしたら、性能的にも良くないですし、容易に変換の無限ループに陥りかねません。 +ここで重要なのは、それぞれのページテーブルのエントリは次のテーブルの**物理**アドレスであるということです。これにより、それらのアドレスに対しては変換せずにすみます。もしこの変換が行われたとしたら、性能的にも良くないですし、容易に変換の無限ループに陥りかねません。 問題は、私達のカーネル自体も仮想アドレスの上で動いているため、カーネルから直接物理アドレスにアクセスすることができないということです。例えば、アドレス`4KiB`にアクセスしたとき、私達は**仮想**アドレス`4KiB`にアクセスしているのであって、レベル4ページテーブルが格納されている**物理**アドレス`4KiB`にアクセスしているのではありません。物理アドレス`4KiB`にアクセスしたいなら、それに対応づけられている何らかの仮想アドレスを通じてのみ可能です。 @@ -81,7 +81,7 @@ translators = ["woodyZootopia"] この方法の欠点は、物理メモリへの対応付けを格納するために、追加でページテーブルが必要になるところです。これらのページテーブルもどこかに格納されなければならず、したがって物理メモリの一部を占有することになります。これはメモリの量が少ないデバイスにおいては問題となりえます。 -しかし、x86_64においては、通常の4KiBサイズのページに代わって、大きさ2MiBの[huge page][huge pages]を対応付けに使うことができます。こうすれば、例えば32GiBの物理メモリを対応付けるのに、レベル3テーブル1個とレベル2テーブル32個があればいいので、たったの132KiBしか必要ではありません。huge pagesは、トランスレーション・ルックアサイド・バッファ (TLB) のエントリをあまり使わないので、キャッシュ的にも効率が良いです。 +しかし、x86_64においては、通常の4KiBサイズのページに代わって、大きさ2MiBの[huge page][huge pages]を対応付けに使うことができます。こうすれば、例えば32GiBの物理メモリを対応付けるのにはレベル3テーブル1個とレベル2テーブル32個があればいいので、たったの132KiBしか必要ではありません。huge pagesは、トランスレーション・ルックアサイド・バッファ (TLB) のエントリをあまり使わないので、キャッシュ的にも効率が良いです。 [huge pages]: https://en.wikipedia.org/wiki/Page_%28computer_memory%29#Multiple_page_sizes @@ -91,12 +91,12 @@ translators = ["woodyZootopia"] ![A virtual and a physical address space with an identity mapped level 1 table, which maps its 0th entry to the level 2 table frame, thereby mapping that frame to page with address 0](temporarily-mapped-page-tables.svg) -この図におけるレベル1テーブルは仮想アドレス空間の最初の2MiBを制御しています。なぜなら、このテーブルにはCR3レジスタから始めて、レベル4、3、2のページテーブルの0番目のエントリを辿ることで到達できるからです。8番目のエントリは、アドレス`32 KiB`の仮想アドレスページをアドレス`32 KiB`の物理アドレスページに対応付けるので、レベル1テーブル自体を恒等対応させています。この図ではその恒等対応を`32 KiB`のところの横向きの(茶色の)矢印で表しています。 +この図におけるレベル1テーブルは仮想アドレス空間の最初の2MiBを制御しています。なぜなら、このテーブルにはCR3レジスタから始めて、レベル4、3、2のページテーブルの0番目のエントリを辿ることで到達できるからです。その8番目のエントリは、アドレス`32 KiB`の仮想アドレスページをアドレス`32 KiB`の物理アドレスページに対応付けるので、レベル1テーブル自体を恒等対応させています。この図ではその恒等対応を`32 KiB`のところの横向きの(茶色の)矢印で表しています。 恒等対応させたレベル1テーブルに書き込むことによって、カーネルは最大511個の一時的な対応を作ることができます(512から、恒等対応に必要な1つを除く)。上の例では、カーネルは2つの一時的な対応を作りました: - レベル1テーブルの0番目のエントリをアドレス`24 KiB`のフレームに対応付けることで、破線の矢印で示されているように`0 KiB`の仮想ページからレベル2ページテーブルの物理フレームへの一時的対応付けを行いました。 -- レベル1テーブルの9番目のエントリをアドレス`4 KiB`のフレームに対応付けることで、破線の矢印で示されているように`36 KiB`の仮想ページからレベル4ページテーブルの物理フレームへの一時的対応付を行いました。 +- レベル1テーブルの9番目のエントリをアドレス`4 KiB`のフレームに対応付けることで、破線の矢印で示されているように`36 KiB`の仮想ページからレベル4ページテーブルの物理フレームへの一時的対応付けを行いました。 これで、カーネルは`0 KiB`に書き込むことによってレベル2ページテーブルに、`36 KiB`に書き込むことによってレベル4ページテーブルにアクセスできるようになりました。 @@ -107,7 +107,7 @@ translators = ["woodyZootopia"] - そのエントリに対応付けられている仮想ページを通じて、対象のフレームにアクセスする。 - エントリを未使用に戻すことで、一時的対応付けを削除する。 -この方法では、同じ512個の下層ページを対応付けを作成するために再利用するため、物理メモリは4KiBしか必要としません。欠点としては、やや面倒であるということが言えるでしょう。特に、新しい対応付けを作る際に複数のページテーブルの変更が必要になるかもしれず、上の手続きを複数回繰り返さなくてはならないかもしれません。 +この方法では、同じ512個の仮想ページを対応付けを作成するために再利用するため、物理メモリは4KiBしか必要としません。欠点としては、やや面倒であるということが言えるでしょう。特に、新しい対応付けを作る際に複数のページテーブルの変更が必要になるかもしれず、上の手続きを複数回繰り返さなくてはならないかもしれません。 ### 再帰的ページテーブル @@ -121,7 +121,7 @@ translators = ["woodyZootopia"] [example at the beginning of this post]: #peziteburuniakusesusuru -CPUにこのエントリを辿らせるようにすると、レベル3テーブルではなく、そのレベル4テーブルに再び到達します。これは再帰的関数(自らを呼び出す関数)に似ているので、**再帰的ページテーブル**と呼ばれます。レベル4テーブルのすべてのエントリはレベル3テーブルを指しているとCPUは思っているので、CPUはいまレベル4テーブルをレベル3テーブルとして扱っているということに注目してください。これがうまく行くのは、x86_64においてはすべてのレベルのテーブルが全く同じレイアウトを持っているためです。 +CPUにこのエントリを辿らせるようにすると、レベル3テーブルではなく、そのレベル4テーブルに再び到達します。これは再帰関数(自らを呼び出す関数)に似ているので、**再帰的ページテーブル** (recursive page table) と呼ばれます。CPUはレベル4テーブルのすべてのエントリはレベル3テーブルを指していると思っているので、CPUはいまレベル4テーブルをレベル3テーブルとして扱っているということに注目してください。これがうまく行くのは、x86_64においてはすべてのレベルのテーブルが全く同じレイアウトを持っているためです。 実際に変換を始める前に、この再帰エントリを1回以上たどることで、CPUのたどる階層の数を短くできます。例えば、一度再帰エントリを辿ったあとでレベル3テーブルに進むと、CPUはレベル3テーブルをレベル2テーブルだと思い込みます。同様に、レベル2テーブルをレベル1テーブルだと、レベル1テーブルを対応付けられた(物理)フレームだと思います。CPUがこれを物理フレームだと思っているということは、レベル1ページテーブルを読み書きできるということを意味します。下の図はこの5回の変換ステップを示しています: @@ -166,8 +166,7 @@ CPUにこのエントリを辿らせるようにすると、レベル3テーブ ![Bits 0–12 are the offset into the level l table frame and bits 12–21, bits 21–30, bits 30–39 and bits 39–48 are the index of the recursive entry](table-indices-from-address-recursive-level-4.svg) -We can now calculate virtual addresses for the page tables of all four levels. We can even calculate an address that points exactly to a specific page table entry by multiplying its index by 8, the size of a page table entry. -これで、4つの階層すべてのページテーブルの仮想アドレスを計算できます。 +これで、4つの階層すべてのページテーブルの仮想アドレスを計算できます。また、インデクスをページテーブルエントリのサイズ倍、つまり8倍することによって、特定のページテーブルエントリを指すアドレスを計算できます。 下の表は、それぞれの種類のフレームにアクセスするためのアドレス構造をまとめたものです: @@ -183,7 +182,7 @@ We can now calculate virtual addresses for the page tables of all four levels. W ただし、`AAA`がレベル4インデクス、`BBB`がレベル3インデクス、`CCC`がレベル2インデクス、`DDD`が対応付けられたフレームのレベル1インデクス、`EEE`がオフセットです。`RRR`が再帰エントリのインデクスです。インデクス(3ケタ)をオフセット(4ケタ)に変換するときは、8倍(ページテーブルエントリのサイズ倍)しています。 -`SSSSS`は符号拡張ビットです、すなわち47番目のビットのコピーです。これはx86_64におけるアドレスの特殊な要求の一つです。これは[前回の記事][sign extension]で説明しました。 +`SSSSS`は符号拡張ビットで、すなわち47番目のビットのコピーです。これはx86_64におけるアドレスの特殊な要求の一つです。これは[前回の記事][sign extension]で説明しました。 [sign extension]: @/edition-2/posts/08-paging-introduction/index.ja.md#x86-64niokerupezingu @@ -220,8 +219,7 @@ let level_1_table_addr = 上のコードは、レベル4エントリの最後(インデクス`0o777`すなわち511)が再帰対応していると仮定しています。この対応はまだ行っていないので、この仮定は正しくありません。以下でブートローダに再帰対応付けを設定させる方法を説明します。 -Alternatively to performing the bitwise operations by hand, you can use the [`RecursivePageTable`] type of the `x86_64` crate, which provides safe abstractions for various page table operations. For example, the code below shows how to translate a virtual address to its mapped physical address: -ビット演算を自前で行う代わりに、`x86_64`クレートの[`RecursivePageTable`]型を使うこともできます。これは様々なページ操作の安全な抽象化を提供します。例えば、以下のコードは仮想アドレスを対応付けられた物理アドレスに変換する方法を示しています +ビット演算を自前で行う代わりに、`x86_64`クレートの[`RecursivePageTable`]型を使うこともできます。これは様々なページ操作の安全な抽象化を提供します。例えば、以下のコードは仮想アドレスを対応付けられた物理アドレスに変換する方法を示しています。 [`RecursivePageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html @@ -266,18 +264,18 @@ frame.map(|frame| frame.start_address() + u64::from(addr.page_offset())) [_Remap The Kernel_]: https://os.phil-opp.com/remap-the-kernel/#overview -## ブートローダのサポート +## ブートローダによる補助 これらのアプローチはすべて、準備のためにページテーブルに対する修正が必要になります。例えば、物理メモリへの対応付けを作ったり、レベル4テーブルのエントリを再帰的に対応付けたりなどです。問題は、これらの必要な対応付けを作るためには、すでにページテーブルにアクセスできるようになっていなければいけないということです。 -これが意味するのは、私達のカーネルが使うページテーブルを作っている、ブートローダの手助けが必要になるということです。ブートローダはページテーブルへのアクセスができますから、私達の必要とするどんな対応付けも作れます。`bootloader`クレートは上の2つのアプローチをどちらもサポートしており、現在の実装においては[cargoのfeatures][cargo features]を使ってこれらをコントロールします。 +これが意味するのは、私達のカーネルが使うページテーブルを作っている、ブートローダの手助けが必要になるということです。ブートローダはページテーブルにアクセスできますから、私達の必要とするどんな対応付けも作れます。`bootloader`クレートは上の2つのアプローチをどちらもサポートしており、現在の実装においては[cargoのfeatures][cargo features]を使ってこれらをコントロールします。 [cargo features]: https://doc.rust-lang.org/cargo/reference/features.html#the-features-section - `map_physical_memory` featureを使うと、全物理メモリを仮想アドレス空間のどこかに対応付けます。そのため、カーネルはすべての物理メモリにアクセスでき、[上で述べた方法に従って物理メモリ全体を対応付ける](#wu-li-memoriquan-ti-wodui-ying-fu-keru)ことができます。 - `recursive_page_table` featureでは、ブートローダはレベル4ページテーブルのエントリを再帰的に対応付けます。これによりカーネルは[再帰的ページテーブル](#zai-gui-de-peziteburu)で述べた方法に従ってページテーブルにアクセスすることができます。 -私達のカーネルには、シンプルでプラットフォーム非依存でより強力である(ページテーブルのフレームでないメモリにもアクセスできる)1つ目の方法を取ることにします。必要なブートローダの機能 (feature) を有効化するために、`map_physical_memory` featureを`bootloader`のdependencyに追加します。 +私達のカーネルには、シンプルでプラットフォーム非依存でより強力である(ページテーブルのフレームでないメモリにもアクセスできるので)1つ目の方法を採ることにします。必要なブートローダの機能 (feature) を有効化するために、`map_physical_memory` featureを`bootloader`のdependencyに追加します。 ```toml @@ -285,7 +283,7 @@ frame.map(|frame| frame.start_address() + u64::from(addr.page_offset())) bootloader = { version = "0.9.8", features = ["map_physical_memory"]} ``` -この機能を有効化すると、ブートローダは物理メモリの全体を、とある未使用の仮想アドレス空間に対応付けます。この仮想アドレスの範囲をカーネルに伝えるために、ブートローダは**boot information**構造体を渡します。 +この機能を有効化すると、ブートローダは物理メモリの全体を、ある未使用の仮想アドレス空間に対応付けます。この仮想アドレスの範囲をカーネルに伝えるために、ブートローダは**boot information**構造体を渡します。 ### Boot Information @@ -295,7 +293,7 @@ bootloader = { version = "0.9.8", features = ["map_physical_memory"]} [`BootInfo`]: https://docs.rs/bootloader/0.9.3/bootloader/bootinfo/struct.BootInfo.html [semver-incompatible]: https://doc.rust-lang.org/stable/cargo/reference/specifying-dependencies.html#caret-requirements -- `memory_map`フィールドは、利用可能な物理メモリの情報の概要を保持しています。システムの利用可能な物理メモリがどのくらいかや、どのメモリ領域がVGAハードウェアのようなデバイスのために予約されているかをカーネルに伝えます。これらのメモリ対応付けはBIOSやUEFIファームウェアからブートのごく初期に限り取得することが可能です。そのため、これらをカーネルが後で取得することはできないので、ブートローダによって提供する必要があるわけです。このメモリ対応付けは後で必要となります。 +- `memory_map`フィールドは、利用可能な物理メモリの情報の概要を保持しています。システムの利用可能な物理メモリがどのくらいかや、どのメモリ領域がVGAハードウェアのようなデバイスのために予約されているかをカーネルに伝えます。これらのメモリ対応付けはBIOSやUEFIファームウェアから取得できますが、それが可能なのはブートのごく初期に限られます。そのため、これらをカーネルが後で取得することはできないので、ブートローダによって提供する必要があるわけです。このメモリ対応付けは後で必要となります。 - `physical_memory_offset`は、物理メモリの対応付けの始まっている仮想アドレスです。このオフセットを物理アドレスに追加することによって、対応する仮想アドレスを得られます。これによって、カーネルから任意の物理アドレスにアクセスできます。 ブートローダは`BootInfo`構造体を`_start`関数の`&'static BootInfo`引数という形でカーネルに渡します。この引数は私達の関数ではまだ宣言していなかったので追加します: @@ -311,13 +309,13 @@ pub extern "C" fn _start(boot_info: &'static BootInfo) -> ! { // 新しい引数 } ``` -今までこの引数を無視していましたが、x86_64の呼出し規約は最初の引数をCPUレジスタに渡していたため、これは問題ではありませんでした。つまり、引数が宣言されていなかったとき、単に無視されていたわけです。しかし、もし引数の型を間違えてしまうと、コンパイラが私達のエントリポイント関数の正しい型シグネチャがわからなくなってしまうので、それは問題です。 +今までこの引数を無視していましたが、x86_64の呼出し規約は最初の引数をCPUレジスタに渡していたため、これは問題ではありませんでした。つまり、引数が宣言されていなかったとき、それが単に無視されていたわけです。しかし、もし引数の型を間違えてしまうと、コンパイラが私達のエントリポイント関数の正しい型シグネチャがわからなくなってしまうので問題です。 ### `entry_point`マクロ -私達の`_start`関数はブートローダから外部呼び出しされるので、私達の関数のシグネチャに対する検査は行われません。これにより、コンパイルエラーなしにあらゆる引数を取ることを許してしまい、いざ実行時にエラーになったり未定義動作を起こしてしまいます。 +私達の`_start`関数はブートローダから外部呼び出しされるので、私達の関数のシグネチャに対する検査は行われません。これにより、この関数はコンパイルエラーなしにあらゆる引数を取ることができるので、いざ実行時にエラーになったり未定義動作を起こしてしまいます。 -私達のエントリポイント関数が常にブートローダの期待する正しいシグネチャを持っていることを保証するために、`bootloader`クレートは[`entry_point`]マクロによって、Rustの関数をエントリポイントとして型チェックしながら定義する方法を提供します。私達のエントリポイントをこのマクロを使って書き直してみましょう: +私達のエントリポイント関数が常にブートローダの期待する正しいシグネチャを持っていることを保証するために、`bootloader`クレートは[`entry_point`]マクロによって、Rustの関数を型チェックしたうえでエントリポイントとして定義する方法を提供します。私達のエントリポイント関数をこのマクロを使って書き直してみましょう: [`entry_point`]: https://docs.rs/bootloader/0.6.4/bootloader/macro.entry_point.html @@ -333,7 +331,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { } ``` -このマクロが本物の`_start`エントリポイントをより低レベルに定義してくれるので、`extern "C"`や`no_mangle`をエントリポイントに使う必要はもうありません。`kernel_main`関数は今や完全に普通のRustの関数なので、自由に名前をつけることができます。そして重要なのは、これは型チェックされているので、間違った関数シグネチャ(例えば引数を増やしたり引数の型を変えたり)にするとコンパイルエラーが発生するということです。 +このマクロがより低レベルな本物の`_start`エントリポイントを定義してくれるので、`extern "C"`や`no_mangle`をエントリポイントに使う必要はもうありません。`kernel_main`関数は今や完全に普通のRustの関数なので、自由に名前をつけることができます。そして重要なのは、この関数は型チェックされているので、間違った関数シグネチャ(例えば引数を増やしたり引数の型を変えたり)にするとコンパイルエラーが発生するということです。 `lib.rs`に同じ変更を施しましょう: @@ -370,11 +368,11 @@ fn test_kernel_main(_boot_info: &'static BootInfo) -> ! { pub mod memory; ``` -このモジュールに合わせて`src/memory.rs`ファイルを作ります。 +また、このモジュールに対応するファイル`src/memory.rs`を作ります。 ### ページテーブルにアクセスする -[前の記事の最後][end of the previous post]で、私達のカーネルの実行しているページテーブルを見てみようとしましたが、`CR3`レジスタの指す物理フレームにアクセスすることができなかったためそれはできませんでした。前回の続きとして、`active_level_4_table`という、現在有効 (アクティブ) なレベル4ページテーブルへの参照を返す関数を定義するところから始めましょう: +[前の記事の最後][end of the previous post]で、私達のカーネルの実行しているページテーブルを見てみようとしましたが、`CR3`レジスタの指す物理フレームにアクセスすることができなかったためそれはできませんでした。この続きとして、`active_level_4_table`という、現在有効 (アクティブ) なレベル4ページテーブルへの参照を返す関数を定義するところから始めましょう: [end of the previous post]: @/edition-2/posts/08-paging-introduction/index.ja.md#peziteburuhenoakusesu @@ -443,7 +441,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { } ``` -まず、`BootInfo`構造体の`physical_memory_offset`を[`VirtAddr`]に変換し、`active_level_4_table`関数に渡します。つぎに`iter`関数を使ってページテーブルの全エントリに対してfor文を回し、[`enumerate`]コンビネータをつかってそれぞれの要素にインデックス`i`を追加します。全512エントリを出力すると画面に収まらないので、 (から) でないエントリのみ出力します。 +まず、`BootInfo`構造体の`physical_memory_offset`を[`VirtAddr`]に変換し、`active_level_4_table`関数に渡します。つぎに`iter`関数を使ってページテーブルのエントリをイテレートし、[`enumerate`]コンビネータをつかってそれぞれの要素にインデックス`i`を追加します。全512エントリを出力すると画面に収まらないので、 (から) でないエントリのみ出力します。 [`VirtAddr`]: https://docs.rs/x86_64/0.14.2/x86_64/addr/struct.VirtAddr.html [`enumerate`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.enumerate @@ -517,7 +515,7 @@ pub unsafe fn translate_addr(addr: VirtAddr, physical_memory_offset: VirtAddr) /// Rustはunsafeな関数の全体をunsafeブロックとして扱ってしまうので、 /// unsafeの範囲を絞るためにこの関数はunsafeにしていない。 /// この関数をモジュール外から呼び出すときは、 -/// unsafeな関数を通じてのみ呼び出すこと。 +/// unsafeな関数`translate_addr`を使って呼び出すこと。 fn translate_addr_inner(addr: VirtAddr, physical_memory_offset: VirtAddr) -> Option { @@ -556,7 +554,7 @@ fn translate_addr_inner(addr: VirtAddr, physical_memory_offset: VirtAddr) 先程作った`active_level_4_table`関数を再利用せず、`CR3`レジスタからレベル4フレームを読み出すコードを再び書いています。これは簡単に試作するためであり、後でもっと良い方法で作り直すのでご心配なく。 -`Virtaddr`構造体には、インデクスから4つの階層のページテーブルを計算してくれるメソッドが備わっています。この4つのインデクスを配列に格納することで、これらを`for`ループを使って辿ります。`for`ループを抜けたら、最後に計算した`frame`を覚えているので、物理アドレスを計算できます。この`frame`は、forループの中ではページテーブルのフレームを指していて、最後のループのあと(すなわちレベル1エントリを辿ったあと)では対応する(物理)フレームを指しています。 +`Virtaddr`構造体には、(仮想メモリの)インデクスから4つの階層のページテーブルを計算してくれるメソッドが備わっています。この4つのインデクスを配列に格納することで、これらを`for`ループを使って辿ります。`for`ループを抜けたら、最後に計算した`frame`を覚えているので、物理アドレスを計算できます。この`frame`は、forループの中ではページテーブルのフレームを指していて、最後のループのあと(すなわちレベル1エントリを辿ったあと)では対応する(物理)フレームを指しています。 ループの中の話をします。前と同じように`physical_memory_offset`を使ってフレームをページテーブルの参照に変換します。次に、そのページテーブルのエントリを読み、[`PageTableEntry::frame`]関数を使って対応するフレームを取得します。もしエントリがフレームに対応付けられていなければ`None`を返します。もしエントリが2MiBや1GiBのhuge pageに対応付けられていたら、今のところはpanicすることにします。 @@ -604,7 +602,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { [_page offset_]: @/edition-2/posts/08-paging-introduction/index.ja.md#x86-64niokerupezingu -それぞれの物理アドレスは`physical_memory_offset`を足すことでアクセスできるわけですから、`physical_memory_offset`自体を(仮想アドレスとして)変換すると物理アドレス`0`を指すはずです。しかし、効率よく対応付けを行うためにここではhuge pageが使われており、これはまだサポートしていないので変換には失敗しています。 +それぞれの物理アドレスは`physical_memory_offset`を足すことでアクセスできるわけですから、`physical_memory_offset`自体を変換すると物理アドレス`0`を指すはずです。しかし、効率よく対応付けを行うためにここではhuge pageが使われており、これはまだサポートしていないので変換には失敗しています。 ### `OffsetPageTable`を使う @@ -612,7 +610,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { この抽象化の基礎となっているのは、様々なページテーブル対応付け関数を定義している2つのトレイトです。 -- [`Mapper`]トレイトはページサイズを型引数とする汎用型 (ジェネリクス) です。例えば、[`translate_page`]は与えられたページを同じサイズのフレームに変換し、[`map_to`]はページテーブルに新しい対応付けを作成します。 +- [`Mapper`]トレイトはページサイズを型引数とする汎用型 (ジェネリクス) で、ページに対して操作を行う関数を提供します。例えば、[`translate_page`]は与えられたページを同じサイズのフレームに変換し、[`map_to`]はページテーブルに新しい対応付けを作成します。 - [`Translate`] トレイトは[`translate_addr`]や一般の[`translate`]のような、さまざまなページサイズに対して動くような関数を提供します。 [`Mapper`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Mapper.html @@ -622,13 +620,13 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { [`translate_addr`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Translate.html#method.translate_addr [`translate`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Translate.html#tymethod.translate -これらのトレイトはインターフェイスを定義しているだけであり、その実装は何一つ提供していません。`x86_64`クレートは現在、このトレイトを実装する型を異なる要件に合わせて3つ用意しています。[`OffsetPageTable`]型は、全物理メモリがあるオフセットで仮想アドレスに対応していることを前提とします。[`MappedPageTable`]はもう少し融通が効き、それぞれのページテーブルフレームが計算可能などこかの仮想アドレスに対応していることだけを前提とします。最後に[`RecursivePageTable`]型は、ページテーブルのフレームに[再帰的ページテーブル](#zai-gui-de-peziteburu)を使ってアクセスするときに使えます。 +これらのトレイトはインターフェイスを定義しているだけであり、その実装は何一つ提供していません。`x86_64`クレートは現在、このトレイトを実装する型を異なる要件に合わせて3つ用意しています。[`OffsetPageTable`]型は、全物理メモリがあるオフセットで仮想アドレスに対応していることを前提とします。[`MappedPageTable`]はもう少し融通が効き、それぞれのページテーブルフレームが(そのフレームから)計算可能な仮想アドレスに対応していることだけを前提とします。最後に[`RecursivePageTable`]型は、ページテーブルのフレームに[再帰的ページテーブル](#zai-gui-de-peziteburu)を使ってアクセスするときに使えます。 [`OffsetPageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html [`MappedPageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.MappedPageTable.html [`RecursivePageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html -私達の場合、ブートローダは全物理メモリを`physical_memory_offset`変数で指定された仮想アドレスで物理メモリに対応付けているので、`OffsetPageTable`型を使えます。これを初期化するために、`memory`モジュールに新しく`init`関数を作りましょう: +私達の場合、ブートローダは全物理メモリを`physical_memory_offset`変数で指定された仮想アドレスで物理メモリに対応付けているので、`OffsetPageTable`型が使えます。これを初期化するために、`memory`モジュールに新しく`init`関数を作りましょう: ```rust use x86_64::structures::paging::OffsetPageTable; @@ -656,7 +654,7 @@ unsafe fn active_level_4_table(physical_memory_offset: VirtAddr) [`OffsetPageTable::new`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html#method.new -可変参照が複数の名称を持つと未定義動作を起こす可能性があるので、以降`active_level_4_table`関数は`init`関数から一度呼び出されることを除いては呼び出されてはなりません。そのため、`pub`指定子を外してこの関数を非公開にしています。 +可変参照が複数の名称を持つと未定義動作を起こす可能性があるので、今後`active_level_4_table`関数は`init`関数から一度呼び出されることを除いては呼び出されてはなりません。そのため、`pub`指定子を外してこの関数を非公開にしています。 これで、自前の`memory::translate_addr`関数の代わりに`Translate::translate_addr`メソッドを使うことができます。これには`kernel_main`を数行だけ書き換えればよいです: @@ -697,11 +695,11 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { `MappedPageTable`型の変換関数を使うことで、huge pageをサポートする手間が省けます。また`map_to`のような他のページング関数も利用でき、これは次のセクションで使います。 -この時点で、自作した`memory::translate_addr`関数や`memory::translate_addr_inner`関数はもう必要ではないので、削除して構いません。 +この時点で、自作した`memory::translate_addr`関数や`memory::translate_addr_inner`関数はもう必要ではないので削除して構いません。 ### 新しい対応を作る -これまでページテーブルを見てきましたが修正はしていませんでした。対応のなかったページに対応を作ることで、ページテーブルを修正してみましょう。 +これまでページテーブルを見てきましたが、それに対する変更は行っていませんでした。ページテーブルに対する変更として、対応のなかったページに対応を作ってみましょう。 これを実装するには[`Mapper`]トレイトの[`map_to`]関数を使うので、この関数について少し見てみましょう。ドキュメントによると四つ引数があります:対応に使うページ、ページを対応させるフレーム、ページテーブルエントリにつかうフラグの集合、そして`frame_allocator`です。フレームアロケータ (frame allocator) (フレームを割り当てる (アロケートする) 機能を持つ)が必要な理由は、与えられたページを対応付けるために追加でページテーブルを作成する必要があるかもしれず、これを格納するためには使われていないフレームが必要となるからです。 @@ -741,14 +739,14 @@ pub fn create_example_mapping( } ``` -この関数は、対応付ける`page`に加え`OffsetPageTable`のインスタンスと`frame_allocator`への可変参照を引数に取ります。`frame_allocator`引数は[`impl Trait`][impl-trait-arg]構文により[`FrameAllocator`]トレイトを実装するあらゆる型の[汎用型][generic]になっています。`FrameAllocator`トレイトは[`PageSize`]トレイトを実装するなら(引数のサイズが)4KiBでも2MiBや1GiBのhuge pageでも大丈夫な汎用 (ジェネリック) トレイトです。私達は4KiBの対応付けのみを作りたいので、ジェネリック引数は`Size4KiB`にしています。 +この関数は、対応付ける`page`に加え`OffsetPageTable`のインスタンスと`frame_allocator`への可変参照を引数に取ります。`frame_allocator`引数は[`impl Trait`][impl-trait-arg]構文により[`FrameAllocator`]トレイトを実装するあらゆる型の[汎用型][generic]になっています。`FrameAllocator`トレイトは[`PageSize`]トレイトを実装するなら(トレイト引数のサイズが)4KiBでも2MiBや1GiBのhuge pageでも構わない汎用 (ジェネリック) トレイトです。私達は4KiBの対応付けのみを作りたいので、ジェネリック引数は`Size4KiB`にしています。 [impl-trait-arg]: https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters [generic]: https://doc.rust-lang.org/book/ch10-00-generics.html [`FrameAllocator`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/trait.FrameAllocator.html [`PageSize`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/page/trait.PageSize.html -[`map_to`]メソッドは、呼び出し元がフレームはまだ使われていないことを保証しないといけないので、unsafeです。なぜなら、同じフレームを二度対応付けると(例えば2つの異なる`&mut`参照が物理メモリの同じ場所を指すことで)未定義動作を起こす可能性があるからです。今回、VGAテキストバッファのフレームという、すでに対応付けられているフレームを再度使っているので、この要件を破ってしまっています。しかしながら、`create_example_mapping`関数は一時的なテスト関数でありこの記事のあとには取り除かれるので、大丈夫です。この危険性 (unsafety) のことを忘れないようにするために、その行に`FIXME` (要修正) コメントをつけておきます。 +[`map_to`]メソッドは、呼び出し元がフレームはまだ使われていないことを保証しないといけないので、unsafeです。なぜなら、同じフレームを二度対応付けると(例えば2つの異なる`&mut`参照が物理メモリの同じ場所を指すことで)未定義動作を起こす可能性があるからです。今回、VGAテキストバッファのフレームという、すでに対応付けられているフレームを再度使っているので、この要件を破ってしまっています。しかしながら、`create_example_mapping`関数は一時的なテスト関数であり、この記事のあとには取り除かれるので大丈夫です。この危険性のことを忘れないようにするために、その行に`FIXME` (`要修正`) コメントをつけておきます。 `map_to`関数が`page`と`unused_frame`に加えてフラグの集合と`frame_allocator`への参照を取りますが、これについてはすぐに説明します。フラグについては、`PRESENT`フラグという有効なエントリ全てに必須のフラグと、`WRITABLE`フラグという対応するページを書き込み可能にするフラグをセットしています。フラグの一覧については、前記事の[ページテーブルの形式][_Page Table Format_]を参照してください。 @@ -781,11 +779,11 @@ unsafe impl FrameAllocator for EmptyFrameAllocator { } ``` -`FrameAllocator`を実装するのはunsafeです。なぜなら、実装する人は、作ったアロケータが未使用のフレームのみ取得することを保証しなければならないからです。さもなくば、例えば二つの仮想ページが同じ物理フレームに対応付けられたときに未定義動作が起こるかもしれません。この`EmptyFrameAllocator`は`None`しか返さないので、これは問題ではありません。 +`FrameAllocator`を実装するのはunsafeです。なぜなら、実装する人は、実装したアロケータが未使用のフレームのみ取得することを保証しなければならないからです。さもなくば、例えば二つの仮想ページが同じ物理フレームに対応付けられたときに未定義動作が起こるかもしれません。この`EmptyFrameAllocator`は`None`しか返さないので、これは問題ではありません。 #### 仮想ページを選ぶ -`create_example_mapping`関数に渡すための単純なフレームアロケータを手に入れました。しかし、このアロケータは常に`None`を返すので、対応を作る際に追加のページテーブルフレームが必要でなかったときにのみうまく行きます。いつ追加のページテーブルフレームが必要でありいつそうでないのかを知るために、例をとって考えてみましょう: +`create_example_mapping`関数に渡すための単純なフレームアロケータを手に入れました。しかし、このアロケータは常に`None`を返すので、対応を作る際に追加のページテーブルフレームが必要でなかったときにのみうまく動作します。いつ追加のページテーブルフレームが必要でありいつそうでないのかを知るために、例をとって考えてみましょう: ![A virtual and a physical address space with a single mapped page and the page tables of all four levels](required-page-frames-example.svg) @@ -794,17 +792,17 @@ unsafe impl FrameAllocator for EmptyFrameAllocator { また、この図はVGAテキストバッファの物理フレームを赤色で示しています。私達の目的は、`create_example_mapping`関数を使ってまだ対応付けられていない仮想ページをこのフレームに対応付けることです。私達の`EmptyFrameAllocator`は常に`None`を返すので、アロケータからフレームを追加する必要がないように対応付けを作りたいです。これができるかは、私達が対応付けにどの仮想ページを使うかに依存します。 -この図の仮想アドレス空間には、2つの候補となるページを黄色で示しています。ページのうち一つはアドレス`0x803fe00000`で、これは(青で示された)対応付けられたページの3つ前です。レベル4と3のテーブルのインデクスは青いページと同じですが、レベル2と1のインデクスは違います([前の記事][page-table-indices]を参照)。レベル2テーブルのインデクスが違うということは、異なるレベル1テーブルが使われることを意味します。そんなレベル1テーブルは存在しないので、もしこちらを使っていたら、使われていない物理フレームを追加(でアロケート)する必要が出てきます。対して、2つ目のアドレス`0x803fe02000`にある候補のページは、青のページと同じレベル1ページテーブルを使うのでこの問題は発生しません。よって、必要となるすべてのページテーブルはすでに存在しています。 +この図の仮想アドレス空間には、2つの候補となるページを黄色で示しています。ページのうち一つはアドレス`0x803fe00000`で、これは(青で示された)対応付けられているページの3つ前です。レベル4と3のテーブルのインデクスは青いページと同じですが、レベル2と1のインデクスは違います([前の記事][page-table-indices]を参照)。レベル2テーブルのインデクスが違うということは、異なるレベル1テーブルが使われることを意味します。そんなレベル1テーブルは存在しないので、もしこちらを使っていたら、使われていない物理フレームを追加(でアロケート)する必要が出てきます。対して、2つ目のアドレス`0x803fe02000`にある候補のページは、青のページと同じレベル1ページテーブルを使うのでこの問題は発生しません。よって、必要となるすべてのページテーブルはすでに存在しています。 [page-table-indices]: @/edition-2/posts/08-paging-introduction/index.ja.md#x86-64niokerupezingu -まとめると、新しい対応を作るときの難易度は、対応付けようとしている仮想ページに依存するということです。作ろうとしているページのレベル1ページテーブルがすでに存在すると最も簡単で、エントリを一つ書き込むだけです。ページがレベル3のテーブルすら存在しない領域にある場合が最も難しく、その場合まずレベル3,2,1のページテーブルを新しく作る必要があります。 +まとめると、新しい対応を作るときの難易度は、対応付けようとしている仮想ページに依存するということです。作ろうとしているページのレベル1ページテーブルがすでに存在すると最も簡単で、エントリをそのページに一つ書き込むだけです。ページがレベル3のテーブルすら存在しない領域にある場合が最も難しく、その場合まずレベル3,2,1のページテーブルを新しく作る必要があります。 `EmptyFrameAllocator`を使って`create_example_mapping`を呼び出すためには、すべての(階層の)ページテーブルがすでに存在しているページを選ぶ必要があります。そんなページを探すにあたっては、ブートローダが自分自身を仮想アドレス空間の最初の1メガバイトに読み込んでいるということを利用できます。つまり、この領域のすべてのページについて、レベル1テーブルがきちんと存在しているということです。したがって、試しに対応を作るときに、このメモリ領域のいずれかの未使用ページ、例えばアドレス`0`を使えばよいです。普通このページは、ヌルポインタの参照外しがページフォルトを引き起こすことを保証するために使用しないので、ブートローダもここを対応させてはいないはずです。 #### 対応を作る -というわけで、`create_example_mapping`関数を呼び出すために必要なすべての引数を手に入れたので、仮想アドレス`0`を対応付けるよう`kernel_main`関数を変更していきましょう。このページはVGAテキストバッファのフレームに対応付けているので、以後、画面に書き込むことができるはずです。実装は以下のようになります: +というわけで、`create_example_mapping`関数を呼び出すために必要なすべての引数を手に入れたので、仮想アドレス`0`を対応付けるよう`kernel_main`関数を変更していきましょう。このページをVGAテキストバッファのフレームに対応付けると、以後、画面に書き込むことができるようになるはずです。実装は以下のようになります: ```rust // in src/main.rs @@ -833,7 +831,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { まず、`mapper`と`frame_allocator`インスタンスの可変参照を渡して`create_example_mapping`を呼ぶことで、アドレス`0`のページに対応を作っています。これはVGAテキストバッファのフレームに対応付けているので、これに書き込んだものは何であれ画面に出てくるはずです。 -次にページを生ポインタに変更して、オフセット`400`に値を書き込みます。このページの最初に書き込むとVGAバッファの一番上の行になり、次のprintlnで即座に画面外に流れていってしまうのでそれはしません。値`0x_f021_f077_f065_f04e`は、白背景の"New!"という文字列を表します。[VGAテキストモードの記事][in the _“VGA Text Mode”_ post]で学んだように、VGAバッファへの書き込みはvolatileでなければならないので、[`write_volatile`]メソッドを使っています。 +次にページを生ポインタに変更して、オフセット`400`に値を書き込みます。このページの最初に書き込むとVGAバッファの一番上の行になり、次のprintlnで即座に画面外に流れていってしまうので、それを避けています。値`0x_f021_f077_f065_f04e`は、白背景の"New!"という文字列を表します。[VGAテキストモードの記事][in the _“VGA Text Mode”_ post]で学んだように、VGAバッファへの書き込みはvolatileでなければならないので、[`write_volatile`]メソッドを使っています。 [in the _“VGA Text Mode”_ post]: @/edition-2/posts/03-vga-text-buffer/index.ja.md#volatile [`write_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_volatile @@ -842,7 +840,7 @@ QEMUで実行すると、以下の出力を得ます: ![QEMU printing "It did not crash!" with four completely white cells in the middle of the screen](qemu-new-mapping.png) -画面の"New!"はページ`0`への書き込みによるものなので、ページテーブルへの新しい対応付けの作成が成功したということを意味します。 +画面の "New!" はページ`0`への書き込みによるものなので、ページテーブルへの新しい対応付けの作成が成功したということを意味します。 この対応付けが成功したのは、アドレス`0`を管轄するレベル1テーブルがすでに存在していたからに過ぎません。レベル1テーブルがまだ存在しないページを対応付けようとすると、`map_to`関数は新しいページテーブルを作るために`EmptyFrameAllocator`からフレームを割り当てようとしてエラーになります。`0`の代わりに`0xdeadbeaf000`を対応付けようとするとそれが発生するのが見られます。 @@ -862,7 +860,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { panicked at 'map_to failed: FrameAllocationFailed', /…/result.rs:999:5 ``` -レベル1テーブルのまだ存在しないページを対応付けるためには、ちゃんとした`FrameAllocator`を作らないといけません。しかし、どのフレームが未使用で、どのフレームが利用可能かはどうすればわかるのでしょう? +レベル1テーブルがまだ存在していないページを対応付けるためには、ちゃんとした`FrameAllocator`を作らないといけません。しかし、どのフレームが未使用で、どのフレームが利用可能かはどうすればわかるのでしょう? ### フレームを割り当てる @@ -898,9 +896,9 @@ impl BootInfoFrameAllocator { この構造体は2つのフィールドを持ちます。ブートローダによって渡されたメモリマップへの`'static`な参照と、アロケータが次に返すべきフレームの番号を覚えておくための`next`フィールドです。 -[_Boot Information_](#boot-information)節で説明したように、このメモリマップはBIOS/UEFIファームウェアから提供されます。これはブートプロセスのごく初期にのみ取得できるので、ブートローダがそのための関数を呼ぶようになっています。メモリマップは`MemoryRegion`構造体のリストからなり、この構造体はそれぞれのメモリ領域の開始アドレス、長さ、型(未使用、予約済み、など)を格納しています。 +[_Boot Information_](#boot-information)節で説明したように、このメモリマップはBIOS/UEFIファームウェアから提供されます。これはブートプロセスのごく初期にのみ取得できますが、ブートローダがそのための関数を既に呼んでくれています。メモリマップは`MemoryRegion`構造体のリストからなり、この構造体はそれぞれのメモリ領域の開始アドレス、長さ、型(未使用か、予約済みかなど)を格納しています。 -`init`関数は`BootInfoFrameAllocator`を与えられたメモリマップで初期化します。`next`フィールドは`0`で初期化し、フレームを割当てるたびに値を増やすことで同じフレームを二度返すことを防ぎます。メモリマップのusable (使用可能) なフレームが他の誰かに使われたりしていないかは知ることができないので、この`init`関数はそれを呼び出し元に追加で保証させるために`unsafe`でないといけません。 +`init`関数は`BootInfoFrameAllocator`を与えられたメモリマップで初期化します。`next`フィールドは`0`で初期化し、フレームを割当てるたびに値を増やすことで同じフレームを二度返すことを防ぎます。メモリマップのusable (使用可能) とされているフレームが他のどこかで使われたりしていないかは知ることができないので、この`init`関数はそれを呼び出し元に追加で保証させるために`unsafe`でないといけません。 #### `usable_frames`メソッド @@ -932,7 +930,7 @@ impl BootInfoFrameAllocator { この関数はイテレータのコンビネータメソッドを使って、最初に与えられる`MemoryMap`を使用可能な物理フレームのイテレータに変換します: - まず`iter`メソッドを使ってメモリマップを[`MemoryRegion`]のイテレータに変える。 -- 次に[`filter`]メソッドを使って、予約済みなどの理由で使用不可能な領域を飛ばすようにする。ブートローダは作った対応付けに使ったメモリマップはきちんと更新するので、私達のカーネル(コード、データ、スタック)に使われているフレームやブート情報を格納するのに使われているフレームはすでに`InUse` (使用中) などでマークされています。そのため`Usable`なフレームは他の場所では使われていないはずとわかります。 +- 次に[`filter`]メソッドを使って、予約済みなどの理由で使用不可能な領域を飛ばすようにする。ブートローダは作った対応付けに使ったメモリマップはきちんと更新するので、私達のカーネル(コード、データ、スタック)に使われているフレームやブート情報を格納するのに使われているフレームはすでに`InUse` (`使用中`) などでマークされています。そのため`Usable`なフレームは他の場所では使われていないはずとわかります。 - つぎに、[`map`]コンビネータとRustの[range構文][range syntax]を使って、メモリ領域のイテレータからアドレス範囲のイテレータへと変換する。 - つぎに、アドレス範囲から[`step_by`]で4096個ごとにアドレスを選び、[`flat_map`]を使うことでフレームの最初のアドレスのイテレータを得る。4096バイト(=4KiB)はページのサイズに等しいので、それぞれのフレームの開始地点のアドレスが得られます。ブートローダのページは使用可能なメモリ領域をすべてアラインするので、ここで改めてアラインや丸めを行う必要はありません。`map`ではなく[`flat_map`]を使うことで、`Iterator>`ではなく`Iterator`を得ています。 - 最後に、開始アドレスの型を`PhysFrame`に変更することで`Iterator`を得ている。 @@ -944,7 +942,7 @@ impl BootInfoFrameAllocator { [`step_by`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.step_by [`flat_map`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.flat_map -この関数の戻り型は[`impl Trait`]機能を用いています。こうすると、`PhysFrame`をitemの型として持つような[`Iterator`]トレイトを実装する何らかの型を返すのだと指定できます。これは重要です――なぜなら、戻り値の型は名前のつけられないクロージャ型に依存し、具体的な名前をつけるのが**不可能だ**からです。 +この関数の戻り型は[`impl Trait`]機能を用いています。こうすると、`PhysFrame`をitemの型として持つような[`Iterator`]トレイトを実装する何らかの型を返すのだと指定できます。これは重要です――なぜなら、戻り値の型は名前のつけられないクロージャ型に依存し、**具体的な名前をつけるのが不可能**だからです。 [`impl Trait`]: https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits [`Iterator`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html @@ -969,7 +967,7 @@ unsafe impl FrameAllocator for BootInfoFrameAllocator { [`Iterator::nth`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.nth -この実装は割当てを行うごとに`usable_frames`アロケータを作り直しているので、あまり最適ではありません。イテレータを構造体のフィールドとして直接格納するほうが良いでしょう。すると`nth`メソッドを使う必要はなくなり、割り当てのたびに[`next`]を使えばいいだけです。このアプローチの問題は、今の所構造体のフィールドに`impl Trait`型(の変数)を格納することができないことです。いつの日か、[named existential type][_named existential types_]が完全に実装されたときにはこれが可能になるかもしれません。 +この実装は割当てを行うごとに`usable_frames`アロケータを作り直しているので、最適とは言い難いです。イテレータを構造体のフィールドとして直接格納するほうが良いでしょう。すると`nth`メソッドを使う必要はなくなり、割り当てのたびに[`next`]を使えばいいだけです。このアプローチの問題は、今の所構造体のフィールドに`impl Trait`型(の変数)を格納することができないことです。いつの日か、[named existential type][_named existential types_]が完全に実装されたときにはこれが可能になるかもしれません。 [`next`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#tymethod.next [_named existential types_]: https://github.com/rust-lang/rfcs/pull/2071 @@ -993,8 +991,8 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { ブート情報を使うフレームアロケータのおかげで対応付けは成功し、白背景に黒文字の"New!"が再び画面に現れました。舞台裏では、`map_to`メソッドが不足しているページテーブルを以下のやり方で作っています: -- 渡された`frame_allocator`を使って未使用のフレームを割り当てる。 -- フレームをゼロで埋め、新しい空のページテーブルを作る。 +- 渡された`frame_allocator`を使って未使用のフレームを割り当ててもらう。 +- フレームをゼロで埋めることで、新しい空のページテーブルを作る。 - 上位のテーブルのエントリをそのフレームに対応付ける。 - 次の層で同じことを続ける。 @@ -1004,15 +1002,15 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { ## まとめ -この記事ではページテーブルのある物理フレームにアクセスするための様々なテクニックを学びました。恒等対応、物理メモリ全体の対応付け、一時的な対応、再帰的ページテーブルなどです。このうち、シンプルでポータブル(アーキテクチャ非依存という意味)で強力な、物理メモリ全体の対応付けを選びました。 +この記事ではページテーブルのある物理フレームにアクセスするための様々なテクニックを学びました。恒等対応、物理メモリ全体の対応付け、一時的な対応、再帰的ページテーブルなどです。このうち、シンプルでポータブル (アーキテクチャ非依存) で強力な、物理メモリ全体の対応付けを選びました。 ページテーブルにアクセスできなければ物理メモリを対応付けられないので、ブートローダの補助が必要でした。`bootloader`クレートはcargoのfeaturesというオプションを通じて、必要となる対応付けの作成をサポートしています。さらに、必要となる情報をエントリポイント関数の`&BootInfo`引数という形で私達のカーネルに渡してくれます。 -実装について。最初は手作業でページテーブルを辿ることで変換関数を実装し、そのあとで`x86_64`クレートの`MappedPageTable`型を使いました。また、ページテーブルに新しい対応を作る方法や、そのために必要な`FrameAllocator`をブートローダに渡されたメモリマップをラップすることで作る方法を学びました。 +実装について。最初はページテーブルを辿る変換関数を自分の手で実装し、そのあとで`x86_64`クレートの`MappedPageTable`型を使いました。また、ページテーブルに新しい対応を作る方法や、そのために必要な`FrameAllocator`をブートローダに渡されたメモリマップをラップすることで作る方法を学びました。 ## 次は? -次の記事では、私達のカーネルのためのヒープメモリ領域を作り、それによって[メモリの割り当て][allocate memory]や各種の[コレクション型][collection types]を使うことが可能になります。 +次の記事では、私達のカーネルのためのヒープメモリ領域を作り、それによって[メモリの割り当て][allocate memory]を行ったり各種の[コレクション型][collection types]を使うことが可能になります。 [allocate memory]: https://doc.rust-lang.org/alloc/boxed/struct.Box.html [collection types]: https://doc.rust-lang.org/alloc/collections/index.html From 0fe6d6aaec5af96ffa7a98725abd4ebf72cb10ff Mon Sep 17 00:00:00 2001 From: "Shu W. Nakamura" <30687489+woodyZootopia@users.noreply.github.com> Date: Sat, 11 Sep 2021 16:43:57 +0900 Subject: [PATCH 08/28] Apply suggestions from code review and Add garasubo as a co-translator Co-authored-by: garasubo --- .../posts/09-paging-implementation/index.ja.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md index 791a8f4f..3c2dd76f 100644 --- a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -7,7 +7,7 @@ date = 2019-03-14 [extra] chapter = "Memory Management" translation_based_on_commit = "27ab4518acbb132e327ed4f4f0508393e9d4d684" -translators = ["woodyZootopia"] +translators = ["woodyZootopia", "garasubo"] +++ この記事では私達のカーネルをページングに対応させる方法についてお伝えします。まずページテーブルの物理フレームにカーネルがアクセスできるようにする様々な方法を示し、それらの利点と欠点について議論します。次にアドレス変換関数を、ついで新しい対応付けを作るための関数を実装します。 @@ -24,7 +24,7 @@ translators = ["woodyZootopia"] ## 導入 -[1つ前の記事][previous post]ではページングの概念を説明しました。セグメンテーションと比較することによってページングのメリットを示し、ページングとページテーブルの仕組みを説明し、そして`x86_64`における4層ページテーブルの設計を導入しました。ブートローダはすでにページテーブルの階層構造を設定してしまっているので、私達のカーネルは既に仮想アドレス上で動いているということを学びました。これにより、不正なメモリアクセスは、任意の物理メモリを書き換えてしまう代わりにページフォルト例外を発生させるので、安全性が向上しています。 +[1つ前の記事][previous post]ではページングの概念を説明しました。セグメンテーションと比較することによってページングのメリットを示し、ページングとページテーブルの仕組みを説明し、そして`x86_64`における4層ページテーブルの設計を導入しました。ブートローダはすでにページテーブルの階層構造を設定してしまっているので、私達のカーネルは既に仮想アドレス上で動いているということを学びました。これにより、不正なメモリアクセスは、任意の物理メモリを書き換えてしまうのではなくページフォルト例外を発生させるので、安全性が向上しています。 [previous post]: @/edition-2/posts/08-paging-introduction/index.ja.md @@ -59,7 +59,7 @@ translators = ["woodyZootopia"] [memory-mapping a file]: https://en.wikipedia.org/wiki/Memory-mapped_file [segmentation]: @/edition-2/posts/08-paging-introduction/index.ja.md#duan-pian-hua-fragmentation -同様に、新しいページテーブルを作ることもずっと難しくなります。なぜなら、対応するページがまだ使われていない物理フレームを見つけないといけないからです。例えば、メモリマップト (に対応づけられた) ファイルのために`1008KiB`から1000KiBにわたって仮想メモリを占有したとしましょう。すると、すると、物理アドレス`1000KiB`から`2008KiB`までのフレームは、もう恒等対応を作ることができないので使用することができません。 +同様に、新しいページテーブルを作ることもずっと難しくなります。なぜなら、対応するページがまだ使われていない物理フレームを見つけないといけないからです。例えば、メモリマップト (に対応づけられた) ファイルのために`1008KiB`から1000KiBにわたって仮想メモリを占有したとしましょう。すると、物理アドレス`1000KiB`から`2008KiB`までのフレームは、もう恒等対応を作ることができないので使用することができません。 ### 固定オフセットの対応づけ @@ -121,7 +121,7 @@ translators = ["woodyZootopia"] [example at the beginning of this post]: #peziteburuniakusesusuru -CPUにこのエントリを辿らせるようにすると、レベル3テーブルではなく、そのレベル4テーブルに再び到達します。これは再帰関数(自らを呼び出す関数)に似ているので、**再帰的ページテーブル** (recursive page table) と呼ばれます。CPUはレベル4テーブルのすべてのエントリはレベル3テーブルを指していると思っているので、CPUはいまレベル4テーブルをレベル3テーブルとして扱っているということに注目してください。これがうまく行くのは、x86_64においてはすべてのレベルのテーブルが全く同じレイアウトを持っているためです。 +CPUにこのエントリを辿らせるようにすると、レベル3テーブルではなく、そのレベル4テーブルに再び到達します。これは再帰関数(自らを呼び出す関数)に似ているので、**再帰的 (recursive) ページテーブル**と呼ばれます。CPUはレベル4テーブルのすべてのエントリはレベル3テーブルを指していると思っているので、CPUはいまレベル4テーブルをレベル3テーブルとして扱っているということに注目してください。これがうまく行くのは、x86_64においてはすべてのレベルのテーブルが全く同じレイアウトを持っているためです。 実際に変換を始める前に、この再帰エントリを1回以上たどることで、CPUのたどる階層の数を短くできます。例えば、一度再帰エントリを辿ったあとでレベル3テーブルに進むと、CPUはレベル3テーブルをレベル2テーブルだと思い込みます。同様に、レベル2テーブルをレベル1テーブルだと、レベル1テーブルを対応付けられた(物理)フレームだと思います。CPUがこれを物理フレームだと思っているということは、レベル1ページテーブルを読み書きできるということを意味します。下の図はこの5回の変換ステップを示しています: @@ -217,7 +217,7 @@ let level_1_table_addr = sign | (r << 39) | (l4_idx << 30) | (l3_idx << 21) | (l2_idx << 12); ``` -上のコードは、レベル4エントリの最後(インデクス`0o777`すなわち511)が再帰対応していると仮定しています。この対応はまだ行っていないので、この仮定は正しくありません。以下でブートローダに再帰対応付けを設定させる方法を説明します。 +上のコードは、レベル4エントリの最後(インデクス`0o777`すなわち511)が再帰対応していると仮定しています。この仮定は正しくないので,このコードは動作しません。ブートローダに再帰対応付けを設定させる方法については後述します。 ビット演算を自前で行う代わりに、`x86_64`クレートの[`RecursivePageTable`]型を使うこともできます。これは様々なページ操作の安全な抽象化を提供します。例えば、以下のコードは仮想アドレスを対応付けられた物理アドレスに変換する方法を示しています。 @@ -248,7 +248,7 @@ let frame = recursive_page_table.translate_page(page); frame.map(|frame| frame.start_address() + u64::from(addr.page_offset())) ``` -繰り返しになりますが、このコード(が正しく実行される)には正しい再帰対応がなされていることが必要となります。この対応付けがあるなら、空欄になっている`level_4_table_addr`を最初のコード例と同じ値にすればよいです。 +繰り返しになりますが、このコード(が正しく実行される)には正しい再帰対応がなされていることが必要となります。この対応付けがあるのなら、空欄になっている`level_4_table_addr`は最初のコード例を使って計算すればよいです。
@@ -275,7 +275,7 @@ frame.map(|frame| frame.start_address() + u64::from(addr.page_offset())) - `map_physical_memory` featureを使うと、全物理メモリを仮想アドレス空間のどこかに対応付けます。そのため、カーネルはすべての物理メモリにアクセスでき、[上で述べた方法に従って物理メモリ全体を対応付ける](#wu-li-memoriquan-ti-wodui-ying-fu-keru)ことができます。 - `recursive_page_table` featureでは、ブートローダはレベル4ページテーブルのエントリを再帰的に対応付けます。これによりカーネルは[再帰的ページテーブル](#zai-gui-de-peziteburu)で述べた方法に従ってページテーブルにアクセスすることができます。 -私達のカーネルには、シンプルでプラットフォーム非依存でより強力である(ページテーブルのフレームでないメモリにもアクセスできるので)1つ目の方法を採ることにします。必要なブートローダの機能 (feature) を有効化するために、`map_physical_memory` featureを`bootloader`のdependencyに追加します。 +私達のカーネルには、シンプルでプラットフォーム非依存かつ(ページテーブルのフレームでないメモリにもアクセスできるので)より強力である1つ目の方法を採ることにします。必要なブートローダの機能 (feature) を有効化するために、`map_physical_memory` featureを`bootloader`のdependencyに追加します。 ```toml @@ -313,7 +313,7 @@ pub extern "C" fn _start(boot_info: &'static BootInfo) -> ! { // 新しい引数 ### `entry_point`マクロ -私達の`_start`関数はブートローダから外部呼び出しされるので、私達の関数のシグネチャに対する検査は行われません。これにより、この関数はコンパイルエラーなしにあらゆる引数を取ることができるので、いざ実行時にエラーになったり未定義動作を起こしてしまいます。 +私達の`_start`関数はブートローダから外部呼び出しされるので、私達の関数のシグネチャに対する検査は行われません。これにより、この関数はコンパイルエラーなしにあらゆる引数を取ることができるので、いざ実行時にエラーになったり未定義動作を起こしたりしてしまいます。 私達のエントリポイント関数が常にブートローダの期待する正しいシグネチャを持っていることを保証するために、`bootloader`クレートは[`entry_point`]マクロによって、Rustの関数を型チェックしたうえでエントリポイントとして定義する方法を提供します。私達のエントリポイント関数をこのマクロを使って書き直してみましょう: From 4472eed23c64c8680b347ad1deb7fd8ef617fb69 Mon Sep 17 00:00:00 2001 From: "Shu W. Nakamura" <30687489+woodyZootopia@users.noreply.github.com> Date: Tue, 14 Sep 2021 11:19:03 +0900 Subject: [PATCH 09/28] Apply suggestions from code review Co-authored-by: garasubo --- .../edition-2/posts/09-paging-implementation/index.ja.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md index 3c2dd76f..e7e82386 100644 --- a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -268,7 +268,7 @@ frame.map(|frame| frame.start_address() + u64::from(addr.page_offset())) これらのアプローチはすべて、準備のためにページテーブルに対する修正が必要になります。例えば、物理メモリへの対応付けを作ったり、レベル4テーブルのエントリを再帰的に対応付けたりなどです。問題は、これらの必要な対応付けを作るためには、すでにページテーブルにアクセスできるようになっていなければいけないということです。 -これが意味するのは、私達のカーネルが使うページテーブルを作っている、ブートローダの手助けが必要になるということです。ブートローダはページテーブルにアクセスできますから、私達の必要とするどんな対応付けも作れます。`bootloader`クレートは上の2つのアプローチをどちらもサポートしており、現在の実装においては[cargoのfeatures][cargo features]を使ってこれらをコントロールします。 +つまり、私達のカーネルが使うページテーブルを作っている、ブートローダの手助けが必要になるということです。ブートローダはページテーブルにアクセスできますから、私達の必要とするどんな対応付けも作れます。`bootloader`クレートは上の2つのアプローチをどちらもサポートしており、現在の実装においては[cargoのfeatures][cargo features]を使ってこれらをコントロールします。 [cargo features]: https://doc.rust-lang.org/cargo/reference/features.html#the-features-section @@ -479,7 +479,7 @@ if !entry.is_unused() { レベル2やレベル1のテーブルも、同じ手続きをレベル3とレベル2のエントリに対して繰り返すことで見ることができます。お察しの通りそれを書くとかなり長くなるので、コードの全てはここには示しません。 -ページテーブルを手作業で辿ると、CPUが変換を行う様子を理解できて面白いです。しかし、多くの場合は与えられた仮想アドレスに対応する物理アドレスにのみ興味があるので、そのための関数を作りましょう。 +ページテーブルを手作業で辿ると、CPUが変換を行う仕組みを理解できて面白いです。しかし、多くの場合は与えられた仮想アドレスに対応する物理アドレスにのみ興味があるので、そのための関数を作りましょう。 ### アドレスの変換 @@ -556,7 +556,7 @@ fn translate_addr_inner(addr: VirtAddr, physical_memory_offset: VirtAddr) `Virtaddr`構造体には、(仮想メモリの)インデクスから4つの階層のページテーブルを計算してくれるメソッドが備わっています。この4つのインデクスを配列に格納することで、これらを`for`ループを使って辿ります。`for`ループを抜けたら、最後に計算した`frame`を覚えているので、物理アドレスを計算できます。この`frame`は、forループの中ではページテーブルのフレームを指していて、最後のループのあと(すなわちレベル1エントリを辿ったあと)では対応する(物理)フレームを指しています。 -ループの中の話をします。前と同じように`physical_memory_offset`を使ってフレームをページテーブルの参照に変換します。次に、そのページテーブルのエントリを読み、[`PageTableEntry::frame`]関数を使って対応するフレームを取得します。もしエントリがフレームに対応付けられていなければ`None`を返します。もしエントリが2MiBや1GiBのhuge pageに対応付けられていたら、今のところはpanicすることにします。 +ループの中では、前と同じように`physical_memory_offset`を使ってフレームをページテーブルの参照に変換します。次に、そのページテーブルのエントリを読み、[`PageTableEntry::frame`]関数を使って対応するフレームを取得します。もしエントリがフレームに対応付けられていなければ`None`を返します。もしエントリが2MiBや1GiBのhuge pageに対応付けられていたら、今のところはpanicすることにします。 [`PageTableEntry::frame`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/page_table/struct.PageTableEntry.html#method.frame @@ -598,7 +598,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { ![0xb8000 -> 0xb8000, 0x201008 -> 0x401008, 0x10000201a10 -> 0x279a10, "panicked at 'huge pages not supported'](qemu-translate-addr.png) -期待したとおり、恒等対応しているアドレス`0xb8000`は同じ物理アドレスに変換されました。コードページとスタックページは物理アドレスのどこかしかに変換されていますが、その場所はブートローダが私達のカーネルのために最初に作った対応づけに依存します。また、下から12ビットは変換のあとも常に同じであるということも注目に値します:この部分は[ページオフセット][_page offset_]であり、変換には関わらないためです。 +期待したとおり、恒等対応しているアドレス`0xb8000`は同じ物理アドレスに変換されました。コードページとスタックページは物理アドレスのどこかしかに変換されていますが、その場所はブートローダがカーネルの初期対応づけをどのようにつくったかによります。また、下から12ビットは変換のあとも常に同じであるということも注目に値します:この部分は[ページオフセット][_page offset_]であり、変換には関わらないためです。 [_page offset_]: @/edition-2/posts/08-paging-introduction/index.ja.md#x86-64niokerupezingu From f57bded691593de26e1b0bdb8fd3e31346edc22e Mon Sep 17 00:00:00 2001 From: woodyZootopia Date: Thu, 7 Oct 2021 22:41:09 +0900 Subject: [PATCH 10/28] Fix for the advice given by @garasubo --- .../09-paging-implementation/index.ja.md | 216 +++++++++--------- 1 file changed, 108 insertions(+), 108 deletions(-) diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md index e7e82386..fad6283c 100644 --- a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -10,7 +10,7 @@ translation_based_on_commit = "27ab4518acbb132e327ed4f4f0508393e9d4d684" translators = ["woodyZootopia", "garasubo"] +++ -この記事では私達のカーネルをページングに対応させる方法についてお伝えします。まずページテーブルの物理フレームにカーネルがアクセスできるようにする様々な方法を示し、それらの利点と欠点について議論します。次にアドレス変換関数を、ついで新しい対応付けを作るための関数を実装します。 +この記事では私達のカーネルをページングに対応 (マップ) させる方法についてお伝えします。まずページテーブルの物理フレームにカーネルがアクセスできるようにする様々な方法を示し、それらの利点と欠点について議論します。次にアドレス変換関数を、ついで新しい対応付け (マッピング) を作るための関数を実装します。 @@ -32,7 +32,7 @@ translators = ["woodyZootopia", "garasubo"] [end of previous post]: @/edition-2/posts/08-paging-introduction/index.ja.md#peziteburuhenoakusesu -この方法を実装するには、ブートローダーからの補助が必要になるので、まずこれに設定を加えます。その後で、ページテーブルの階層構造を移動して、仮想アドレスを物理アドレスに変換する関数を実装します。最後に、ページテーブルに新しい対応関係を作る方法と、それを作るための未使用メモリを見つける方法を学びます。 +この方法を実装するには、ブートローダーからの補助が必要になるので、まずこれに設定を加えます。その後で、ページテーブルの階層構造を移動して、仮想アドレスを物理アドレスに変換する関数を実装します。最後に、ページテーブルに新しいマッピングを作る方法と、それを作るための未使用メモリを見つける方法を学びます。 ## ページテーブルにアクセスする @@ -42,88 +42,88 @@ translators = ["woodyZootopia", "garasubo"] ここで重要なのは、それぞれのページテーブルのエントリは次のテーブルの**物理**アドレスであるということです。これにより、それらのアドレスに対しては変換せずにすみます。もしこの変換が行われたとしたら、性能的にも良くないですし、容易に変換の無限ループに陥りかねません。 -問題は、私達のカーネル自体も仮想アドレスの上で動いているため、カーネルから直接物理アドレスにアクセスすることができないということです。例えば、アドレス`4KiB`にアクセスしたとき、私達は**仮想**アドレス`4KiB`にアクセスしているのであって、レベル4ページテーブルが格納されている**物理**アドレス`4KiB`にアクセスしているのではありません。物理アドレス`4KiB`にアクセスしたいなら、それに対応づけられている何らかの仮想アドレスを通じてのみ可能です。 +問題は、私達のカーネル自体も仮想アドレスの上で動いているため、カーネルから直接物理アドレスにアクセスすることができないということです。例えば、アドレス`4KiB`にアクセスしたとき、私達は**仮想**アドレス`4KiB`にアクセスしているのであって、レベル4ページテーブルが格納されている**物理**アドレス`4KiB`にアクセスしているのではありません。物理アドレス`4KiB`にアクセスしたいなら、それにマップさせられている何らかの仮想アドレスを通じてのみ可能です。 -そのため、ページテーブルのフレームにアクセスするためには、どこかの仮想ページをそれに対応づけなければいけません。このような、任意のページテーブルのフレームにアクセスできるようにしてくれる対応付けを作る方法にはいくつかあります。 +そのため、ページテーブルのフレームにアクセスするためには、どこかの仮想ページをそれにマッピングしなければいけません。このような、任意のページテーブルのフレームにアクセスできるようにしてくれるマッピングを作る方法にはいくつかあります。 -### 恒等対応 +### 恒等マッピング -シンプルな方法として、**すべてのページテーブルを恒等対応させる**ということが考えられるでしょう: +シンプルな方法として、**すべてのページテーブルを恒等対応 (マップ) させる**ということが考えられるでしょう: ![A virtual and a physical address space with various virtual pages mapped to the physical frame with the same address](identity-mapped-page-tables.svg) -この例では、いくつかの恒等対応したページテーブルのフレームが見てとれます。こうすることで、ページテーブルの物理アドレスは仮想アドレスと同じ値になり、よってCR3レジスタから始めることで全ての階層のページテーブルに簡単にアクセスできます。 +この例では、恒等マップしたいくつかのページテーブルのフレームが見てとれます。こうすることで、ページテーブルの物理アドレスは仮想アドレスと同じ値になり、よってCR3レジスタから始めることで全ての階層のページテーブルに簡単にアクセスできます。 -しかし、この方法では仮想アドレス空間が散らかってしまい、大きいサイズの連続したメモリを見つけることが難しくなります。例えば、上の図において、[ファイルをメモリにマップする][memory-mapping a file]ために1000KiBの大きさの仮想メモリ領域を作りたいとします。`28KiB`を始点として領域を作ろうとすると、`1004KiB`のところで既存のページと衝突してしまうのでうまくいきません。そのため、`1008KiB`のような、十分な広さで対応付けのない領域が見つかるまで更に探さないといけません。これは[セグメンテーション][segmentation]の時に見た断片化の問題に似ています。 +しかし、この方法では仮想アドレス空間が散らかってしまい、大きいサイズの連続したメモリを見つけることが難しくなります。例えば、上の図において、[ファイルをメモリにマップする][memory-mapping a file]ために1000KiBの大きさの仮想メモリ領域を作りたいとします。`28KiB`を始点として領域を作ろうとすると、`1004KiB`のところで既存のページと衝突してしまうのでうまくいきません。そのため、`1008KiB`のような、十分な広さでマッピングのない領域が見つかるまで更に探さないといけません。これは[セグメンテーション][segmentation]の時に見た断片化の問題に似ています。 [memory-mapping a file]: https://en.wikipedia.org/wiki/Memory-mapped_file [segmentation]: @/edition-2/posts/08-paging-introduction/index.ja.md#duan-pian-hua-fragmentation -同様に、新しいページテーブルを作ることもずっと難しくなります。なぜなら、対応するページがまだ使われていない物理フレームを見つけないといけないからです。例えば、メモリマップト (に対応づけられた) ファイルのために`1008KiB`から1000KiBにわたって仮想メモリを占有したとしましょう。すると、物理アドレス`1000KiB`から`2008KiB`までのフレームは、もう恒等対応を作ることができないので使用することができません。 +同様に、新しいページテーブルを作ることもずっと難しくなります。なぜなら、対応するページがまだ使われていない物理フレームを見つけないといけないからです。例えば、メモリマップト (に対応づけられた) ファイルのために`1008KiB`から1000KiBにわたって仮想メモリを占有したとしましょう。すると、物理アドレス`1000KiB`から`2008KiB`までのフレームは、もう恒等マッピングを作ることができないので使用することができません。 -### 固定オフセットの対応づけ +### 固定オフセットのマッピング -仮想アドレス空間を散らかしてしまうという問題を回避するために、**ページテーブルの対応づけのために別のメモリ領域を使う**ことができます。ページテーブルを恒等対応させる代わりに、仮想アドレス空間で一定の補正値 (オフセット) をおいて対応づけてみましょう。例えば、オフセットを10TiBにしてみましょう: +仮想アドレス空間を散らかしてしまうという問題を回避するために、**ページテーブルのマッピングのために別のメモリ領域を使う**ことができます。ページテーブルを恒等マップさせる代わりに、仮想アドレス空間で一定の補正値 (オフセット) をおいてマッピングしてみましょう。例えば、オフセットを10TiBにしてみましょう: ![The same figure as for the identity mapping, but each mapped virtual page is offset by 10 TiB.](page-tables-mapped-at-offset.svg) -`10TiB`から`10TiB+物理メモリ全体の大きさ`の範囲の仮想メモリをページテーブルの対応付け専用に使うことで、恒等対応のときに存在していた衝突問題を回避しています。このように巨大な領域を仮想アドレス空間内に用意するのは、仮想アドレス空間が物理メモリの大きさより遥かに大きい場合にのみ可能です。x86_64で用いられている48bit(仮想)アドレス空間は256TiBもの大きさがあるので、これは問題ではありません。 +`10TiB`から`10TiB+物理メモリ全体の大きさ`の範囲の仮想メモリをページテーブルのマッピング専用に使うことで、恒等マップのときに存在していた衝突問題を回避しています。このように巨大な領域を仮想アドレス空間内に用意するのは、仮想アドレス空間が物理メモリの大きさより遥かに大きい場合にのみ可能です。x86_64で用いられている48bit(仮想)アドレス空間は256TiBもの大きさがあるので、これは問題ではありません。 -この方法では、新しいページテーブルを作るたびに新しい対応付けを作る必要があるという欠点があります。また、他のアドレス空間のページテーブルにアクセスすることができると新しいプロセスを作るときに便利なのですが、これも不可能です。 +この方法では、新しいページテーブルを作るたびに新しいマッピングを作る必要があるという欠点があります。また、他のアドレス空間のページテーブルにアクセスすることができると新しいプロセスを作るときに便利なのですが、これも不可能です。 -### 物理メモリ全体を対応付ける +### 物理メモリ全体をマップする -これらの問題はページテーブルのフレームだけと言わず**物理メモリ全体を対応付け**てしまえば解決します: +これらの問題はページテーブルのフレームだけと言わず**物理メモリ全体をマップして**しまえば解決します: ![The same figure as for the offset mapping, but every physical frame has a mapping (at 10TiB + X) instead of only page table frames.](map-complete-physical-memory.svg) -この方法を使えば、私達のカーネルは他のアドレス空間を含め任意の物理メモリにアクセスできます。用意する仮想メモリの範囲は以前と同じであり、違うのは全てのページが対応付けられているということです。 +この方法を使えば、私達のカーネルは他のアドレス空間を含め任意の物理メモリにアクセスできます。用意する仮想メモリの範囲は以前と同じであり、違うのは全てのページがマッピングされているということです。 -この方法の欠点は、物理メモリへの対応付けを格納するために、追加でページテーブルが必要になるところです。これらのページテーブルもどこかに格納されなければならず、したがって物理メモリの一部を占有することになります。これはメモリの量が少ないデバイスにおいては問題となりえます。 +この方法の欠点は、物理メモリへのマッピングを格納するために、追加でページテーブルが必要になるところです。これらのページテーブルもどこかに格納されなければならず、したがって物理メモリの一部を占有することになります。これはメモリの量が少ないデバイスにおいては問題となりえます。 -しかし、x86_64においては、通常の4KiBサイズのページに代わって、大きさ2MiBの[huge page][huge pages]を対応付けに使うことができます。こうすれば、例えば32GiBの物理メモリを対応付けるのにはレベル3テーブル1個とレベル2テーブル32個があればいいので、たったの132KiBしか必要ではありません。huge pagesは、トランスレーション・ルックアサイド・バッファ (TLB) のエントリをあまり使わないので、キャッシュ的にも効率が良いです。 +しかし、x86_64においては、通常の4KiBサイズのページに代わって、大きさ2MiBの[huge page][huge pages]をマッピングに使うことができます。こうすれば、例えば32GiBの物理メモリをマップするのにはレベル3テーブル1個とレベル2テーブル32個があればいいので、たったの132KiBしか必要ではありません。huge pagesは、トランスレーション・ルックアサイド・バッファ (TLB) のエントリをあまり使わないので、キャッシュ的にも効率が良いです。 [huge pages]: https://en.wikipedia.org/wiki/Page_%28computer_memory%29#Multiple_page_sizes -### 一時的な対応関係 +### 一時的な対応 (マッピング) -物理メモリの量が非常に限られたデバイスについては、アクセスする必要があるときだけ**ページテーブルのフレームを一時的に対応づける**という方法が考えられます。そのような一時的な対応を作りたいときには、たった一つだけ恒等対応させられたレベル1テーブルがあれば良いです: +物理メモリの量が非常に限られたデバイスについては、アクセスする必要があるときだけ**ページテーブルのフレームを一時的にマップする**という方法が考えられます。そのような一時的なマッピングを作りたいときには、たった一つだけ恒等マップさせられたレベル1テーブルがあれば良いです: ![A virtual and a physical address space with an identity mapped level 1 table, which maps its 0th entry to the level 2 table frame, thereby mapping that frame to page with address 0](temporarily-mapped-page-tables.svg) -この図におけるレベル1テーブルは仮想アドレス空間の最初の2MiBを制御しています。なぜなら、このテーブルにはCR3レジスタから始めて、レベル4、3、2のページテーブルの0番目のエントリを辿ることで到達できるからです。その8番目のエントリは、アドレス`32 KiB`の仮想アドレスページをアドレス`32 KiB`の物理アドレスページに対応付けるので、レベル1テーブル自体を恒等対応させています。この図ではその恒等対応を`32 KiB`のところの横向きの(茶色の)矢印で表しています。 +この図におけるレベル1テーブルは仮想アドレス空間の最初の2MiBを制御しています。なぜなら、このテーブルにはCR3レジスタから始めて、レベル4、3、2のページテーブルの0番目のエントリを辿ることで到達できるからです。その8番目のエントリは、アドレス`32 KiB`の仮想アドレスページをアドレス`32 KiB`の物理アドレスページにマップするので、レベル1テーブル自体を恒等マップしています。この図ではその恒等マッピングを`32 KiB`のところの横向きの(茶色の)矢印で表しています。 -恒等対応させたレベル1テーブルに書き込むことによって、カーネルは最大511個の一時的な対応を作ることができます(512から、恒等対応に必要な1つを除く)。上の例では、カーネルは2つの一時的な対応を作りました: +恒等マップさせたレベル1テーブルに書き込むことによって、カーネルは最大511個の一時的なマッピングを作ることができます(512から、恒等マッピングに必要な1つを除く)。上の例では、カーネルは2つの一時的なマッピングを作りました: -- レベル1テーブルの0番目のエントリをアドレス`24 KiB`のフレームに対応付けることで、破線の矢印で示されているように`0 KiB`の仮想ページからレベル2ページテーブルの物理フレームへの一時的対応付けを行いました。 -- レベル1テーブルの9番目のエントリをアドレス`4 KiB`のフレームに対応付けることで、破線の矢印で示されているように`36 KiB`の仮想ページからレベル4ページテーブルの物理フレームへの一時的対応付けを行いました。 +- レベル1テーブルの0番目のエントリをアドレス`24 KiB`のフレームにマップすることで、破線の矢印で示されているように`0 KiB`の仮想ページからレベル2ページテーブルの物理フレームへの一時的なマッピングを行いました。 +- レベル1テーブルの9番目のエントリをアドレス`4 KiB`のフレームにマップすることで、破線の矢印で示されているように`36 KiB`の仮想ページからレベル4ページテーブルの物理フレームへの一時的なマッピングを行いました。 これで、カーネルは`0 KiB`に書き込むことによってレベル2ページテーブルに、`36 KiB`に書き込むことによってレベル4ページテーブルにアクセスできるようになりました。 -任意のページテーブルに一時的対応付けを用いてアクセスする手続きは以下のようになるでしょう: +任意のページテーブルに一時的なマッピングを用いてアクセスする手続きは以下のようになるでしょう: -- 恒等対応しているレベル1テーブルのうち、使われていないエントリを探す。 -- そのエントリを私達のアクセスしたいページテーブルの物理フレームに対応付ける。 -- そのエントリに対応付けられている仮想ページを通じて、対象のフレームにアクセスする。 -- エントリを未使用に戻すことで、一時的対応付けを削除する。 +- 恒等マッピングしているレベル1テーブルのうち、使われていないエントリを探す。 +- そのエントリを私達のアクセスしたいページテーブルの物理フレームにマップする。 +- そのエントリにマップされている仮想ページを通じて、対象のフレームにアクセスする。 +- エントリを未使用に戻すことで、一時的なマッピングを削除する。 -この方法では、同じ512個の仮想ページを対応付けを作成するために再利用するため、物理メモリは4KiBしか必要としません。欠点としては、やや面倒であるということが言えるでしょう。特に、新しい対応付けを作る際に複数のページテーブルの変更が必要になるかもしれず、上の手続きを複数回繰り返さなくてはならないかもしれません。 +この方法では、同じ512個の仮想ページをマッピングを作成するために再利用するため、物理メモリは4KiBしか必要としません。欠点としては、やや面倒であるということが言えるでしょう。特に、新しいマッピングを作る際に複数のページテーブルの変更が必要になるかもしれず、上の手続きを複数回繰り返さなくてはならないかもしれません。 ### 再帰的ページテーブル -他に興味深いアプローチとして、**再帰的にページテーブルを対応付ける**方法があり、この方法では追加のページテーブルは一切不要です。発想としては、レベル4ページテーブルのエントリのどれかをレベル4ページテーブル自体に対応付けるのです。こうすることにより、仮想アドレス空間の一部を予約しておき、現在及び将来のあらゆるページテーブルフレームをその空間に対応付けているのと同じことになります。 +他に興味深いアプローチとして**再帰的にページテーブルをマップする**方法があり、この方法では追加のページテーブルは一切不要です。発想としては、レベル4ページテーブルのエントリのどれかをレベル4ページテーブル自体にマップするのです。こうすることにより、仮想アドレス空間の一部を予約しておき、現在及び将来のあらゆるページテーブルフレームをその空間にマップしているのと同じことになります。 これがうまく行く理由を説明するために、例を見てみましょう: ![An example 4-level page hierarchy with each page table shown in physical memory. Entry 511 of the level 4 page is mapped to frame 4KiB, the frame of the level 4 table itself.](recursive-page-table.png) -[この記事の最初での例][example at the beginning of this post]との唯一の違いは、レベル4テーブルの511番目に、物理フレーム`4 KiB`すなわちレベル4テーブル自体のフレームに対応付けられたエントリが追加されていることです。 +[この記事の最初での例][example at the beginning of this post]との唯一の違いは、レベル4テーブルの511番目に、物理フレーム`4 KiB`すなわちレベル4テーブル自体のフレームにマップされたエントリが追加されていることです。 [example at the beginning of this post]: #peziteburuniakusesusuru CPUにこのエントリを辿らせるようにすると、レベル3テーブルではなく、そのレベル4テーブルに再び到達します。これは再帰関数(自らを呼び出す関数)に似ているので、**再帰的 (recursive) ページテーブル**と呼ばれます。CPUはレベル4テーブルのすべてのエントリはレベル3テーブルを指していると思っているので、CPUはいまレベル4テーブルをレベル3テーブルとして扱っているということに注目してください。これがうまく行くのは、x86_64においてはすべてのレベルのテーブルが全く同じレイアウトを持っているためです。 -実際に変換を始める前に、この再帰エントリを1回以上たどることで、CPUのたどる階層の数を短くできます。例えば、一度再帰エントリを辿ったあとでレベル3テーブルに進むと、CPUはレベル3テーブルをレベル2テーブルだと思い込みます。同様に、レベル2テーブルをレベル1テーブルだと、レベル1テーブルを対応付けられた(物理)フレームだと思います。CPUがこれを物理フレームだと思っているということは、レベル1ページテーブルを読み書きできるということを意味します。下の図はこの5回の変換ステップを示しています: +実際に変換を始める前に、この再帰エントリを1回以上たどることで、CPUのたどる階層の数を短くできます。例えば、一度再帰エントリを辿ったあとでレベル3テーブルに進むと、CPUはレベル3テーブルをレベル2テーブルだと思い込みます。同様に、レベル2テーブルをレベル1テーブルだと、レベル1テーブルをマップされた(物理)フレームだと思います。CPUがこれを物理フレームだと思っているということは、レベル1ページテーブルを読み書きできるということを意味します。下の図はこの5回の変換ステップを示しています: ![The above example 4-level page hierarchy with 5 arrows: "Step 0" from CR4 to level 4 table, "Step 1" from level 4 table to level 4 table, "Step 2" from level 4 table to level 3 table, "Step 3" from level 3 table to level 2 table, and "Step 4" from level 2 table to level 1 table.](recursive-page-table-access-level-1.png) @@ -131,9 +131,9 @@ CPUにこのエントリを辿らせるようにすると、レベル3テーブ ![The same 4-level page hierarchy with the following 4 arrows: "Step 0" from CR4 to level 4 table, "Steps 1&2" from level 4 table to level 4 table, "Step 3" from level 4 table to level 3 table, and "Step 4" from level 3 table to level 2 table.](recursive-page-table-access-level-2.png) -ステップごとにこれを見てみましょう:まず、CPUはレベル4テーブルの再帰エントリをたどり、レベル3テーブルに着いたと思い込みます。同じ再帰エントリを再びたどり、レベル2テーブルに着いたと考えます。しかし実際にはまだレベル4テーブルから動いていません。CPUが異なるエントリをたどると、レベル3テーブルに到着するのですが、CPUはレベル1にすでにいるのだと思っています。そのため、次のエントリはレベル2テーブルを指しているのですが、CPUは対応付けられた物理フレームを指していると思うので、私達はレベル2テーブルを読み書きできるというわけです。 +ステップごとにこれを見てみましょう:まず、CPUはレベル4テーブルの再帰エントリをたどり、レベル3テーブルに着いたと思い込みます。同じ再帰エントリを再びたどり、レベル2テーブルに着いたと考えます。しかし実際にはまだレベル4テーブルから動いていません。CPUが異なるエントリをたどると、レベル3テーブルに到着するのですが、CPUはレベル1にすでにいるのだと思っています。そのため、次のエントリはレベル2テーブルを指しているのですが、CPUはマップされた物理フレームを指していると思うので、私達はレベル2テーブルを読み書きできるというわけです。 -レベル3や4のテーブルにアクセスするのも同じやり方でできます。レベル3テーブルにアクセスするためには、再帰エントリを3回たどることでCPUを騙し、すでにレベル1テーブルにいると思い込ませます。そこで別のエントリをたどりレベル3テーブルに着くと、CPUはそれを対応付けられたフレームとして扱います。レベル4テーブル自体にアクセスするには、再帰エントリを4回辿ればCPUはそのレベル4テーブル自体を対応付けられたフレームとして扱ってくれるというわけです(下の青紫の矢印)。 +レベル3や4のテーブルにアクセスするのも同じやり方でできます。レベル3テーブルにアクセスするためには、再帰エントリを3回たどることでCPUを騙し、すでにレベル1テーブルにいると思い込ませます。そこで別のエントリをたどりレベル3テーブルに着くと、CPUはそれをマップされたフレームとして扱います。レベル4テーブル自体にアクセスするには、再帰エントリを4回辿ればCPUはそのレベル4テーブル自体をマップされたフレームとして扱ってくれるというわけです(下の青紫の矢印)。 ![The same 4-level page hierarchy with the following 3 arrows: "Step 0" from CR4 to level 4 table, "Steps 1,2,3" from level 4 table to level 4 table, and "Step 4" from level 4 table to level 3 table. In blue the alternative "Steps 1,2,3,4" arrow from level 4 table to level 4 table.](recursive-page-table-access-level-3.png) @@ -146,27 +146,27 @@ CPUにこのエントリを辿らせるようにすると、レベル3テーブ

アドレス計算

-実際の変換の前に再帰的移動を1回または複数回行うことですべての階層のテーブルにアクセスできるということを見てきました。4つのテーブルそれぞれのどのインデクスが使われるかは仮想アドレスから直接計算されていましたから、再帰エントリを使うためには特別な仮想アドレスを作り出す必要があります。ページテーブルのインデクスは仮想アドレスから以下のように計算されていたことを思い出してください: +実際の変換の前に再帰的移動を1回または複数回行うことですべての階層のテーブルにアクセスできるということを見てきました。4つのテーブルそれぞれのどのインデックスが使われるかは仮想アドレスから直接計算されていましたから、再帰エントリを使うためには特別な仮想アドレスを作り出す必要があります。ページテーブルのインデックスは仮想アドレスから以下のように計算されていたことを思い出してください: ![Bits 0–12 are the page offset, bits 12–21 the level 1 index, bits 21–30 the level 2 index, bits 30–39 the level 3 index, and bits 39–48 the level 4 index](../paging-introduction/x86_64-table-indices-from-address.svg) -あるページを対応付けているレベル1テーブルにアクセスしたいとします。上で学んだように、このためには再帰エントリを1度辿ってからレベル4,3,2のインデクスへと続けていく必要があります。これをするために、それぞれのアドレスブロックを一つ右にずらし、レベル4のインデクスがあったところに再帰エントリのインデクスをセットします: +あるページをマップしているレベル1テーブルにアクセスしたいとします。上で学んだように、このためには再帰エントリを1度辿ってからレベル4,3,2のインデックスへと続けていく必要があります。これをするために、それぞれのアドレスブロックを一つ右にずらし、レベル4のインデックスがあったところに再帰エントリのインデックスをセットします: ![Bits 0–12 are the offset into the level 1 table frame, bits 12–21 the level 2 index, bits 21–30 the level 3 index, bits 30–39 the level 4 index, and bits 39–48 the index of the recursive entry](table-indices-from-address-recursive-level-1.svg) -そのページのレベル2テーブルにアクセスしたい場合、それぞれのブロックを2つ右にずらし、レベル4と3のインデクスがあったところに再帰エントリのインデクスをセットします: +そのページのレベル2テーブルにアクセスしたい場合、それぞれのブロックを2つ右にずらし、レベル4と3のインデックスがあったところに再帰エントリのインデックスをセットします: ![Bits 0–12 are the offset into the level 2 table frame, bits 12–21 the level 3 index, bits 21–30 the level 4 index, and bits 30–39 and bits 39–48 are the index of the recursive entry](table-indices-from-address-recursive-level-2.svg) -レベル3テーブルにアクセスする場合、それぞれのブロックを3つ右にずらし、レベル4,3,2のインデクスがあったところに再帰インデクスを使います: +レベル3テーブルにアクセスする場合、それぞれのブロックを3つ右にずらし、レベル4,3,2のインデックスがあったところに再帰インデックスを使います: ![Bits 0–12 are the offset into the level 3 table frame, bits 12–21 the level 4 index, and bits 21–30, bits 30–39 and bits 39–48 are the index of the recursive entry](table-indices-from-address-recursive-level-3.svg) -最後に、レベル4テーブルにはそれぞれのブロックを4ブロックずらし、オフセットを除いてすべてのアドレスブロックに再帰インデクスを使うことでアクセスできます: +最後に、レベル4テーブルにはそれぞれのブロックを4ブロックずらし、オフセットを除いてすべてのアドレスブロックに再帰インデックスを使うことでアクセスできます: ![Bits 0–12 are the offset into the level l table frame and bits 12–21, bits 21–30, bits 30–39 and bits 39–48 are the index of the recursive entry](table-indices-from-address-recursive-level-4.svg) -これで、4つの階層すべてのページテーブルの仮想アドレスを計算できます。また、インデクスをページテーブルエントリのサイズ倍、つまり8倍することによって、特定のページテーブルエントリを指すアドレスを計算できます。 +これで、4つの階層すべてのページテーブルの仮想アドレスを計算できます。また、インデックスをページテーブルエントリのサイズ倍、つまり8倍することによって、特定のページテーブルエントリを指すアドレスを計算できます。 下の表は、それぞれの種類のフレームにアクセスするためのアドレス構造をまとめたものです: @@ -180,7 +180,7 @@ CPUにこのエントリを辿らせるようにすると、レベル3テーブ [octal]: https://en.wikipedia.org/wiki/Octal -ただし、`AAA`がレベル4インデクス、`BBB`がレベル3インデクス、`CCC`がレベル2インデクス、`DDD`が対応付けられたフレームのレベル1インデクス、`EEE`がオフセットです。`RRR`が再帰エントリのインデクスです。インデクス(3ケタ)をオフセット(4ケタ)に変換するときは、8倍(ページテーブルエントリのサイズ倍)しています。 +ただし、`AAA`がレベル4インデックス、`BBB`がレベル3インデックス、`CCC`がレベル2インデックス、`DDD`がマップされたフレームのレベル1インデックス、`EEE`がオフセットです。`RRR`が再帰エントリのインデックスです。インデックス(3ケタ)をオフセット(4ケタ)に変換するときは、8倍(ページテーブルエントリのサイズ倍)しています。 `SSSSS`は符号拡張ビットで、すなわち47番目のビットのコピーです。これはx86_64におけるアドレスの特殊な要求の一つです。これは[前回の記事][sign extension]で説明しました。 @@ -196,14 +196,14 @@ CPUにこのエントリを辿らせるようにすると、レベル3テーブ // この仮想アドレスに対応するページテーブルにアクセスしたい let addr: usize = […]; -let r = 0o777; // 再帰インデクス +let r = 0o777; // 再帰インデックス let sign = 0o177777 << 48; // 符号拡張 -// 変換したいアドレスのページテーブルインデクスを取得する -let l4_idx = (addr >> 39) & 0o777; // レベル4インデクス -let l3_idx = (addr >> 30) & 0o777; // レベル3インデクス -let l2_idx = (addr >> 21) & 0o777; // レベル2インデクス -let l1_idx = (addr >> 12) & 0o777; // レベル1インデクス +// 変換したいアドレスのページテーブルインデックスを取得する +let l4_idx = (addr >> 39) & 0o777; // レベル4インデックス +let l3_idx = (addr >> 30) & 0o777; // レベル3インデックス +let l2_idx = (addr >> 21) & 0o777; // レベル2インデックス +let l1_idx = (addr >> 12) & 0o777; // レベル1インデックス let page_offset = addr & 0o7777; // テーブルアドレスを計算する @@ -217,9 +217,9 @@ let level_1_table_addr = sign | (r << 39) | (l4_idx << 30) | (l3_idx << 21) | (l2_idx << 12); ``` -上のコードは、レベル4エントリの最後(インデクス`0o777`すなわち511)が再帰対応していると仮定しています。この仮定は正しくないので,このコードは動作しません。ブートローダに再帰対応付けを設定させる方法については後述します。 +上のコードは、レベル4エントリの最後(インデックス`0o777`すなわち511)が再帰マッピングしていると仮定しています。この仮定は正しくないので,このコードは動作しません。ブートローダに再帰マッピングを設定させる方法については後述します。 -ビット演算を自前で行う代わりに、`x86_64`クレートの[`RecursivePageTable`]型を使うこともできます。これは様々なページ操作の安全な抽象化を提供します。例えば、以下のコードは仮想アドレスを対応付けられた物理アドレスに変換する方法を示しています。 +ビット演算を自前で行う代わりに、`x86_64`クレートの[`RecursivePageTable`]型を使うこともできます。これは様々なページ操作の安全な抽象化を提供します。例えば、以下のコードは仮想アドレスをマップされた物理アドレスに変換する方法を示しています。 [`RecursivePageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html @@ -248,32 +248,32 @@ let frame = recursive_page_table.translate_page(page); frame.map(|frame| frame.start_address() + u64::from(addr.page_offset())) ``` -繰り返しになりますが、このコード(が正しく実行される)には正しい再帰対応がなされていることが必要となります。この対応付けがあるのなら、空欄になっている`level_4_table_addr`は最初のコード例を使って計算すればよいです。 +繰り返しになりますが、このコード(が正しく実行される)には正しい再帰マッピングがなされていることが必要となります。そのようなマッピングがあるのなら、空欄になっている`level_4_table_addr`は最初のコード例を使って計算すればよいです。
--- -再帰的ページングは、ページテーブルのたった一つの対応付けがいかに強力に使えるかを示す興味深いテクニックです。比較的実装するのが簡単であり、ほとんど設定も必要でない(一つ再帰エントリを作るだけ)ので、ページングを使って最初に実装するのに格好の対象でしょう。 +再帰的ページングは、ページテーブルのたった一つのマッピングがいかに強力に使えるかを示す興味深いテクニックです。比較的実装するのが簡単であり、ほとんど設定も必要でない(一つ再帰エントリを作るだけ)ので、ページングを使って最初に実装するのに格好の対象でしょう。 しかし、いくつか欠点もあります: - 大量の仮想メモリ領域(512GiB)を占有してしまう。私達の使っている48bitアドレス空間は巨大なのでこのことはさしたる問題にはなりませんが、キャッシュの挙動が最適でなくなってしまうかもしれません。 -- 現在有効なアドレス空間にしか簡単にはアクセスできない。他のアドレス空間にアクセスするのは再帰エントリを変更することで可能ではあるものの、もとに戻すためには一時的対応付けが必要。これを行う方法については[カーネルをリマップする][_Remap The Kernel_](未訳、また旧版のため情報が古い)という記事を読んでください。 +- 現在有効なアドレス空間にしか簡単にはアクセスできない。他のアドレス空間にアクセスするのは再帰エントリを変更することで可能ではあるものの、もとに戻すためには一時的なマッピングが必要。これを行う方法については[カーネルをリマップする][_Remap The Kernel_](未訳、また旧版のため情報が古い)という記事を読んでください。 - x86のページテーブルの方式に強く依存しており、他のアーキテクチャでは動作しないかもしれない。 [_Remap The Kernel_]: https://os.phil-opp.com/remap-the-kernel/#overview ## ブートローダによる補助 -これらのアプローチはすべて、準備のためにページテーブルに対する修正が必要になります。例えば、物理メモリへの対応付けを作ったり、レベル4テーブルのエントリを再帰的に対応付けたりなどです。問題は、これらの必要な対応付けを作るためには、すでにページテーブルにアクセスできるようになっていなければいけないということです。 +これらのアプローチはすべて、準備のためにページテーブルに対する修正が必要になります。例えば、物理メモリへのマッピングを作ったり、レベル4テーブルのエントリを再帰的にマッピングしたりなどです。問題は、これらの必要なマッピングを作るためには、すでにページテーブルにアクセスできるようになっていなければいけないということです。 -つまり、私達のカーネルが使うページテーブルを作っている、ブートローダの手助けが必要になるということです。ブートローダはページテーブルにアクセスできますから、私達の必要とするどんな対応付けも作れます。`bootloader`クレートは上の2つのアプローチをどちらもサポートしており、現在の実装においては[cargoのfeatures][cargo features]を使ってこれらをコントロールします。 +つまり、私達のカーネルが使うページテーブルを作っている、ブートローダの手助けが必要になるということです。ブートローダはページテーブルにアクセスできますから、私達の必要とするどんなマッピングも作れます。`bootloader`クレートは上の2つのアプローチをどちらもサポートしており、現在の実装においては[cargoのfeatures][cargo features]を使ってこれらをコントロールします。 [cargo features]: https://doc.rust-lang.org/cargo/reference/features.html#the-features-section -- `map_physical_memory` featureを使うと、全物理メモリを仮想アドレス空間のどこかに対応付けます。そのため、カーネルはすべての物理メモリにアクセスでき、[上で述べた方法に従って物理メモリ全体を対応付ける](#wu-li-memoriquan-ti-wodui-ying-fu-keru)ことができます。 -- `recursive_page_table` featureでは、ブートローダはレベル4ページテーブルのエントリを再帰的に対応付けます。これによりカーネルは[再帰的ページテーブル](#zai-gui-de-peziteburu)で述べた方法に従ってページテーブルにアクセスすることができます。 +- `map_physical_memory` featureを使うと、全物理メモリを仮想アドレス空間のどこかにマッピングします。そのため、カーネルはすべての物理メモリにアクセスでき、[上で述べた方法に従って物理メモリ全体をマップする](#wu-li-memoriquan-ti-wodui-ying-fu-keru)ことができます。 +- `recursive_page_table` featureでは、ブートローダはレベル4ページテーブルのエントリを再帰的にマッピングします。これによりカーネルは[再帰的ページテーブル](#zai-gui-de-peziteburu)で述べた方法に従ってページテーブルにアクセスすることができます。 私達のカーネルには、シンプルでプラットフォーム非依存かつ(ページテーブルのフレームでないメモリにもアクセスできるので)より強力である1つ目の方法を採ることにします。必要なブートローダの機能 (feature) を有効化するために、`map_physical_memory` featureを`bootloader`のdependencyに追加します。 @@ -283,7 +283,7 @@ frame.map(|frame| frame.start_address() + u64::from(addr.page_offset())) bootloader = { version = "0.9.8", features = ["map_physical_memory"]} ``` -この機能を有効化すると、ブートローダは物理メモリの全体を、ある未使用の仮想アドレス空間に対応付けます。この仮想アドレスの範囲をカーネルに伝えるために、ブートローダは**boot information**構造体を渡します。 +この機能を有効化すると、ブートローダは物理メモリの全体を、ある未使用の仮想アドレス空間にマッピングします。この仮想アドレスの範囲をカーネルに伝えるために、ブートローダは**boot information**構造体を渡します。 ### Boot Information @@ -293,8 +293,8 @@ bootloader = { version = "0.9.8", features = ["map_physical_memory"]} [`BootInfo`]: https://docs.rs/bootloader/0.9.3/bootloader/bootinfo/struct.BootInfo.html [semver-incompatible]: https://doc.rust-lang.org/stable/cargo/reference/specifying-dependencies.html#caret-requirements -- `memory_map`フィールドは、利用可能な物理メモリの情報の概要を保持しています。システムの利用可能な物理メモリがどのくらいかや、どのメモリ領域がVGAハードウェアのようなデバイスのために予約されているかをカーネルに伝えます。これらのメモリ対応付けはBIOSやUEFIファームウェアから取得できますが、それが可能なのはブートのごく初期に限られます。そのため、これらをカーネルが後で取得することはできないので、ブートローダによって提供する必要があるわけです。このメモリ対応付けは後で必要となります。 -- `physical_memory_offset`は、物理メモリの対応付けの始まっている仮想アドレスです。このオフセットを物理アドレスに追加することによって、対応する仮想アドレスを得られます。これによって、カーネルから任意の物理アドレスにアクセスできます。 +- `memory_map`フィールドは、利用可能な物理メモリの情報の概要を保持しています。システムの利用可能な物理メモリがどのくらいかや、どのメモリ領域がVGAハードウェアのようなデバイスのために予約されているかをカーネルに伝えます。これらのメモリマッピングはBIOSやUEFIファームウェアから取得できますが、それが可能なのはブートのごく初期に限られます。そのため、これらをカーネルが後で取得することはできないので、ブートローダによって提供する必要があるわけです。このメモリマッピングは後で必要となります。 +- `physical_memory_offset`は、物理メモリのマッピングの始まっている仮想アドレスです。このオフセットを物理アドレスに追加することによって、対応する仮想アドレスを得られます。これによって、カーネルから任意の物理アドレスにアクセスできます。 ブートローダは`BootInfo`構造体を`_start`関数の`&'static BootInfo`引数という形でカーネルに渡します。この引数は私達の関数ではまだ宣言していなかったので追加します: @@ -358,7 +358,7 @@ fn test_kernel_main(_boot_info: &'static BootInfo) -> ! { ## 実装 -物理メモリへのアクセスができるようになったので、いよいよページテーブルのコードを実装できます。そのためにまず、現在有効な、私達のカーネルが使用しているページテーブルを見てみます。次に、与えられた仮想アドレスが対応付けられている物理アドレスを返す変換関数を作ります。最後に新しい対応付けを作るためにページテーブルを修正してみます。 +物理メモリへのアクセスができるようになったので、いよいよページテーブルのコードを実装できます。そのためにまず、現在有効な、私達のカーネルが使用しているページテーブルを見てみます。次に、与えられた仮想アドレスがマップされている物理アドレスを返す変換関数を作ります。最後に、新しいマッピングを作るためにページテーブルを修正してみます。 始める前に、`memory`モジュールを作ります: @@ -388,7 +388,7 @@ use x86_64::{ /// /// この関数はunsafeである:全物理メモリが、渡された /// `physical_memory_offset`(だけずらしたうえ)で -/// 仮想メモリへと対応付けられていることを呼び出し元が +/// 仮想メモリへとマップされていることを呼び出し元が /// 保証しなければならない。また、`&mut`参照が複数の /// 名称を持つこと (mutable aliasingといい、動作が未定義) /// につながるため、この関数は一度しか呼び出してはならない。 @@ -450,7 +450,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { ![QEMU printing entry 0 (0x2000, PRESENT, WRITABLE, ACCESSED), entry 1 (0x894000, PRESENT, WRITABLE, ACCESSED, DIRTY), entry 31 (0x88e000, PRESENT, WRITABLE, ACCESSED, DIRTY), entry 175 (0x891000, PRESENT, WRITABLE, ACCESSED, DIRTY), and entry 504 (0x897000, PRESENT, WRITABLE, ACCESSED, DIRTY)](qemu-print-level-4-table.png) -いくつかの空でないエントリがあり、いずれも異なるレベル3テーブルに対応づけられていることがわかります。このようにたくさんの領域があるのは、カーネルコード、カーネルスタック、物理メモリ対応、ブート情報が互いに離れたメモリ領域を使っているためです。 +いくつかの空でないエントリがあり、いずれも異なるレベル3テーブルにマップさせられていることがわかります。このようにたくさんの領域があるのは、カーネルコード、カーネルスタック、物理メモリマッピング、ブート情報が互いに離れたメモリ領域を使っているためです。 ページテーブルを更に辿りレベル3テーブルを見るには、エントリに対応するフレームを取り出し再び仮想アドレスに変換すればよいです: @@ -491,10 +491,10 @@ if !entry.is_unused() { use x86_64::PhysAddr; /// 与えられた仮想アドレスを対応する物理アドレスに変換し、 -/// そのアドレスが対応付けられていないなら`None`を返す。 +/// そのアドレスがマップされていないなら`None`を返す。 /// /// この関数はunsafeである。なぜなら、呼び出し元は全物理メモリが与えられた -/// `physical_memory_offset`(だけずらした上)で対応付けられていることを +/// `physical_memory_offset`(だけずらした上)でマップされていることを /// 保証しなくてはならないからである。 pub unsafe fn translate_addr(addr: VirtAddr, physical_memory_offset: VirtAddr) -> Option @@ -554,9 +554,9 @@ fn translate_addr_inner(addr: VirtAddr, physical_memory_offset: VirtAddr) 先程作った`active_level_4_table`関数を再利用せず、`CR3`レジスタからレベル4フレームを読み出すコードを再び書いています。これは簡単に試作するためであり、後でもっと良い方法で作り直すのでご心配なく。 -`Virtaddr`構造体には、(仮想メモリの)インデクスから4つの階層のページテーブルを計算してくれるメソッドが備わっています。この4つのインデクスを配列に格納することで、これらを`for`ループを使って辿ります。`for`ループを抜けたら、最後に計算した`frame`を覚えているので、物理アドレスを計算できます。この`frame`は、forループの中ではページテーブルのフレームを指していて、最後のループのあと(すなわちレベル1エントリを辿ったあと)では対応する(物理)フレームを指しています。 +`Virtaddr`構造体には、(仮想メモリの)インデックスから4つの階層のページテーブルを計算してくれるメソッドが備わっています。この4つのインデックスを配列に格納することで、これらを`for`ループを使って辿ります。`for`ループを抜けたら、最後に計算した`frame`を覚えているので、物理アドレスを計算できます。この`frame`は、forループの中ではページテーブルのフレームを指していて、最後のループのあと(すなわちレベル1エントリを辿ったあと)では対応する(物理)フレームを指しています。 -ループの中では、前と同じように`physical_memory_offset`を使ってフレームをページテーブルの参照に変換します。次に、そのページテーブルのエントリを読み、[`PageTableEntry::frame`]関数を使って対応するフレームを取得します。もしエントリがフレームに対応付けられていなければ`None`を返します。もしエントリが2MiBや1GiBのhuge pageに対応付けられていたら、今のところはpanicすることにします。 +ループの中では、前と同じように`physical_memory_offset`を使ってフレームをページテーブルの参照に変換します。次に、そのページテーブルのエントリを読み、[`PageTableEntry::frame`]関数を使って対応するフレームを取得します。もしエントリがフレームにマップされていなければ`None`を返します。もしエントリが2MiBや1GiBのhuge pageにマップされていたら、今のところはpanicすることにします。 [`PageTableEntry::frame`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/page_table/struct.PageTableEntry.html#method.frame @@ -580,7 +580,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { 0x201008, // スタックページのどこか 0x0100_0020_1a10, - // 物理アドレス "0" に対応付けられている仮想アドレス + // 物理アドレス "0" にマップされている仮想アドレス boot_info.physical_memory_offset, ]; @@ -598,19 +598,19 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { ![0xb8000 -> 0xb8000, 0x201008 -> 0x401008, 0x10000201a10 -> 0x279a10, "panicked at 'huge pages not supported'](qemu-translate-addr.png) -期待したとおり、恒等対応しているアドレス`0xb8000`は同じ物理アドレスに変換されました。コードページとスタックページは物理アドレスのどこかしかに変換されていますが、その場所はブートローダがカーネルの初期対応づけをどのようにつくったかによります。また、下から12ビットは変換のあとも常に同じであるということも注目に値します:この部分は[ページオフセット][_page offset_]であり、変換には関わらないためです。 +期待したとおり、恒等マップしているアドレス`0xb8000`は同じ物理アドレスに変換されました。コードページとスタックページは物理アドレスのどこかしかに変換されていますが、その場所はブートローダがカーネルの初期マッピングをどのようにつくったかによります。また、下から12ビットは変換のあとも常に同じであるということも注目に値します:この部分は[ページオフセット][_page offset_]であり、変換には関わらないためです。 [_page offset_]: @/edition-2/posts/08-paging-introduction/index.ja.md#x86-64niokerupezingu -それぞれの物理アドレスは`physical_memory_offset`を足すことでアクセスできるわけですから、`physical_memory_offset`自体を変換すると物理アドレス`0`を指すはずです。しかし、効率よく対応付けを行うためにここではhuge pageが使われており、これはまだサポートしていないので変換には失敗しています。 +それぞれの物理アドレスは`physical_memory_offset`を足すことでアクセスできるわけですから、`physical_memory_offset`自体を変換すると物理アドレス`0`を指すはずです。しかし、効率よくマッピングを行うためにここではhuge pageが使われており、これはまだサポートしていないので変換には失敗しています。 ### `OffsetPageTable`を使う 仮想アドレスから物理アドレスへの変換はOSのカーネルがよく行うことですから、`x86_64`クレートはそのための抽象化を提供しています。この実装はすでにhuge pageや`translate_addr`以外の様々な関数もサポートしているので、以下ではhuge pageのサポートを自前で実装する代わりにこれを使うことにします。 -この抽象化の基礎となっているのは、様々なページテーブル対応付け関数を定義している2つのトレイトです。 +この抽象化の基礎となっているのは、様々なページテーブルマッピング関数を定義している2つのトレイトです。 -- [`Mapper`]トレイトはページサイズを型引数とする汎用型 (ジェネリクス) で、ページに対して操作を行う関数を提供します。例えば、[`translate_page`]は与えられたページを同じサイズのフレームに変換し、[`map_to`]はページテーブルに新しい対応付けを作成します。 +- [`Mapper`]トレイトはページサイズを型引数とする汎用型 (ジェネリクス) で、ページに対して操作を行う関数を提供します。例えば、[`translate_page`]は与えられたページを同じサイズのフレームに変換し、[`map_to`]はページテーブルに新しいマッピングを作成します。 - [`Translate`] トレイトは[`translate_addr`]や一般の[`translate`]のような、さまざまなページサイズに対して動くような関数を提供します。 [`Mapper`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Mapper.html @@ -620,13 +620,13 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { [`translate_addr`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Translate.html#method.translate_addr [`translate`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/trait.Translate.html#tymethod.translate -これらのトレイトはインターフェイスを定義しているだけであり、その実装は何一つ提供していません。`x86_64`クレートは現在、このトレイトを実装する型を異なる要件に合わせて3つ用意しています。[`OffsetPageTable`]型は、全物理メモリがあるオフセットで仮想アドレスに対応していることを前提とします。[`MappedPageTable`]はもう少し融通が効き、それぞれのページテーブルフレームが(そのフレームから)計算可能な仮想アドレスに対応していることだけを前提とします。最後に[`RecursivePageTable`]型は、ページテーブルのフレームに[再帰的ページテーブル](#zai-gui-de-peziteburu)を使ってアクセスするときに使えます。 +これらのトレイトはインターフェイスを定義しているだけであり、その実装は何一つ提供していません。`x86_64`クレートは現在、このトレイトを実装する型を異なる要件に合わせて3つ用意しています。[`OffsetPageTable`]型は、全物理メモリがあるオフセットで仮想アドレスにマップしていることを前提とします。[`MappedPageTable`]はもう少し融通が効き、それぞれのページテーブルフレームが(そのフレームから)計算可能な仮想アドレスにマップしていることだけを前提とします。最後に[`RecursivePageTable`]型は、ページテーブルのフレームに[再帰的ページテーブル](#zai-gui-de-peziteburu)を使ってアクセスするときに使えます。 [`OffsetPageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html [`MappedPageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.MappedPageTable.html [`RecursivePageTable`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.RecursivePageTable.html -私達の場合、ブートローダは全物理メモリを`physical_memory_offset`変数で指定された仮想アドレスで物理メモリに対応付けているので、`OffsetPageTable`型が使えます。これを初期化するために、`memory`モジュールに新しく`init`関数を作りましょう: +私達の場合、ブートローダは全物理メモリを`physical_memory_offset`変数で指定された仮想アドレスで物理メモリにマップしているので、`OffsetPageTable`型が使えます。これを初期化するために、`memory`モジュールに新しく`init`関数を作りましょう: ```rust use x86_64::structures::paging::OffsetPageTable; @@ -635,7 +635,7 @@ use x86_64::structures::paging::OffsetPageTable; /// /// この関数はunsafeである:全物理メモリが、渡された /// `physical_memory_offset`(だけずらしたうえ)で -/// 仮想メモリへと対応付けられていることを呼び出し元が +/// 仮想メモリへとマップされていることを呼び出し元が /// 保証しなければならない。また、`&mut`参照が複数の /// 名称を持つこと (mutable aliasingといい、動作が未定義) /// につながるため、この関数は一度しか呼び出してはならない。 @@ -650,7 +650,7 @@ unsafe fn active_level_4_table(physical_memory_offset: VirtAddr) {…} ``` -この関数は`physical_memory_offset`を引数としてとり、`'static`ライフタイムを持つ`OffsetPageTable`を作って返します。このライフタイムは、私達のカーネルが実行している間この実体 (インスタンス) はずっと有効であるという意味です。関数の中ではまず`active_level_4_table`関数を呼び出し、レベル4ページテーブルへの可変参照を取得します。次に[`OffsetPageTable::new`]関数をこの参照を使って呼び出します。この`new`関数の第二引数には、物理メモリの対応付けの始まる仮想アドレスが入ることになっています。つまり`physical_memory_offset`です。 +この関数は`physical_memory_offset`を引数としてとり、`'static`ライフタイムを持つ`OffsetPageTable`を作って返します。このライフタイムは、私達のカーネルが実行している間この実体 (インスタンス) はずっと有効であるという意味です。関数の中ではまず`active_level_4_table`関数を呼び出し、レベル4ページテーブルへの可変参照を取得します。次に[`OffsetPageTable::new`]関数をこの参照を使って呼び出します。この`new`関数の第二引数には、物理メモリのマッピングの始まる仮想アドレスが入ることになっています。つまり`physical_memory_offset`です。 [`OffsetPageTable::new`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/mapper/struct.OffsetPageTable.html#method.new @@ -691,24 +691,24 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { ![0xb8000 -> 0xb8000, 0x201008 -> 0x401008, 0x10000201a10 -> 0x279a10, 0x18000000000 -> 0x0](qemu-mapper-translate-addr.png) -想定通り、`0xb8000`やコード・スタックアドレスの変換結果は自前の変換関数と同じになっています。また、`physical_memory_offset`は物理アドレス`0x0`に対応付けられているのもわかります。 +想定通り、`0xb8000`やコード・スタックアドレスの変換結果は自前の変換関数と同じになっています。また、`physical_memory_offset`は物理アドレス`0x0`にマップされているのもわかります。 `MappedPageTable`型の変換関数を使うことで、huge pageをサポートする手間が省けます。また`map_to`のような他のページング関数も利用でき、これは次のセクションで使います。 この時点で、自作した`memory::translate_addr`関数や`memory::translate_addr_inner`関数はもう必要ではないので削除して構いません。 -### 新しい対応を作る +### 新しいマッピングを作る -これまでページテーブルを見てきましたが、それに対する変更は行っていませんでした。ページテーブルに対する変更として、対応のなかったページに対応を作ってみましょう。 +これまでページテーブルを見てきましたが、それに対する変更は行っていませんでした。ページテーブルに対する変更として、マッピングのなかったページにマッピングを作ってみましょう。 -これを実装するには[`Mapper`]トレイトの[`map_to`]関数を使うので、この関数について少し見てみましょう。ドキュメントによると四つ引数があります:対応に使うページ、ページを対応させるフレーム、ページテーブルエントリにつかうフラグの集合、そして`frame_allocator`です。フレームアロケータ (frame allocator) (フレームを割り当てる (アロケートする) 機能を持つ)が必要な理由は、与えられたページを対応付けるために追加でページテーブルを作成する必要があるかもしれず、これを格納するためには使われていないフレームが必要となるからです。 +これを実装するには[`Mapper`]トレイトの[`map_to`]関数を使うので、この関数について少し見てみましょう。ドキュメントによると四つ引数があります:マッピングに使うページ、ページをマップさせるフレーム、ページテーブルエントリにつかうフラグの集合、そして`frame_allocator`です。フレームアロケータ (frame allocator) (フレームを割り当てる (アロケートする) 機能を持つ)が必要な理由は、与えられたページをマップするために追加でページテーブルを作成する必要があるかもしれず、これを格納するためには使われていないフレームが必要となるからです。 [`map_to`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/trait.Mapper.html#tymethod.map_to [`Mapper`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/trait.Mapper.html #### `create_example_mapping`関数 -私達が実装していく最初のステップとして、`create_example_mapping`関数という、与えられた仮想ページを`0xb8000`すなわちVGAテキストバッファの物理フレームに対応付ける関数を作ってみましょう。このフレームを選んだ理由は、対応付けが正しくなされたかをテストするのが容易だからです:対応付けたページに書き込んで、それが画面に現れるか確認するだけでよいのですから。 +私達が実装していく最初のステップとして、`create_example_mapping`関数という、与えられた仮想ページを`0xb8000`すなわちVGAテキストバッファの物理フレームにマップする関数を作ってみましょう。このフレームを選んだ理由は、マッピングが正しくなされたかをテストするのが容易だからです:マッピングしたページに書き込んで、それが画面に現れるか確認するだけでよいのですから。 `create_example_mapping`は以下のようになります: @@ -720,7 +720,7 @@ use x86_64::{ structures::paging::{Page, PhysFrame, Mapper, Size4KiB, FrameAllocator} }; -/// 与えられたページをフレーム`0xb8000`に試しに対応付ける。 +/// 与えられたページをフレーム`0xb8000`に試しにマップする。 pub fn create_example_mapping( page: Page, mapper: &mut OffsetPageTable, @@ -739,20 +739,20 @@ pub fn create_example_mapping( } ``` -この関数は、対応付ける`page`に加え`OffsetPageTable`のインスタンスと`frame_allocator`への可変参照を引数に取ります。`frame_allocator`引数は[`impl Trait`][impl-trait-arg]構文により[`FrameAllocator`]トレイトを実装するあらゆる型の[汎用型][generic]になっています。`FrameAllocator`トレイトは[`PageSize`]トレイトを実装するなら(トレイト引数のサイズが)4KiBでも2MiBや1GiBのhuge pageでも構わない汎用 (ジェネリック) トレイトです。私達は4KiBの対応付けのみを作りたいので、ジェネリック引数は`Size4KiB`にしています。 +この関数は、マップする`page`に加え`OffsetPageTable`のインスタンスと`frame_allocator`への可変参照を引数に取ります。`frame_allocator`引数は[`impl Trait`][impl-trait-arg]構文により[`FrameAllocator`]トレイトを実装するあらゆる型の[汎用型][generic]になっています。`FrameAllocator`トレイトは[`PageSize`]トレイトを実装するなら(トレイト引数のサイズが)4KiBでも2MiBや1GiBのhuge pageでも構わない汎用 (ジェネリック) トレイトです。私達は4KiBのマッピングのみを作りたいので、ジェネリック引数は`Size4KiB`にしています。 [impl-trait-arg]: https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters [generic]: https://doc.rust-lang.org/book/ch10-00-generics.html [`FrameAllocator`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/trait.FrameAllocator.html [`PageSize`]: https://docs.rs/x86_64/0.14.2/x86_64/structures/paging/page/trait.PageSize.html -[`map_to`]メソッドは、呼び出し元がフレームはまだ使われていないことを保証しないといけないので、unsafeです。なぜなら、同じフレームを二度対応付けると(例えば2つの異なる`&mut`参照が物理メモリの同じ場所を指すことで)未定義動作を起こす可能性があるからです。今回、VGAテキストバッファのフレームという、すでに対応付けられているフレームを再度使っているので、この要件を破ってしまっています。しかしながら、`create_example_mapping`関数は一時的なテスト関数であり、この記事のあとには取り除かれるので大丈夫です。この危険性のことを忘れないようにするために、その行に`FIXME` (`要修正`) コメントをつけておきます。 +[`map_to`]メソッドは、呼び出し元がフレームはまだ使われていないことを保証しないといけないので、unsafeです。なぜなら、同じフレームを二度マップすると(例えば2つの異なる`&mut`参照が物理メモリの同じ場所を指すことで)未定義動作を起こす可能性があるからです。今回、VGAテキストバッファのフレームという、すでにマップされているフレームを再度使っているので、この要件を破ってしまっています。しかしながら、`create_example_mapping`関数は一時的なテスト関数であり、この記事のあとには取り除かれるので大丈夫です。この危険性のことを忘れないようにするために、その行に`FIXME` (`要修正`) コメントをつけておきます。 `map_to`関数が`page`と`unused_frame`に加えてフラグの集合と`frame_allocator`への参照を取りますが、これについてはすぐに説明します。フラグについては、`PRESENT`フラグという有効なエントリ全てに必須のフラグと、`WRITABLE`フラグという対応するページを書き込み可能にするフラグをセットしています。フラグの一覧については、前記事の[ページテーブルの形式][_Page Table Format_]を参照してください。 [_Page Table Format_]: @/edition-2/posts/08-paging-introduction/index.ja.md#peziteburunoxing-shi -[`map_to`]関数は失敗しうるので、[`Result`]を返します。これは失敗しても構わない単なるテストコードなので、エラーが起きたときは[`expect`]を使ってパニックしてしまうことにします。この関数は成功したとき[`MapperFlush`]型を返します。この型の[`flush`]メソッドを使うと、新しく対応させたページをトランスレーション・ルックアサイド・バッファ (TLB) から簡単にflushすることができます。この型は`Result`と同じく[`#[must_use]`][must_use]属性を使っており、使用し忘れると警告を出します。 +[`map_to`]関数は失敗しうるので、[`Result`]を返します。これは失敗しても構わない単なるテストコードなので、エラーが起きたときは[`expect`]を使ってパニックしてしまうことにします。この関数は成功したとき[`MapperFlush`]型を返します。この型の[`flush`]メソッドを使うと、新しくマッピングしたページをトランスレーション・ルックアサイド・バッファ (TLB) から簡単にflushすることができます。この型は`Result`と同じく[`#[must_use]`][must_use]属性を使っており、使用し忘れると警告を出します。 [`Result`]: https://doc.rust-lang.org/core/result/enum.Result.html [`expect`]: https://doc.rust-lang.org/core/result/enum.Result.html#method.expect @@ -764,7 +764,7 @@ pub fn create_example_mapping( `create_example_mapping`関数を呼べるようにするためには、まず`FrameAllocator`トレイトを実装する型を作成する必要があります。上で述べたように、このトレイトは新しいページのためのフレームを`map_to`が必要としたときに割り当てる役割を持っています。 -単純なケースを考えましょう:新しいページテーブルを作る必要がないと仮定してしまいます。この場合、常に`None`を返すフレームアロケータで十分です。私達の対応付け関数をテストするために、そのような`EmptyFrameAllocator`を作ります。 +単純なケースを考えましょう:新しいページテーブルを作る必要がないと仮定してしまいます。この場合、常に`None`を返すフレームアロケータで十分です。私達のマッピング関数をテストするために、そのような`EmptyFrameAllocator`を作ります。 ```rust // in src/memory.rs @@ -779,30 +779,30 @@ unsafe impl FrameAllocator for EmptyFrameAllocator { } ``` -`FrameAllocator`を実装するのはunsafeです。なぜなら、実装する人は、実装したアロケータが未使用のフレームのみ取得することを保証しなければならないからです。さもなくば、例えば二つの仮想ページが同じ物理フレームに対応付けられたときに未定義動作が起こるかもしれません。この`EmptyFrameAllocator`は`None`しか返さないので、これは問題ではありません。 +`FrameAllocator`を実装するのはunsafeです。なぜなら、実装する人は、実装したアロケータが未使用のフレームのみ取得することを保証しなければならないからです。さもなくば、例えば二つの仮想ページが同じ物理フレームにマップされたときに未定義動作が起こるかもしれません。この`EmptyFrameAllocator`は`None`しか返さないので、これは問題ではありません。 #### 仮想ページを選ぶ -`create_example_mapping`関数に渡すための単純なフレームアロケータを手に入れました。しかし、このアロケータは常に`None`を返すので、対応を作る際に追加のページテーブルフレームが必要でなかったときにのみうまく動作します。いつ追加のページテーブルフレームが必要でありいつそうでないのかを知るために、例をとって考えてみましょう: +`create_example_mapping`関数に渡すための単純なフレームアロケータを手に入れました。しかし、このアロケータは常に`None`を返すので、マッピングを作る際に追加のページテーブルフレームが必要でなかったときにのみうまく動作します。いつ追加のページテーブルフレームが必要でありいつそうでないのかを知るために、例をとって考えてみましょう: ![A virtual and a physical address space with a single mapped page and the page tables of all four levels](required-page-frames-example.svg) -この図の左は仮想アドレス空間を、右は物理アドレス空間を、真ん中はページテーブルを示します。このページテーブルが格納されている物理フレームが破線で示されています。仮想アドレス空間は一つの対応付けられたページをアドレス`0x803fe00000`に持っており、これは青色で示されています。このページをフレームに変換するために、CPUは4層のページテーブルを辿り、アドレス36KiBのフレームに到達します。 +この図の左は仮想アドレス空間を、右は物理アドレス空間を、真ん中はページテーブルを示します。このページテーブルが格納されている物理フレームが破線で示されています。仮想アドレス空間は一つのマップされたページをアドレス`0x803fe00000`に持っており、これは青色で示されています。このページをフレームに変換するために、CPUは4層のページテーブルを辿り、アドレス36KiBのフレームに到達します。 -また、この図はVGAテキストバッファの物理フレームを赤色で示しています。私達の目的は、`create_example_mapping`関数を使ってまだ対応付けられていない仮想ページをこのフレームに対応付けることです。私達の`EmptyFrameAllocator`は常に`None`を返すので、アロケータからフレームを追加する必要がないように対応付けを作りたいです。これができるかは、私達が対応付けにどの仮想ページを使うかに依存します。 +また、この図はVGAテキストバッファの物理フレームを赤色で示しています。私達の目的は、`create_example_mapping`関数を使ってまだマップされていない仮想ページをこのフレームにマップすることです。私達の`EmptyFrameAllocator`は常に`None`を返すので、アロケータからフレームを追加する必要がないようにマッピングを作りたいです。これができるかは、私達がマッピングにどの仮想ページを使うかに依存します。 -この図の仮想アドレス空間には、2つの候補となるページを黄色で示しています。ページのうち一つはアドレス`0x803fe00000`で、これは(青で示された)対応付けられているページの3つ前です。レベル4と3のテーブルのインデクスは青いページと同じですが、レベル2と1のインデクスは違います([前の記事][page-table-indices]を参照)。レベル2テーブルのインデクスが違うということは、異なるレベル1テーブルが使われることを意味します。そんなレベル1テーブルは存在しないので、もしこちらを使っていたら、使われていない物理フレームを追加(でアロケート)する必要が出てきます。対して、2つ目のアドレス`0x803fe02000`にある候補のページは、青のページと同じレベル1ページテーブルを使うのでこの問題は発生しません。よって、必要となるすべてのページテーブルはすでに存在しています。 +この図の仮想アドレス空間には、2つの候補となるページを黄色で示しています。ページのうち一つはアドレス`0x803fe00000`で、これは(青で示された)マップされているページの3つ前です。レベル4と3のテーブルのインデックスは青いページと同じですが、レベル2と1のインデックスは違います([前の記事][page-table-indices]を参照)。レベル2テーブルのインデックスが違うということは、異なるレベル1テーブルが使われることを意味します。そんなレベル1テーブルは存在しないので、もしこちらを使っていたら、使われていない物理フレームを追加(でアロケート)する必要が出てきます。対して、2つ目のアドレス`0x803fe02000`にある候補のページは、青のページと同じレベル1ページテーブルを使うのでこの問題は発生しません。よって、必要となるすべてのページテーブルはすでに存在しています。 [page-table-indices]: @/edition-2/posts/08-paging-introduction/index.ja.md#x86-64niokerupezingu -まとめると、新しい対応を作るときの難易度は、対応付けようとしている仮想ページに依存するということです。作ろうとしているページのレベル1ページテーブルがすでに存在すると最も簡単で、エントリをそのページに一つ書き込むだけです。ページがレベル3のテーブルすら存在しない領域にある場合が最も難しく、その場合まずレベル3,2,1のページテーブルを新しく作る必要があります。 +まとめると、新しいマッピングを作るときの難易度は、マッピングしようとしている仮想ページに依存するということです。作ろうとしているページのレベル1ページテーブルがすでに存在すると最も簡単で、エントリをそのページに一つ書き込むだけです。ページがレベル3のテーブルすら存在しない領域にある場合が最も難しく、その場合まずレベル3,2,1のページテーブルを新しく作る必要があります。 -`EmptyFrameAllocator`を使って`create_example_mapping`を呼び出すためには、すべての(階層の)ページテーブルがすでに存在しているページを選ぶ必要があります。そんなページを探すにあたっては、ブートローダが自分自身を仮想アドレス空間の最初の1メガバイトに読み込んでいるということを利用できます。つまり、この領域のすべてのページについて、レベル1テーブルがきちんと存在しているということです。したがって、試しに対応を作るときに、このメモリ領域のいずれかの未使用ページ、例えばアドレス`0`を使えばよいです。普通このページは、ヌルポインタの参照外しがページフォルトを引き起こすことを保証するために使用しないので、ブートローダもここを対応させてはいないはずです。 +`EmptyFrameAllocator`を使って`create_example_mapping`を呼び出すためには、すべての(階層の)ページテーブルがすでに存在しているページを選ぶ必要があります。そんなページを探すにあたっては、ブートローダが自分自身を仮想アドレス空間の最初の1メガバイトに読み込んでいるということを利用できます。つまり、この領域のすべてのページについて、レベル1テーブルがきちんと存在しているということです。したがって、試しにマッピングを作るときに、このメモリ領域のいずれかの未使用ページ、例えばアドレス`0`を使えばよいです。普通このページは、ヌルポインタの参照外しがページフォルトを引き起こすことを保証するために使用しないので、ブートローダもここをマップさせてはいないはずです。 -#### 対応を作る +#### マッピングを作る -というわけで、`create_example_mapping`関数を呼び出すために必要なすべての引数を手に入れたので、仮想アドレス`0`を対応付けるよう`kernel_main`関数を変更していきましょう。このページをVGAテキストバッファのフレームに対応付けると、以後、画面に書き込むことができるようになるはずです。実装は以下のようになります: +というわけで、`create_example_mapping`関数を呼び出すために必要なすべての引数を手に入れたので、仮想アドレス`0`をマップするよう`kernel_main`関数を変更していきましょう。このページをVGAテキストバッファのフレームにマップすると、以後、画面に書き込むことができるようになるはずです。実装は以下のようになります: ```rust // in src/main.rs @@ -817,11 +817,11 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { let mut mapper = unsafe { memory::init(phys_mem_offset) }; let mut frame_allocator = memory::EmptyFrameAllocator; - // 未使用のページを対応付ける + // 未使用のページをマップする let page = Page::containing_address(VirtAddr::new(0)); memory::create_example_mapping(page, &mut mapper, &mut frame_allocator); - // 新しい対応付けを使って、文字列`New!`を画面に書き出す + // 新しいマッピングを使って、文字列`New!`を画面に書き出す let page_ptr: *mut u64 = page.start_address().as_mut_ptr(); unsafe { page_ptr.offset(400).write_volatile(0x_f021_f077_f065_f04e)}; @@ -829,7 +829,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { } ``` -まず、`mapper`と`frame_allocator`インスタンスの可変参照を渡して`create_example_mapping`を呼ぶことで、アドレス`0`のページに対応を作っています。これはVGAテキストバッファのフレームに対応付けているので、これに書き込んだものは何であれ画面に出てくるはずです。 +まず、`mapper`と`frame_allocator`インスタンスの可変参照を渡して`create_example_mapping`を呼ぶことで、アドレス`0`のページにマッピングを作っています。これはVGAテキストバッファのフレームにマップしているので、これに書き込んだものは何であれ画面に出てくるはずです。 次にページを生ポインタに変更して、オフセット`400`に値を書き込みます。このページの最初に書き込むとVGAバッファの一番上の行になり、次のprintlnで即座に画面外に流れていってしまうので、それを避けています。値`0x_f021_f077_f065_f04e`は、白背景の"New!"という文字列を表します。[VGAテキストモードの記事][in the _“VGA Text Mode”_ post]で学んだように、VGAバッファへの書き込みはvolatileでなければならないので、[`write_volatile`]メソッドを使っています。 @@ -840,9 +840,9 @@ QEMUで実行すると、以下の出力を得ます: ![QEMU printing "It did not crash!" with four completely white cells in the middle of the screen](qemu-new-mapping.png) -画面の "New!" はページ`0`への書き込みによるものなので、ページテーブルへの新しい対応付けの作成が成功したということを意味します。 +画面の "New!" はページ`0`への書き込みによるものなので、ページテーブルへの新しいマッピングの作成が成功したということを意味します。 -この対応付けが成功したのは、アドレス`0`を管轄するレベル1テーブルがすでに存在していたからに過ぎません。レベル1テーブルがまだ存在しないページを対応付けようとすると、`map_to`関数は新しいページテーブルを作るために`EmptyFrameAllocator`からフレームを割り当てようとしてエラーになります。`0`の代わりに`0xdeadbeaf000`を対応付けようとするとそれが発生するのが見られます。 +このマッピングが成功したのは、アドレス`0`を管轄するレベル1テーブルがすでに存在していたからに過ぎません。レベル1テーブルがまだ存在しないページをマッピングしようとすると、`map_to`関数は新しいページテーブルを作るために`EmptyFrameAllocator`からフレームを割り当てようとしてエラーになります。`0`の代わりに`0xdeadbeaf000`をマッピングしようとするとそれが発生するのが見られます。 ```rust // in src/main.rs @@ -860,7 +860,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { panicked at 'map_to failed: FrameAllocationFailed', /…/result.rs:999:5 ``` -レベル1テーブルがまだ存在していないページを対応付けるためには、ちゃんとした`FrameAllocator`を作らないといけません。しかし、どのフレームが未使用で、どのフレームが利用可能かはどうすればわかるのでしょう? +レベル1テーブルがまだ存在していないページをマップするためには、ちゃんとした`FrameAllocator`を作らないといけません。しかし、どのフレームが未使用で、どのフレームが利用可能かはどうすればわかるのでしょう? ### フレームを割り当てる @@ -930,7 +930,7 @@ impl BootInfoFrameAllocator { この関数はイテレータのコンビネータメソッドを使って、最初に与えられる`MemoryMap`を使用可能な物理フレームのイテレータに変換します: - まず`iter`メソッドを使ってメモリマップを[`MemoryRegion`]のイテレータに変える。 -- 次に[`filter`]メソッドを使って、予約済みなどの理由で使用不可能な領域を飛ばすようにする。ブートローダは作った対応付けに使ったメモリマップはきちんと更新するので、私達のカーネル(コード、データ、スタック)に使われているフレームやブート情報を格納するのに使われているフレームはすでに`InUse` (`使用中`) などでマークされています。そのため`Usable`なフレームは他の場所では使われていないはずとわかります。 +- 次に[`filter`]メソッドを使って、予約済みなどの理由で使用不可能な領域を飛ばすようにする。ブートローダは作ったマッピングに使ったメモリマップはきちんと更新するので、私達のカーネル(コード、データ、スタック)に使われているフレームやブート情報を格納するのに使われているフレームはすでに`InUse` (`使用中`) などでマークされています。そのため`Usable`なフレームは他の場所では使われていないはずとわかります。 - つぎに、[`map`]コンビネータとRustの[range構文][range syntax]を使って、メモリ領域のイテレータからアドレス範囲のイテレータへと変換する。 - つぎに、アドレス範囲から[`step_by`]で4096個ごとにアドレスを選び、[`flat_map`]を使うことでフレームの最初のアドレスのイテレータを得る。4096バイト(=4KiB)はページのサイズに等しいので、それぞれのフレームの開始地点のアドレスが得られます。ブートローダのページは使用可能なメモリ領域をすべてアラインするので、ここで改めてアラインや丸めを行う必要はありません。`map`ではなく[`flat_map`]を使うことで、`Iterator>`ではなく`Iterator`を得ています。 - 最後に、開始アドレスの型を`PhysFrame`に変更することで`Iterator`を得ている。 @@ -989,24 +989,24 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { } ``` -ブート情報を使うフレームアロケータのおかげで対応付けは成功し、白背景に黒文字の"New!"が再び画面に現れました。舞台裏では、`map_to`メソッドが不足しているページテーブルを以下のやり方で作っています: +ブート情報を使うフレームアロケータのおかげでマッピングは成功し、白背景に黒文字の"New!"が再び画面に現れました。舞台裏では、`map_to`メソッドが不足しているページテーブルを以下のやり方で作っています: - 渡された`frame_allocator`を使って未使用のフレームを割り当ててもらう。 - フレームをゼロで埋めることで、新しい空のページテーブルを作る。 -- 上位のテーブルのエントリをそのフレームに対応付ける。 +- 上位のテーブルのエントリをそのフレームにマップする。 - 次の層で同じことを続ける。 -`create_example_mapping`関数はただのお試しコードにすぎませんが、今や私達は任意のページに対応付けを作れるようになりました。これは、今後の記事で行うメモリ割り当てやマルチスレッディングにおいて不可欠です。 +`create_example_mapping`関数はただのお試しコードにすぎませんが、今や私達は任意のページにマッピングを作れるようになりました。これは、今後の記事で行うメモリ割り当てやマルチスレッディングにおいて不可欠です。 [上](#create-example-mappingguan-shu)で説明したような未定義動作を誤って引き起こしてしまうことのないよう、この時点で`create_example_mapping`関数を再び取り除いておきましょう。 ## まとめ -この記事ではページテーブルのある物理フレームにアクセスするための様々なテクニックを学びました。恒等対応、物理メモリ全体の対応付け、一時的な対応、再帰的ページテーブルなどです。このうち、シンプルでポータブル (アーキテクチャ非依存) で強力な、物理メモリ全体の対応付けを選びました。 +この記事ではページテーブルのある物理フレームにアクセスするための様々なテクニックを学びました。恒等マップ、物理メモリ全体のマッピング、一時的なマッピング、再帰的ページテーブルなどです。このうち、シンプルでポータブル (アーキテクチャ非依存) で強力な、物理メモリ全体のマッピングを選びました。 -ページテーブルにアクセスできなければ物理メモリを対応付けられないので、ブートローダの補助が必要でした。`bootloader`クレートはcargoのfeaturesというオプションを通じて、必要となる対応付けの作成をサポートしています。さらに、必要となる情報をエントリポイント関数の`&BootInfo`引数という形で私達のカーネルに渡してくれます。 +ページテーブルにアクセスできなければ物理メモリをマップされないので、ブートローダの補助が必要でした。`bootloader`クレートはcargoのfeaturesというオプションを通じて、必要となるマッピングの作成をサポートしています。さらに、必要となる情報をエントリポイント関数の`&BootInfo`引数という形で私達のカーネルに渡してくれます。 -実装について。最初はページテーブルを辿る変換関数を自分の手で実装し、そのあとで`x86_64`クレートの`MappedPageTable`型を使いました。また、ページテーブルに新しい対応を作る方法や、そのために必要な`FrameAllocator`をブートローダに渡されたメモリマップをラップすることで作る方法を学びました。 +実装についてですが、最初はページテーブルを辿る変換関数を自分の手で実装し、そのあとで`x86_64`クレートの`MappedPageTable`型を使いました。また、ページテーブルに新しいマッピングを作る方法や、そのために必要な`FrameAllocator`をブートローダに渡されたメモリマップをラップすることで作る方法を学びました。 ## 次は? From 893c1cf4472caf015189fcc6ec082f3bd4ab5deb Mon Sep 17 00:00:00 2001 From: "Shu W. Nakamura" <30687489+woodyZootopia@users.noreply.github.com> Date: Fri, 8 Oct 2021 12:19:07 +0900 Subject: [PATCH 11/28] Update blog/content/edition-2/posts/09-paging-implementation/index.ja.md --- .../edition-2/posts/09-paging-implementation/index.ja.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md index fad6283c..ff00a0bd 100644 --- a/blog/content/edition-2/posts/09-paging-implementation/index.ja.md +++ b/blog/content/edition-2/posts/09-paging-implementation/index.ja.md @@ -10,7 +10,7 @@ translation_based_on_commit = "27ab4518acbb132e327ed4f4f0508393e9d4d684" translators = ["woodyZootopia", "garasubo"] +++ -この記事では私達のカーネルをページングに対応 (マップ) させる方法についてお伝えします。まずページテーブルの物理フレームにカーネルがアクセスできるようにする様々な方法を示し、それらの利点と欠点について議論します。次にアドレス変換関数を、ついで新しい対応付け (マッピング) を作るための関数を実装します。 +この記事では私達のカーネルをページングに対応させる方法についてお伝えします。まずページテーブルの物理フレームにカーネルがアクセスできるようにする様々な方法を示し、それらの利点と欠点について議論します。次にアドレス変換関数を、ついで新しい対応付け (マッピング) を作るための関数を実装します。 From 5654201a09f4375e350c59f3038e801915297df1 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sat, 16 Oct 2021 15:20:12 +0200 Subject: [PATCH 12/28] Add note above comments and link to GitHub discussion --- blog/static/css/edition-2/main.css | 8 ++------ blog/templates/snippets.html | 13 ++++++++++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/blog/static/css/edition-2/main.css b/blog/static/css/edition-2/main.css index 8fc7c411..444ee719 100644 --- a/blog/static/css/edition-2/main.css +++ b/blog/static/css/edition-2/main.css @@ -463,10 +463,6 @@ a strong { margin-bottom: .5rem; } -#comments { - visibility: hidden; -} - -.comment-directly-on-github { - margin-top: 1rem; +.giscus { + margin-top: 1.5rem; } diff --git a/blog/templates/snippets.html b/blog/templates/snippets.html index 14e34a42..452fed9a 100644 --- a/blog/templates/snippets.html +++ b/blog/templates/snippets.html @@ -11,6 +11,16 @@ {% endmacro support %} {% macro giscus(search_term) %} + {% if search_term is number %} + {% set discussion_url = "https://github.com/phil-opp/blog_os/discussions/" ~ search_term %} + {% else %} + {% set discussion_url = `https://github.com/phil-opp/blog_os/discussions/categories/post-comments?discussions_q="` ~ search_term ~ `"` %} + {% endif %} + +

+ Do you have a problem, want to share feedback, or discuss further ideas? Feel free to leave a comment here! Please stick to English and follow Rust's code of conduct. This comment thread directly maps to a discussion on GitHub, so you can also comment there if you prefer. +

+

- Instead of authenticating the giscus application, you can also comment directly on the on GitHub. Just click the "X comments" link at the top — or the date of any comment — to go to the GitHub discussion. + Instead of authenticating the giscus application, you can also comment directly on GitHub.

{% endmacro giscus %} From d3e8714a80defaebe33cd5256707ac3b53f3261d Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sat, 16 Oct 2021 15:20:44 +0200 Subject: [PATCH 13/28] Rename utterances.json to giscus.json to enable origin checks again --- utterances.json => giscus.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename utterances.json => giscus.json (100%) diff --git a/utterances.json b/giscus.json similarity index 100% rename from utterances.json rename to giscus.json From 5155e18ba19e9788fe5386dcfe6455a867ffbb65 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sat, 31 Oct 2020 18:43:13 +0100 Subject: [PATCH 14/28] Use Iosevka font for code blocks and inline code The advantage of Iosevka is its narrow width that allows us to show more columns in code examples without reducing font size. --- blog/static/css/edition-2/main.css | 2 +- blog/static/css/edition-2/poole.css | 13 ++++++++++--- blog/static/fonts/iosevka-regular.woff | Bin 0 -> 458652 bytes blog/static/fonts/iosevka-regular.woff2 | Bin 0 -> 296524 bytes 4 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 blog/static/fonts/iosevka-regular.woff create mode 100644 blog/static/fonts/iosevka-regular.woff2 diff --git a/blog/static/css/edition-2/main.css b/blog/static/css/edition-2/main.css index 444ee719..537a15e8 100644 --- a/blog/static/css/edition-2/main.css +++ b/blog/static/css/edition-2/main.css @@ -1,7 +1,7 @@ h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { padding: 0; color: #a0565c; - font-size: 95%; + font-size: 90%; background-color: inherit; } diff --git a/blog/static/css/edition-2/poole.css b/blog/static/css/edition-2/poole.css index 46057bb4..63ca0128 100644 --- a/blog/static/css/edition-2/poole.css +++ b/blog/static/css/edition-2/poole.css @@ -28,6 +28,13 @@ * Themes */ +@font-face { + font-family: "Iosevka"; + src: url("/fonts/iosevka-regular.woff2") format("woff2"), url("/fonts/iosevka-regular.woff") format("woff"); + font-weight: normal; + font-style: normal; + font-display: swap; +} /* * Body resets @@ -137,7 +144,7 @@ hr { } abbr { - font-size: 85%; + font-size: 90%; font-weight: bold; color: #555; text-transform: uppercase; @@ -150,7 +157,7 @@ abbr[title] { /* Code */ code, pre { - font-family: Menlo, Monaco, Consolas, monospace; + font-family: "Iosevka", monospace; } code { padding: .25em .5em; @@ -164,7 +171,7 @@ pre { margin-top: 0; margin-bottom: 1rem; padding: .5rem; - font-size: .85rem; + font-size: .95rem; line-height: 1.4; white-space: pre; overflow: auto; diff --git a/blog/static/fonts/iosevka-regular.woff b/blog/static/fonts/iosevka-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..28128b6072f5a7fecc37a1feaacb34a367c956c3 GIT binary patch literal 458652 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�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

*;#)6$m-jUdF}4=KUuB1 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 G?g9YfY3~{U literal 0 HcmV?d00001 diff --git a/blog/static/fonts/iosevka-regular.woff2 b/blog/static/fonts/iosevka-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8a963d6447913a82f6d5be116d285dce06aeefb6 GIT binary patch literal 296524 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

g-`pk;>nTmVvTx|Agv<+@%U-5R%*||QQYwtT* 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
0Bf0@p?l#rw>tG|1?_X&@dS?q93Oz13*v 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�&?yplOFEL^EY;XxsnmFyl(tndIxP4bLHs1AD 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𝔑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

Sa3?pcWo^7IRS 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

{%- endif %} + + {{ snippets::dark_mode_note() }} {% endblock main %} diff --git a/blog/templates/snippets.html b/blog/templates/snippets.html index 452fed9a..96dbcf57 100644 --- a/blog/templates/snippets.html +++ b/blog/templates/snippets.html @@ -45,3 +45,12 @@ Instead of authenticating the giscus application, you can also comment directly on GitHub.

{% endmacro giscus %} + +{% macro dark_mode_note() %} +
+

Dark Mode is Experimental

+

+ We're still working on adjusting text colors, fixing images, and removing inconsistencies. If you have any problems, please file an issue. +

+ +{% endmacro dark_mode_note %} From adaaa3238ae1a825142089e0ada85c6faa49f1ef Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sat, 16 Oct 2021 17:27:48 +0200 Subject: [PATCH 21/28] Add meta tag that we support both light and dark mode --- blog/templates/edition-2/base.html | 1 + 1 file changed, 1 insertion(+) diff --git a/blog/templates/edition-2/base.html b/blog/templates/edition-2/base.html index 61762d4d..1a2ab2e7 100644 --- a/blog/templates/edition-2/base.html +++ b/blog/templates/edition-2/base.html @@ -6,6 +6,7 @@ + From 96ab77fd1e0c787902652d4f63ba751c18ecf322 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 17 Oct 2021 14:18:08 +0200 Subject: [PATCH 22/28] Implement a switch for switching between light and dark mode --- blog/sass/css/edition-2/main.scss | 46 ++++++++++++++++++++++++++++++ blog/static/js/edition-2/main.js | 24 ++++++++++++++++ blog/templates/edition-2/base.html | 2 ++ 3 files changed, 72 insertions(+) diff --git a/blog/sass/css/edition-2/main.scss b/blog/sass/css/edition-2/main.scss index f4712bbe..c8ca740f 100644 --- a/blog/sass/css/edition-2/main.scss +++ b/blog/sass/css/edition-2/main.scss @@ -961,6 +961,7 @@ img { background-color: white; } +/* Note that dark mode is experimental */ .dark-mode-note { display: none; @@ -978,3 +979,48 @@ body.dark .dark-mode-note { display: none; } } + +/* Manual switch between dark and light mode */ + +@mixin light-switch-light { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23004' class='bi bi-moon' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M14.53 10.53a7 7 0 0 1-9.058-9.058A7.003 7.003 0 0 0 8 15a7.002 7.002 0 0 0 6.53-4.47z'/%3E%3C/svg%3E"); +} + +@mixin light-switch-dark { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ff9' class='bi bi-brightness-high-fill' viewBox='0 0 16 16'%3E%3Cpath d='M12 8a4 4 0 1 1-8 0 4 4 0 0 1 8 0zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z'/%3E%3C/svg%3E"); +} + +.light-switch { + @include light-switch-light(); +} + +body.dark .light-switch { + @include light-switch-dark(); +} + +@media (prefers-color-scheme: dark) { + .light-switch { + @include light-switch-dark(); + } + + body.light .light-switch { + @include light-switch-light(); + } +} + +.light-switch { + position: fixed; + left: 2rem; + bottom: 2rem; + background-repeat: no-repeat; + width: 2rem; + height: 2rem; + cursor: pointer; + opacity: 0.6; +} + +.light-switch:hover { + transform: scale(1.3); + transition: 200ms ease-out; + opacity: 1; +} diff --git a/blog/static/js/edition-2/main.js b/blog/static/js/edition-2/main.js index dfa1dd4d..513fcd9d 100644 --- a/blog/static/js/edition-2/main.js +++ b/blog/static/js/edition-2/main.js @@ -61,3 +61,27 @@ function toc_scroll_position(container) { current_toc_item.classList.add("active"); } } + +function toggle_lights() { + var body = document.querySelector("body"); + var comment_form = document.querySelector("iframe.giscus-frame"); + if (body != null) { + if (body.classList.contains("dark")) { + body.classList.replace("dark", "light"); + if (comment_form != null) { + comment_form.contentWindow.postMessage({ + giscus: { setConfig: { theme: 'light' } } + }, "https://giscus.app") + } + } else { + body.classList.remove("light"); + body.classList.add("dark"); + if (comment_form != null) { + comment_form.contentWindow.postMessage({ + giscus: { setConfig: { theme: 'dark' } } + }, "https://giscus.app") + } + } + console.log(body) + } +} diff --git a/blog/templates/edition-2/base.html b/blog/templates/edition-2/base.html index 1a2ab2e7..f7baa22d 100644 --- a/blog/templates/edition-2/base.html +++ b/blog/templates/edition-2/base.html @@ -50,6 +50,8 @@
+
+ From 69917e234cc53d48e3b987a83cdc07db61f60b90 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 17 Oct 2021 14:51:00 +0200 Subject: [PATCH 23/28] Remember chosen theme in localStorage This way, the selected theme is kept when changing pages, and for subsequent visits. To prevent flickering, we set the selected theme in a blocking script directly on load. To speed things up further, we now use a `data-theme` attribute instead of classes on the body tag, this way we don't need to wait until the body element is loaded. --- blog/sass/css/edition-2/main.scss | 12 +++--- blog/static/js/edition-2/main.js | 64 +++++++++++++++--------------- blog/templates/edition-2/base.html | 7 ++++ 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/blog/sass/css/edition-2/main.scss b/blog/sass/css/edition-2/main.scss index c8ca740f..03633ae8 100644 --- a/blog/sass/css/edition-2/main.scss +++ b/blog/sass/css/edition-2/main.scss @@ -92,7 +92,7 @@ body { @include set-colors-light(); } -body.dark { +[data-theme="dark"] body { @include set-colors-dark(); } @@ -103,7 +103,7 @@ body.dark { @include set-colors-dark(); } /* Override dark mode with light mode styles if the user decides to swap */ - body.light { + [data-theme="light"] body { @include set-colors-light(); } } @@ -966,7 +966,7 @@ img { .dark-mode-note { display: none; } -body.dark .dark-mode-note { +[data-theme="dark"] .dark-mode-note { display: block; } @media (prefers-color-scheme: dark) { @@ -975,7 +975,7 @@ body.dark .dark-mode-note { display: block; } /* Override dark mode with light mode styles if the user decides to swap */ - body.light .dark-mode-note { + [data-theme="light"] .dark-mode-note { display: none; } } @@ -994,7 +994,7 @@ body.dark .dark-mode-note { @include light-switch-light(); } -body.dark .light-switch { +[data-theme="dark"] .light-switch { @include light-switch-dark(); } @@ -1003,7 +1003,7 @@ body.dark .light-switch { @include light-switch-dark(); } - body.light .light-switch { + [data-theme="light"] .light-switch { @include light-switch-light(); } } diff --git a/blog/static/js/edition-2/main.js b/blog/static/js/edition-2/main.js index 513fcd9d..3a18428f 100644 --- a/blog/static/js/edition-2/main.js +++ b/blog/static/js/edition-2/main.js @@ -1,17 +1,21 @@ -window.onload = function() { - var container = document.querySelector('#toc-aside'); - +window.onload = function () { + let theme = localStorage.getItem("theme"); + if (theme != null) { + set_theme(theme) + } + + let container = document.querySelector('#toc-aside'); if (container != null) { resize_toc(container); toc_scroll_position(container); - window.onscroll = function() { toc_scroll_position(container) }; + window.onscroll = function () { toc_scroll_position(container) }; } } function resize_toc(container) { - var containerHeight = container.clientHeight; + let containerHeight = container.clientHeight; - var resize = function() { + let resize = function () { if (containerHeight > document.documentElement.clientHeight - 100) { container.classList.add('coarse'); } else { @@ -20,8 +24,8 @@ function resize_toc(container) { }; resize(); - var resizeId; - window.onresize = function() { + let resizeId; + window.onresize = function () { clearTimeout(resizeId); resizeId = setTimeout(resize, 300); }; @@ -32,7 +36,6 @@ function toc_scroll_position(container) { // skip computation if ToC is not visible return; } - var items = container.querySelectorAll("li") // remove active class for all items for (item of container.querySelectorAll("li")) { @@ -40,15 +43,15 @@ function toc_scroll_position(container) { } // look for active item - var site_offset = document.documentElement.scrollTop; - var current_toc_item = null; + let site_offset = document.documentElement.scrollTop; + let current_toc_item = null; for (item of container.querySelectorAll("li")) { if (item.offsetParent === null) { // skip items that are not visible continue; } - var anchor = item.firstElementChild.getAttribute("href"); - var heading = document.querySelector(anchor); + let anchor = item.firstElementChild.getAttribute("href"); + let heading = document.querySelector(anchor); if (heading.offsetTop <= (site_offset + document.documentElement.clientHeight / 3)) { current_toc_item = item; } else { @@ -63,25 +66,20 @@ function toc_scroll_position(container) { } function toggle_lights() { - var body = document.querySelector("body"); - var comment_form = document.querySelector("iframe.giscus-frame"); - if (body != null) { - if (body.classList.contains("dark")) { - body.classList.replace("dark", "light"); - if (comment_form != null) { - comment_form.contentWindow.postMessage({ - giscus: { setConfig: { theme: 'light' } } - }, "https://giscus.app") - } - } else { - body.classList.remove("light"); - body.classList.add("dark"); - if (comment_form != null) { - comment_form.contentWindow.postMessage({ - giscus: { setConfig: { theme: 'dark' } } - }, "https://giscus.app") - } - } - console.log(body) + if (document.documentElement.getAttribute("data-theme") === "dark") { + set_theme("light") + } else { + set_theme("dark") } } + +function set_theme(theme) { + let comment_form = document.querySelector("iframe.giscus-frame"); + document.documentElement.setAttribute("data-theme", theme); + if (comment_form != null) { + comment_form.contentWindow.postMessage({ + giscus: { setConfig: { theme: theme } } + }, "https://giscus.app") + } + localStorage.setItem("theme", theme); +} diff --git a/blog/templates/edition-2/base.html b/blog/templates/edition-2/base.html index f7baa22d..80d99688 100644 --- a/blog/templates/edition-2/base.html +++ b/blog/templates/edition-2/base.html @@ -17,6 +17,13 @@ + + {% block title %}{% endblock title %} From 76b6c445e46349bbd786d203de8bb54538a3dc05 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 17 Oct 2021 15:40:48 +0200 Subject: [PATCH 24/28] Add a switch for going back to system theme --- blog/sass/css/edition-2/main.scss | 58 ++++++++++++++++++++++++++++++ blog/static/js/edition-2/main.js | 29 ++++++++++----- blog/templates/edition-2/base.html | 1 + 3 files changed, 79 insertions(+), 9 deletions(-) diff --git a/blog/sass/css/edition-2/main.scss b/blog/sass/css/edition-2/main.scss index 03633ae8..c5f8ed52 100644 --- a/blog/sass/css/edition-2/main.scss +++ b/blog/sass/css/edition-2/main.scss @@ -983,10 +983,12 @@ img { /* Manual switch between dark and light mode */ @mixin light-switch-light { + // icon: https://icons.getbootstrap.com/icons/moon-fill/ (MIT licensed) background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23004' class='bi bi-moon' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M14.53 10.53a7 7 0 0 1-9.058-9.058A7.003 7.003 0 0 0 8 15a7.002 7.002 0 0 0 6.53-4.47z'/%3E%3C/svg%3E"); } @mixin light-switch-dark { + // icon: https://icons.getbootstrap.com/icons/brightness-high-fill/ (MIT licensed) background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ff9' class='bi bi-brightness-high-fill' viewBox='0 0 16 16'%3E%3Cpath d='M12 8a4 4 0 1 1-8 0 4 4 0 0 1 8 0zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z'/%3E%3C/svg%3E"); } @@ -1024,3 +1026,59 @@ img { transition: 200ms ease-out; opacity: 1; } + +/* Clear theme override and go back to system theme */ + +@mixin light-switch-reset-light { + // icon: https://icons.getbootstrap.com/icons/x-circle-fill/ (MIT licensed) + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23666' class='bi bi-x-circle' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); +} + +@mixin light-switch-reset-dark { + // icon: https://icons.getbootstrap.com/icons/x-circle-fill/ (MIT licensed) + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23999' class='bi bi-x-circle' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); +} + +.light-switch-reset { + @include light-switch-reset-light(); +} + +.light-switch-reset { + display: none; +} + +[data-theme="light"] .light-switch-reset { + display: block; +} + +[data-theme="dark"] .light-switch-reset { + @include light-switch-reset-dark(); + display: block; +} + +@media (prefers-color-scheme: dark) { + .light-switch-reset { + @include light-switch-reset-dark(); + } + + [data-theme="light"] .light-switch-reset { + @include light-switch-reset-light(); + } +} + +.light-switch-reset { + position: fixed; + left: 5rem; + bottom: 1.5rem; + background-repeat: no-repeat; + width: 2rem; + height: 2rem; + cursor: pointer; + opacity: 0.6; +} + +.light-switch-reset:hover { + transform: scale(1.1); + transition: 200ms ease-out; + opacity: 1; +} diff --git a/blog/static/js/edition-2/main.js b/blog/static/js/edition-2/main.js index 3a18428f..059bafc8 100644 --- a/blog/static/js/edition-2/main.js +++ b/blog/static/js/edition-2/main.js @@ -3,7 +3,7 @@ window.onload = function () { if (theme != null) { set_theme(theme) } - + let container = document.querySelector('#toc-aside'); if (container != null) { resize_toc(container); @@ -74,12 +74,23 @@ function toggle_lights() { } function set_theme(theme) { - let comment_form = document.querySelector("iframe.giscus-frame"); - document.documentElement.setAttribute("data-theme", theme); - if (comment_form != null) { - comment_form.contentWindow.postMessage({ - giscus: { setConfig: { theme: theme } } - }, "https://giscus.app") - } - localStorage.setItem("theme", theme); + document.documentElement.setAttribute("data-theme", theme) + set_giscus_theme(theme) + localStorage.setItem("theme", theme) } + +function clear_theme_override() { + document.documentElement.removeAttribute("data-theme"); + set_giscus_theme("preferred_color_scheme") + localStorage.removeItem("theme") +} + +function set_giscus_theme(theme) { + let comment_form = document.querySelector("iframe.giscus-frame"); + if (comment_form != null) { + comment_form.contentWindow.postMessage({ + giscus: { setConfig: { theme: theme } } + }, "https://giscus.app") + } +} + diff --git a/blog/templates/edition-2/base.html b/blog/templates/edition-2/base.html index 80d99688..da415b22 100644 --- a/blog/templates/edition-2/base.html +++ b/blog/templates/edition-2/base.html @@ -58,6 +58,7 @@
+
From 5ff1aab7b55be014a15e1725bbfb070bfb2ebfa5 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 17 Oct 2021 16:34:24 +0200 Subject: [PATCH 25/28] Improve layout on mobile and clean up sass code --- blog/sass/css/edition-2/main.scss | 143 ++++++++++++++--------------- blog/templates/edition-2/base.html | 8 +- 2 files changed, 73 insertions(+), 78 deletions(-) diff --git a/blog/sass/css/edition-2/main.scss b/blog/sass/css/edition-2/main.scss index c5f8ed52..d8b8867b 100644 --- a/blog/sass/css/edition-2/main.scss +++ b/blog/sass/css/edition-2/main.scss @@ -982,103 +982,96 @@ img { /* Manual switch between dark and light mode */ -@mixin light-switch-light { - // icon: https://icons.getbootstrap.com/icons/moon-fill/ (MIT licensed) - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23004' class='bi bi-moon' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M14.53 10.53a7 7 0 0 1-9.058-9.058A7.003 7.003 0 0 0 8 15a7.002 7.002 0 0 0 6.53-4.47z'/%3E%3C/svg%3E"); -} +.theme-switch { + margin-bottom: 1rem; -@mixin light-switch-dark { - // icon: https://icons.getbootstrap.com/icons/brightness-high-fill/ (MIT licensed) - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ff9' class='bi bi-brightness-high-fill' viewBox='0 0 16 16'%3E%3Cpath d='M12 8a4 4 0 1 1-8 0 4 4 0 0 1 8 0zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z'/%3E%3C/svg%3E"); + @media (min-width: 80rem) { + position: fixed; + left: 2rem; + bottom: 2rem; + margin-bottom: 0rem; + } } .light-switch { + @mixin light-switch-light { + // icon: https://icons.getbootstrap.com/icons/moon-fill/ (MIT licensed) + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23004' class='bi bi-moon' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M14.53 10.53a7 7 0 0 1-9.058-9.058A7.003 7.003 0 0 0 8 15a7.002 7.002 0 0 0 6.53-4.47z'/%3E%3C/svg%3E"); + } + + @mixin light-switch-dark { + // icon: https://icons.getbootstrap.com/icons/brightness-high-fill/ (MIT licensed) + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ff9' class='bi bi-brightness-high-fill' viewBox='0 0 16 16'%3E%3Cpath d='M12 8a4 4 0 1 1-8 0 4 4 0 0 1 8 0zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z'/%3E%3C/svg%3E"); + } + + display: inline-block; @include light-switch-light(); -} -[data-theme="dark"] .light-switch { - @include light-switch-dark(); -} - -@media (prefers-color-scheme: dark) { - .light-switch { - @include light-switch-dark(); - } - - [data-theme="light"] .light-switch { - @include light-switch-light(); - } -} - -.light-switch { - position: fixed; - left: 2rem; - bottom: 2rem; background-repeat: no-repeat; width: 2rem; height: 2rem; cursor: pointer; opacity: 0.6; -} -.light-switch:hover { - transform: scale(1.3); - transition: 200ms ease-out; - opacity: 1; + &:hover { + transform: scale(1.3); + transition: 200ms ease-out; + opacity: 1; + } + + [data-theme="dark"] & { + @include light-switch-dark(); + } + + @media (prefers-color-scheme: dark) { + @include light-switch-dark(); + + [data-theme="light"] & { + @include light-switch-light(); + } + } } /* Clear theme override and go back to system theme */ -@mixin light-switch-reset-light { - // icon: https://icons.getbootstrap.com/icons/x-circle-fill/ (MIT licensed) - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23666' class='bi bi-x-circle' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); -} - -@mixin light-switch-reset-dark { - // icon: https://icons.getbootstrap.com/icons/x-circle-fill/ (MIT licensed) - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23999' class='bi bi-x-circle' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); -} - .light-switch-reset { + @mixin light-switch-reset-light { + // icon: https://icons.getbootstrap.com/icons/x-circle-fill/ (MIT licensed) + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23666' class='bi bi-x-circle' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); + } + + @mixin light-switch-reset-dark { + // icon: https://icons.getbootstrap.com/icons/x-circle-fill/ (MIT licensed) + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23999' class='bi bi-x-circle' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); + } + @include light-switch-reset-light(); -} - -.light-switch-reset { - display: none; -} - -[data-theme="light"] .light-switch-reset { - display: block; -} - -[data-theme="dark"] .light-switch-reset { - @include light-switch-reset-dark(); - display: block; -} - -@media (prefers-color-scheme: dark) { - .light-switch-reset { - @include light-switch-reset-dark(); - } - - [data-theme="light"] .light-switch-reset { - @include light-switch-reset-light(); - } -} - -.light-switch-reset { - position: fixed; - left: 5rem; - bottom: 1.5rem; + vertical-align: bottom; + margin-left: 0.5rem; background-repeat: no-repeat; width: 2rem; height: 2rem; cursor: pointer; opacity: 0.6; -} -.light-switch-reset:hover { - transform: scale(1.1); - transition: 200ms ease-out; - opacity: 1; + display: none; + [data-theme="light"] & { + display: inline-block; + } + [data-theme="dark"] & { + @include light-switch-reset-dark(); + display: inline-block; + } + + @media (min-width: 80rem) { + position: fixed; + left: 4.5rem; + bottom: 2rem; + } + + &:hover { + transform: scale(1.1); + transition: 200ms ease-out; + opacity: 1; + } } diff --git a/blog/templates/edition-2/base.html b/blog/templates/edition-2/base.html index da415b22..d2b9f81a 100644 --- a/blog/templates/edition-2/base.html +++ b/blog/templates/edition-2/base.html @@ -41,6 +41,11 @@ +
+
+
+
+
{% block toc_aside %}{% endblock toc_aside %}
{% block main %}{% endblock main %}
@@ -57,9 +62,6 @@
-
-
- From 0fa31a0e153e5bda52cc0ca9569ebfcf207db9da Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 17 Oct 2021 16:34:59 +0200 Subject: [PATCH 26/28] Fix: don't assume that light mode is active on initial theme switch --- blog/static/js/edition-2/main.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blog/static/js/edition-2/main.js b/blog/static/js/edition-2/main.js index 059bafc8..1ebee250 100644 --- a/blog/static/js/edition-2/main.js +++ b/blog/static/js/edition-2/main.js @@ -68,8 +68,10 @@ function toc_scroll_position(container) { function toggle_lights() { if (document.documentElement.getAttribute("data-theme") === "dark") { set_theme("light") - } else { + } else if (document.documentElement.getAttribute("data-theme") === "light") { set_theme("dark") + } else { + set_theme(window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "dark") } } From 53e3578e34e221a6ba49316b7f075fc31cea305e Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 17 Oct 2021 17:16:02 +0200 Subject: [PATCH 27/28] Use `crate-ci/typos` action to check for typos The misspell tool that we used previously has no exclude switch for ignoring translated files. Also, it looks like it is not maintained anymore. In addition to changing our spell checker, this commit renames the `Build Site` workflow to `Blog` (to be consistent with our `Code` workflow). --- .github/workflows/{build-site.yml => blog.yml} | 10 +++++----- blog/typos.toml | 13 +++++++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) rename .github/workflows/{build-site.yml => blog.yml} (94%) create mode 100644 blog/typos.toml diff --git a/.github/workflows/build-site.yml b/.github/workflows/blog.yml similarity index 94% rename from .github/workflows/build-site.yml rename to .github/workflows/blog.yml index 9bf498e1..882b8fad 100644 --- a/.github/workflows/build-site.yml +++ b/.github/workflows/blog.yml @@ -1,4 +1,4 @@ -name: Build Site +name: Blog on: push: @@ -59,10 +59,10 @@ jobs: steps: - uses: actions/checkout@v1 - - run: curl -L https://git.io/misspell | bash - name: "Install misspell" - - run: bin/misspell -error blog/content - name: "Check for common typos" + - name: Typo Check + uses: crate-ci/typos@v1.1.9 + with: + files: blog deploy_site: name: "Deploy Generated Site" diff --git a/blog/typos.toml b/blog/typos.toml new file mode 100644 index 00000000..16e52eb3 --- /dev/null +++ b/blog/typos.toml @@ -0,0 +1,13 @@ +[files] +extend-exclude = [ + "*.svg", + "*.zh-CN.md", + "*.ja.md", +] + +[default.extend-words] +IST = "IST" # Interrupt Stack Table + +[default.extend-identifiers] +TheBegining = "TheBegining" # GitHub user mentioned in status reports +h015bf61815bb8afe = "h015bf61815bb8afe" # mangled name used in code example From a41d3236b897634b1ca6ea40d4794033db4c23e7 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 17 Oct 2021 17:37:55 +0200 Subject: [PATCH 28/28] Check translated files too --- .../naked-exceptions/02-better-exception-messages/index.md | 2 +- .../naked-exceptions/03-returning-from-exceptions/index.md | 2 +- blog/content/edition-1/posts/08-kernel-heap/index.md | 2 +- blog/content/edition-1/posts/09-handling-exceptions/index.md | 2 +- .../content/edition-2/posts/07-hardware-interrupts/index.fa.md | 2 +- blog/content/edition-2/posts/07-hardware-interrupts/index.md | 2 +- blog/content/status-update/2019-12-02.md | 2 +- blog/typos.toml | 3 +-- 8 files changed, 8 insertions(+), 9 deletions(-) diff --git a/blog/content/edition-1/extra/naked-exceptions/02-better-exception-messages/index.md b/blog/content/edition-1/extra/naked-exceptions/02-better-exception-messages/index.md index 17289421..9f98c962 100644 --- a/blog/content/edition-1/extra/naked-exceptions/02-better-exception-messages/index.md +++ b/blog/content/edition-1/extra/naked-exceptions/02-better-exception-messages/index.md @@ -628,7 +628,7 @@ bitflags! { - When the `PROTECTION_VIOLATION` flag is set, the page fault was caused e.g. by a write to a read-only page. If it's not set, it was caused by accessing a non-present page. - The `CAUSED_BY_WRITE` flag specifies if the fault was caused by a write (if set) or a read (if not set). -- The `USER_MODE` flag is set when the fault occurred in non-priviledged mode. +- The `USER_MODE` flag is set when the fault occurred in non-privileged mode. - The `MALFORMED_TABLE` flag is set when the page table entry has a 1 in a reserved field. - When the `INSTRUCTION_FETCH` flag is set, the page fault occurred while fetching the next instruction. diff --git a/blog/content/edition-1/extra/naked-exceptions/03-returning-from-exceptions/index.md b/blog/content/edition-1/extra/naked-exceptions/03-returning-from-exceptions/index.md index 5ce204a0..b5ad8907 100644 --- a/blog/content/edition-1/extra/naked-exceptions/03-returning-from-exceptions/index.md +++ b/blog/content/edition-1/extra/naked-exceptions/03-returning-from-exceptions/index.md @@ -426,7 +426,7 @@ The page fault is gone and we see the _“It did not crash”_ message again! So the page fault occurred because our exception handler didn't preserve the scratch register `rax`. Our new `handler!` macro fixes this problem by saving all scratch registers (including `rax`) before calling exception handlers. Thus, `rax` still contains the valid memory address when `rust-main` continues execution. ## Multimedia Registers -When we discussed calling conventions above, we assummed that a x86_64 CPU only has the following 16 registers: `rax`, `rbx`, `rcx`, `rdx`, `rsi`, `rdi`, `rsp`, `rbp`, `r8`, `r9`, `r10`, `r11`.`r12`, `r13`, `r14`, and `r15`. These registers are called _general purpose registers_ since each of them can be used for arithmetic and load/store instructions. +When we discussed calling conventions above, we assumed that a x86_64 CPU only has the following 16 registers: `rax`, `rbx`, `rcx`, `rdx`, `rsi`, `rdi`, `rsp`, `rbp`, `r8`, `r9`, `r10`, `r11`.`r12`, `r13`, `r14`, and `r15`. These registers are called _general purpose registers_ since each of them can be used for arithmetic and load/store instructions. However, modern CPUs also have a set of _special purpose registers_, which can be used to improve performance in several use cases. On x86_64, the most important set of special purpose registers are the _multimedia registers_. These registers are larger than the general purpose registers and can be used to speed up audio/video processing or matrix calculations. For example, we could use them to add two 4-dimensional vectors _in a single CPU instruction_: diff --git a/blog/content/edition-1/posts/08-kernel-heap/index.md b/blog/content/edition-1/posts/08-kernel-heap/index.md index 3b3e5dbd..82686151 100644 --- a/blog/content/edition-1/posts/08-kernel-heap/index.md +++ b/blog/content/edition-1/posts/08-kernel-heap/index.md @@ -415,7 +415,7 @@ pub fn init(boot_info: &BootInformation) { We've just moved the code to a new function. However, we've sneaked some improvements in: - An additional `.filter(|s| s.is_allocated())` in the calculation of `kernel_start` and `kernel_end`. This ignores all sections that aren't loaded to memory (such as debug sections). Thus, the kernel end address is no longer artificially increased by such sections. -- We use the `start_address()` and `end_address()` methods of `boot_info` instead of calculating the adresses manually. +- We use the `start_address()` and `end_address()` methods of `boot_info` instead of calculating the addresses manually. - We use the alternate `{:#x}` form when printing kernel/multiboot addresses. Before, we used `0x{:x}`, which leads to the same result. For a complete list of these “alternate” formatting forms, check out the [std::fmt documentation]. [std::fmt documentation]: https://doc.rust-lang.org/nightly/std/fmt/index.html#sign0 diff --git a/blog/content/edition-1/posts/09-handling-exceptions/index.md b/blog/content/edition-1/posts/09-handling-exceptions/index.md index 09685ae4..e3b896ed 100644 --- a/blog/content/edition-1/posts/09-handling-exceptions/index.md +++ b/blog/content/edition-1/posts/09-handling-exceptions/index.md @@ -379,7 +379,7 @@ Note how this solution requires no `unsafe` blocks or `unwrap` calls. > ##### Aside: How does the `lazy_static!` macro work? > -> The macro generates a `static` of type `Once`. The [`Once`][spin::Once] type is provided by the `spin` crate and allows deferred one-time initialization. It is implemented using an [`AtomicUsize`] for synchronization and an [`UnsafeCell`] for storing the (possibly unitialized) value. So this solution also uses `unsafe` behind the scenes, but it is abstracted away in a safe interface. +> The macro generates a `static` of type `Once`. The [`Once`][spin::Once] type is provided by the `spin` crate and allows deferred one-time initialization. It is implemented using an [`AtomicUsize`] for synchronization and an [`UnsafeCell`] for storing the (possibly uninitialized) value. So this solution also uses `unsafe` behind the scenes, but it is abstracted away in a safe interface. [spin::Once]: https://docs.rs/spin/0.4.5/spin/struct.Once.html [`AtomicUsize`]: https://doc.rust-lang.org/nightly/core/sync/atomic/struct.AtomicUsize.html diff --git a/blog/content/edition-2/posts/07-hardware-interrupts/index.fa.md b/blog/content/edition-2/posts/07-hardware-interrupts/index.fa.md index 089c60c0..d3a91b3b 100644 --- a/blog/content/edition-2/posts/07-hardware-interrupts/index.fa.md +++ b/blog/content/edition-2/posts/07-hardware-interrupts/index.fa.md @@ -251,7 +251,7 @@ extern "x86-interrupt" fn timer_interrupt_handler( ### پیکربندی تایمر -تایمر سخت افزاری که ما از آن استفاده می کنیم ، _Progammable Interval Timer_ یا به اختصار PIT نامیده می شود. همانطور که از نام آن مشخص است ، می توان فاصله بین دو وقفه را پیکربندی کرد. ما در اینجا به جزئیات نمی پردازیم زیرا به زودی به [تایمر APIC] سوییچ خواهیم کرد، اما ویکی OSDev مقاله مفصلی درباره [پیکربندی PIT] دارد. +تایمر سخت افزاری که ما از آن استفاده می کنیم ، _Programmable Interval Timer_ یا به اختصار PIT نامیده می شود. همانطور که از نام آن مشخص است ، می توان فاصله بین دو وقفه را پیکربندی کرد. ما در اینجا به جزئیات نمی پردازیم زیرا به زودی به [تایمر APIC] سوییچ خواهیم کرد، اما ویکی OSDev مقاله مفصلی درباره [پیکربندی PIT] دارد. [تایمر APIC]: https://wiki.osdev.org/APIC_timer [پیکربندی PIT]: https://wiki.osdev.org/Programmable_Interval_Timer diff --git a/blog/content/edition-2/posts/07-hardware-interrupts/index.md b/blog/content/edition-2/posts/07-hardware-interrupts/index.md index 5d1267b5..f99cae90 100644 --- a/blog/content/edition-2/posts/07-hardware-interrupts/index.md +++ b/blog/content/edition-2/posts/07-hardware-interrupts/index.md @@ -246,7 +246,7 @@ When we now execute `cargo run` we see dots periodically appearing on the screen ### Configuring the Timer -The hardware timer that we use is called the _Progammable Interval Timer_ or PIT for short. Like the name says, it is possible to configure the interval between two interrupts. We won't go into details here because we will switch to the [APIC timer] soon, but the OSDev wiki has an extensive article about the [configuring the PIT]. +The hardware timer that we use is called the _Programmable Interval Timer_ or PIT for short. Like the name says, it is possible to configure the interval between two interrupts. We won't go into details here because we will switch to the [APIC timer] soon, but the OSDev wiki has an extensive article about the [configuring the PIT]. [APIC timer]: https://wiki.osdev.org/APIC_timer [configuring the PIT]: https://wiki.osdev.org/Programmable_Interval_Timer diff --git a/blog/content/status-update/2019-12-02.md b/blog/content/status-update/2019-12-02.md index b366c0a9..5d7e4fca 100644 --- a/blog/content/status-update/2019-12-02.md +++ b/blog/content/status-update/2019-12-02.md @@ -15,7 +15,7 @@ We also have other news: We plan to add [Experimental Support for Community Tran ## `bootloader` -- [Change the way the kernel entry point is called to honor alignement ABI](https://github.com/rust-osdev/bootloader/pull/81) by [@GuillaumeDIDIER](https://github.com/GuillaumeDIDIER) (published as version 0.8.2) +- [Change the way the kernel entry point is called to honor alignment ABI](https://github.com/rust-osdev/bootloader/pull/81) by [@GuillaumeDIDIER](https://github.com/GuillaumeDIDIER) (published as version 0.8.2) - [Add support for Github Actions](https://github.com/rust-osdev/bootloader/pull/82) - [Remove unnecessary `extern C` on panic handler to fix not-ffi-safe warning](https://github.com/rust-osdev/bootloader/pull/85) by [@cmsd2](https://github.com/cmsd2) (published as version 0.8.3) diff --git a/blog/typos.toml b/blog/typos.toml index 16e52eb3..099243e3 100644 --- a/blog/typos.toml +++ b/blog/typos.toml @@ -1,12 +1,11 @@ [files] extend-exclude = [ "*.svg", - "*.zh-CN.md", - "*.ja.md", ] [default.extend-words] IST = "IST" # Interrupt Stack Table +SEH = "SEH" # structured exception handling [default.extend-identifiers] TheBegining = "TheBegining" # GitHub user mentioned in status reports

m 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