From 841bf664fab57d41746928fe76ec6047e82a3603 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sat, 14 Sep 2019 17:48:07 +0200 Subject: [PATCH] Improve implementation section of Paging Implementation post --- .../posts/09-paging-implementation/index.md | 88 ++++++++++++------ .../qemu-mapper-translate-addr.png | Bin 11058 -> 13427 bytes .../qemu-translate-addr.png | Bin 10946 -> 13353 bytes .../required-page-frames-example.svg | 3 + 4 files changed, 63 insertions(+), 28 deletions(-) create mode 100644 blog/content/second-edition/posts/09-paging-implementation/required-page-frames-example.svg diff --git a/blog/content/second-edition/posts/09-paging-implementation/index.md b/blog/content/second-edition/posts/09-paging-implementation/index.md index b3234e05..2afae5c3 100644 --- a/blog/content/second-edition/posts/09-paging-implementation/index.md +++ b/blog/content/second-edition/posts/09-paging-implementation/index.md @@ -459,9 +459,9 @@ We see that there are various non-empty entries, which all map to different leve 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 +// in the `for` loop in src/main.rs -use x86_64::{structures::paging::PageTable, VirtAddr}; +use x86_64::structures::paging::PageTable; if !entry.is_unused() { println!("L4 Entry {}: {:?}", i, entry); @@ -492,7 +492,7 @@ For translating a virtual to a physical address, we have to traverse the four-le ```rust // in src/memory.rs -use x86_64::{PhysAddr, VirtAddr}; +use x86_64::PhysAddr; /// Translates the given virtual address to the mapped physical address, or /// `None` if the address is not mapped. @@ -568,6 +568,7 @@ Let's test our translation function by translating some addresses: // in src/main.rs fn kernel_main(boot_info: &'static BootInfo) -> ! { + // new imports use blog_os::memory::translate_addr; use x86_64::VirtAddr; @@ -579,9 +580,9 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { // the identity-mapped vga buffer page 0xb8000, // some code page - 0x20010a, + 0x201008, // some stack page - 0x57ac_001f_fe48, + 0x0100_0020_1a10, // virtual address mapped to physical address 0 boot_info.physical_memory_offset, ]; @@ -598,9 +599,13 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { When we run it, we see the following output: -![0xb8000 -> 0xb8000, 0x20010a -> 0x40010a, 0x57ac001ffe48 -> 0x27be48, "panicked at 'huge pages not supported'](qemu-translate-addr.png) +![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. The translation of the `physical_memory_offset` should point to physical address `0`, but the translation fails because the mapping uses huge pages for efficiency. Future bootloader version might use the same optimization for kernel and stack pages. +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_]: ./second-edition/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` @@ -618,7 +623,7 @@ The base of the abstraction are two traits that define various page table mappin [`translate_addr`]: https://docs.rs/x86_64/0.7.5/x86_64/structures/paging/mapper/trait.MapperAllSizes.html#method.translate_addr [`translate`]: https://docs.rs/x86_64/0.7.5/x86_64/structures/paging/mapper/trait.MapperAllSizes.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 calculatable address. Finally, the [`RecursivePageTable`] type can be used to access page table frames through [recursive page tables](#recursive-page-tables). +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.7.5/x86_64/structures/paging/mapper/struct.OffsetPageTable.html [`MappedPageTable`]: https://docs.rs/x86_64/0.7.5/x86_64/structures/paging/mapper/struct.MappedPageTable.html @@ -627,8 +632,7 @@ The traits only define the interface, they don't provide any implementation. The In our case, the bootloader maps the complete physical memory at an 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::{PhysFrame, OffsetPageTable}; -use x86_64::{PhysAddr, VirtAddr}; +use x86_64::structures::paging::OffsetPageTable; /// Initialize a new OffsetPageTable. /// @@ -647,8 +651,6 @@ unsafe fn active_level_4_table(physical_memory_offset: VirtAddr) {…} ``` -[`impl Trait`]: https://doc.rust-lang.org/book/ch10-02-traits.html#returning-traits - 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.7.5/x86_64/structures/paging/mapper/struct.OffsetPageTable.html#method.new @@ -669,7 +671,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset); // new: initialize a mapper - let mut mapper = unsafe { memory::init(phys_mem_offset) }; + let mapper = unsafe { memory::init(phys_mem_offset) }; let addresses = […]; // same as before @@ -684,11 +686,17 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { } ``` +We need to import the `MapperAllSizes` 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, 0x20010a -> 0x40010a, 0x57ac001ffe48 -> 0x27be48, 0xfffffc0000000000 -> 0x0](qemu-mapper-translate-addr.png) +![0xb8000 -> 0xb8000, 0x201008 -> 0x401008, 0x10000201a10 -> 0x279a10, 0x18000000000 -> 0x0](qemu-mapper-translate-addr.png) -As expected the virtual address `physical_memory_offset` translates 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` function, so you can delete it if you want. +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` function, so we can delete it. ### Creating a new Mapping @@ -701,19 +709,22 @@ We will use the [`map_to`] function of the [`Mapper`] trait for our implementati #### A `create_example_mapping` Function -The first step of our implementation is to create a new `create_example_mapping` function that maps a given 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 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::structures::paging::{Page, Size4KiB, Mapper, FrameAllocator}; +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 impl Mapper, + mapper: &mut OffsetPageTable, frame_allocator: &mut impl FrameAllocator, ) { use x86_64::structures::paging::PageTableFlags as Flags; @@ -728,16 +739,18 @@ pub fn create_example_mapping( } ``` -In addition to the `page` that should be mapped, the function expects a `mapper` instance and a `frame_allocator`. The `mapper` is a type that implements the `Mapper` trait, which provides the `map_to` method. The generic `Size4KiB` parameter is needed because the [`Mapper`] trait is [generic] over the [`PageSize`] trait to work with both standard 4KiB pages and huge 2MiB/1GiB pages. We only want to create 4KiB pages, so we can use `Mapper` instead of requiring `MapperAllSizes`. +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.7.5/x86_64/structures/paging/trait.FrameAllocator.html [`PageSize`]: https://docs.rs/x86_64/0.7.5/x86_64/structures/paging/page/trait.PageSize.html -For the mapping, we set the `PRESENT` flag because it is required for all valid entries and the `WRITABLE` flag to make the mapped page writable. Calling `map_to` is unsafe because it's possible to break memory safety with invalid arguments, so we need to use an `unsafe` block. For a list of all possible flags, see the [_Page Table Format_] section of the previous post. +For the mapping, we set the `PRESENT` flag because it is required for all valid entries and the `WRITABLE` flag to make the mapped page writable. Calling [`map_to`] is unsafe because it's possible to break memory safety with invalid arguments, so we need to use an `unsafe` block. For a list of all possible flags, see the [_Page Table Format_] section of the previous post. [_Page Table Format_]: ./second-edition/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. +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 @@ -747,7 +760,7 @@ The `map_to` function can fail, so it returns a [`Result`]. Since this is just s #### A dummy `FrameAllocator` -To be able to call `create_example_mapping` we need to create a `FrameAllocator` first. As noted above, 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. +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: @@ -766,20 +779,39 @@ 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. -We now need to find a page that we can map without creating new page tables. The bootloader loads itself in the first megabyte of the virtual address space, so we know that a valid level 1 table exists for this region. We can choose any unused page in this memory region for our example mapping, for example, the page at address `0x1000`. +#### Choosing a Virtual Page -To test our mapping function, we first map page `0x1000` and then try to write to the screen through that mapping: +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]: ./second-edition/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}; + use x86_64::{structures::paging::Page, VirtAddr}; // new import […] // hello world and blog_os::init - let mut mapper = unsafe { memory::init(boot_info.physical_memory_offset) }; + 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 @@ -805,9 +837,9 @@ 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 `0x1000`, which means that we successfully created a new mapping in the page tables. +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 there was already a level 1 table for mapping page `0x1000`. 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 `0x1000`: +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 diff --git a/blog/content/second-edition/posts/09-paging-implementation/qemu-mapper-translate-addr.png b/blog/content/second-edition/posts/09-paging-implementation/qemu-mapper-translate-addr.png index 87062d5444976b95270843ba0c8aab77d8b2c76c..b5c8e2a7bdcfbc05661600faa0b69f9a8b5d2d0f 100644 GIT binary patch literal 13427 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 diff --git a/blog/content/second-edition/posts/09-paging-implementation/qemu-translate-addr.png b/blog/content/second-edition/posts/09-paging-implementation/qemu-translate-addr.png index 9e8dde74f284db9e72c3e2ec4a27cca73e86d00f..9dc562eadb2708d0302c4cc9145f203da3bad0cb 100644 GIT binary patch literal 13353 zcmeAS@N?(olHy`uVBq!ia0y~yV7kP>z<7d#je&t7`8@9_1_lO}VkgfK4h{~E8jh3> z1_lO+64!{5;QX|b^2DN4hTO!GRNdm_qSVy9;*9)~6VpC;F)%1Fc)B=-RLpsMw{nV1 zc;fqy@u6RhcDr@wMt)L?HoDjQJv74XNY8|~Hx3H0H$QyB5+~&0Bs9(DgtCLjiN^<$ zD`nV|4(P98Jda8nNKx$|FLUM)%Cv%M7KwNW`4D*FyrdFrKbu-cZpy1SKT^&{VtCa;U_*Rlxf+E zu3C3&n*Qb4Z1Mh{lV<*rm;Dj{^;+Pc`K8y2E_@Q5#}nxO_EME9zF*7#dR#g( zExSM?>;I=R(W!6vO0S33{rvFt>ixf5ztAcv&jaGeI zCahon_tVm&r*s4s^?h=6nlItBChe=x)@k)$ugXs1oe_ipNm+v?j7#J?}&6z4bH~rb!*R$W% zffV#gCO@(0Yf=bEU}D`jG0?!!^rlDA6N}dSzb%ZG{dr%<)i0f__WEx8jw;)obL3a8 zU-$aNRPF1h3z8)a9c5Q!rK3ZQ5t&)5j#97FjO6EU6p0$wfO%C;b1PpReA& zym;frjJEdgFMmFte|=l-ZN63Rs*X3l*QOdt#_mn(JQusm;qj@XYh8-o)8 zy?#9&&zI*)Bu_b;_Ox=H-mZ+LeAaIQSRH>>mA${W`1kvIhnb72niBqZY?*)hJi%37(%kr)I;q82``DziZ3&M_#wpJdtH`ajo$Eiq>^CcUM~F6|TQ?C2sGY zmw|UHPv=$@EH_yn?A2HD;!^#eE%!?Q9F$i0{$=~ud*}bSbv>VA@zeI#vES#zzHQ8Z z@qYi88FThI%`o%owXk}-cmAdO^Te+*&#&LV@0X8HT-L;O|F-wPJlmdkLHyol`KnF3 zy$g?P*iO2Z{r}hLs{b>0f0^808?&9KRCpO9!+|-IX3sb!*z5B3n0cI<{v(aqCr_O? zA;KDcy!6S5Koha4^Npi+fAf3#XN}Ut6*1Rma$L0B*|*qy-$$dPk1n39O8MsRs<%#k zI&aBw*=$jX_=z4Rn{@4`U%s?sxqfWXBrD%AN43z6|MS*3d#bPc{`Z&W+cT0!7a8u% zd)xh|zqi-iY^(BAugrpi?NwE~uHL-4GDAmx*5#L5F1_4R_V(UlS8nkYiNWaMjX` zlw0@rId|<9MDPYnfS4H)6AZ**gZkVo=ow1qUOGeyT0$S&%dWdk*vJ;-o9);`5gef9by zKROo4#{N1Y>HT#c`}Px`ZFc7E=*an-d^pE!b?tAr&x*SiJ716eZZ`Mpt;;H&(skck z_I=*_{v?ar;lsbT6g*^lohi4|C8~S<597UWm*l;@{UP@6=jrdSt=^}7e0o)U^<2Ae z<{(Y%!Wh=i(T*zJ7d4F0K|6~39L~8K?Tc7+N zhl@*JPnVl2->EUX8 zpp`vL$yY93Tv@*NbJg6ELxocE@{?8OR(ra-aeZlx+25whPbs^4 z@w%d`}2s&1yPw_h=D_xpYRH*?A!8C5p+MeK699e-C({hh}1 z-%+I=%ZnZ>a~1tm*S)tL%REG3vT6E^R*SSzC5^^{>^&{g)o~)y%x}qeIVf zN$~dfK3ZZ%=Y4ykuh0MY=RmlQRG^8}#h1(Hu9;Y?T(tL3o9FT%tH)P@zr;^mk#uoI zjeYvnwwm~Ze->}enYZ}C(%!19c$bg&{(e33$kO)nmCvVQik3~2t!|kU|NMR9x)++i zPD|%siWlQzt1h{{+-}kPy+YwfN>;4b*E-(wsxw+H;Qr0`SLD}NhHkGbo$MD;+c_Ht&du z&sAl$Ki^fwAK?^P;lKB8pHEdxax?$yYwiC6{_pr?w075O|K;%p{=47D zufG50#g$CUlP})|ZlCDZ{e1RpCwZTlxo58MF)$dEOL#UKPFj3YQ=;$ji-qmiLSvpC z;yyoHW^G@21(({USOdW+n{U2JvAxu2x%J2X&x^19tUvx(_^ZXw*Z$=*-=u7qz9gYy zdf)rAuXLZ!TlK%@LE+xVhc1^C87#ST;=;c^%RZ~7H%~IEB(4QpFS@v*=6<-|^Vglr z&0qcyJ+3v^&wq_iyIlPz&D7$3G1r4tgf{Zb=sR;`gmpU z{6|Jovfd{|=6%@y`k;JG{P$&C#Y<#e9~-*H#(S2o+I@PWr;5qCIrH{Ej@!HCl~(NM z?cP^~D+B*;{TBIj&UKB6Q|7$OE46l0R$HEP&f`@;czRt`N8!=~C976no;W2`ZFOh- zlv``m85kUX7plE8n&Gn~#iuT+{qc@nPbPJ%KX(-udFHJ?*^^bxo@=hpl255>rDGw{E)Db@Tk@Z2$kNsPA=_&df=VcP#vT=ZNYQ-@Em(v2(lJlt0g@uQ2m#Z&Yyzl4Q{F9$!jwT6~mK|GrYr^YO(l-~Svor7Xj$2*K$3Nwi*u3vk zy~!1?@CgPBvWO=C(3?*xlR4@tGDk1 zKYiR?@_m8&`IM>WBrId^zA|#_+w2}4?|Is#?`rFF{h%_Pl^ZuMDQcg)oIAY2s5AV_ zrM#2Hy4NP!|NHT{A4IJ0{U3Av>b<>(KmB#s8RNHaez4NS0Hc{9Ml(aSrq25F-X$q! z-~7q*PoMnG%*+3N^6Sb|?CIgZzxDcDo4o&S`Nw{-@BcdjjZQuN)A^0*?QL_T!qxfi z^Pa!_zF1R|mFv$MCi~Ut?UR4~S(f=V@yuNqfO5eG2eqXtXr3YvTWWnm%cw(8-phjWe1Kyx4G9Ona_h zW=hJEcV;T?8&8DYEj?}=^>?}Yi&fwMb#ANsm}YAT6uH`E&^N>2Hk*%U{x6ZxpTk+gUc24?t{>=y~ z4EIx8T;f(#WqtLfN1V>;`*;6k?=AWE)avQn|4a1e{O^gAdVlSry6*MFk3IAL|D0Q; z)UhJi=Pd&RLvj0KkBJ^GyUX7Pm6tECxj+3eOVM42dC&d+9VqzU8{O17@rlDk50~cV z=B_Hiokjes)a!FIUp{QVK0ViZ`e`kWGby$cJwo~lMZ1rc{GS&%x27XSZQ1OS(z2KN z{~oZ+ogo=gc3n>Q{oCv8?B~L3KCsS=QHozEe);b1;x5-}K8cg-j#XtH-&d>r>dl## zTQ2*B8_f(kcV1KMEPsFcCdtZm%QH+?<=)~^CcJ=Z_vafn9 zjBfTA9h>;r?MdEV@A$n3Pjnv@`QCF$ZL<8tzS0$!O^y6wCa$%=zQ3l*CBOQ$s#W$+ zO{?3dGgF?c{rx_7`-}bW?yaj>{`QL~14F|%5f-Lc zFZD^DJNp)YbaARKdmoq{KK+Tu$G#o!B>ggc3K(8X*RThMfmWZGT$E*9m0&{FFLb`NC0if6E8UwAQUYU|#j_ z=kq77N?opxi|+n;yLa=fpR!Lz6{)}FJF|{-zLGEdqILVO`bmxHy7g~gCC&6PlV7qp z@VCNUFGs!QCAThq+FlH*gZ383gejiOpZ;!~rW3j5+_`g|R$cqQ zm8k_k0^Mala$eW9*R#HCv2L|T$gRIuCf~ZZ*C%~W z{lc)=s+D2$XI*42&%0L9GBJ^Xp&`uZn8t_NqsfLRCw}958)`LoqKxwO;?ybo-HMea zUYKX=d~0)hf6~PrNgsctbd=5cvvsoU@tHq9F1&c*!o5GLUu8~~#j}boST&8_h5`4P6!J^A8`P5FqyXLPlv!lAK-R|}U-kIvg94@`t@NdGF zXnVhN!E2WLZ;bHiOwsx>=eYvMC*@1qw!fce=XSHiPqKVopUpQ7S+PBf)Z^s>k0`q_ zGcat4N_=7|)O%v$@*F*F``M?@cg~yf?BULNdoo-$dXzjeD*c)2tv_-4|N4^>@iTM$ zcIMFZCI-u<&>Qbf$h ziuR(LJw`9L^c?zoB4ARHrM>);y%W9*&#&xZy01|n;~L{+!oYB##PC+VYSQ`cC+^eL zKi~YfA$rHYlBKVm#pTY&D@O&Lj9vD5JIBd>tLN+AY}`NZkj%?jwY*HMY5{t$wdZ>J z-(%b;x9|P!_jVc9J?B`m^wUh?k0xZm#~M|MpHA3=9kb{I6eo zFoO!%$lLy)f|g-f^X==m?eErtMsRL<#ploXQi=bF84mIU)%lf#~f#^5}nl-@9y53ZDM`+ z{m~nGe_0q98rIHoytTw_OYw2J-jq}Bhwl8?Q1<4|>W^tWO4fg^N*{Q|Zdw%XxAXbl z$0dJx?_aw9|BK7f*%xAJnN-`$vyZPcoO)YC&3aj^b$PZ$?y{Zp85kHcT4y<06`i~P zVp@Ei>-#vpr(W}Uie_#9HNW(={=d+0xgfJ&X46k*q#Q5Hy+1wdw0gZo?XEA%_bRyB$z}b0EBWW%x7-VIq=UE1D*Lx9mhX=@d>_CYQ@`?B-KXof#C22h z7sq@t+51;lUE|%mfck!A-lxoIdWMVkCQJToocP#H zGSB7i=VvRICqK%xUwF59_Y||fJ03oFYxlnDvkLmKsqUY?{5AfhzgA1kwKM~=Qe2WV zC4;t_QYJDQ#60yHy;K6NlfwG_e*-udB4BV zw=V8$sra;lttDUEzwFHRySUIc@Tc=mq$(de{{8Vf{@QZ;zm>IL&)v29c5DCT-REXV%;a678eZ@6zvwO(@7>R` zwI4s5zsR=V89uvARIN{9>GrkP`}hA#t$la;{&nSplD|Ip@AFl!PTlpqlX@BFs&M)8BSIl+Ux~JsK&Rq!y^=$uqC_XhMdR>C) z#asjZRmuIqqg=ii)px2EXtuUrwY{{ONUNTw?9wdSs@vx>jo?yvVT|5N4ScFB3RlGVFq zueW?MwZBw6n{U?FSm&_wHa|AR?Jb!aSN`bx*Eh=?{2pW+WqqFYZ(H@(3)4P*wUk}I z_Evws-EPnGFV9-Nj0oR<^Tq1lJA_LrvSJQ$9?xERb4~8Kg;pP*#O20*ujVb56kuRz zkX%?bq0H*)U0v0-pik{`7jyaddA{HOO6KmLo3T-!m#N;Wd42s$jhmI0;@2-FPp6+u z6}A7T_4nxfJ$~x)hVimD4VPNm{5=2EeaT+c<5`u*<<{P}ka*Qz@o(MSTasV0;_`PY zzBGEuUhXrkoIie9vX#}=AMf)n>HjY)TKdGb$4u^)Zu;eYyY&5^@89FczsF#~>ae-1 z^6mdxrz)wxn#8^9>+g7*MY)bYQ?tH0&o+Nu9{nh)_S3|od3CPqEmLRC+y9qOHEjM$ zVez|*rf*h%vE^uURncR<&nitLFOMTi-ghzkDlycd_!E z@~*_Y6MCwqczNEvD_f*u*}ndoyIs}NJHPX;U9bPp)OJ>BZO!%hukSd`ou?k|R;Tym zs}57VrKjJGpJ$Ffwe?>odCAti#xc9xf;}cke{cSkcT(pM`q`GecZ)6kd(>+6>p*}l7|cI&UiCClgCSd|?75=C0feLnm2w*-~IVRYVZ5r_N>$W_Dh!sPnr^F^?1c% zZF_gCZ8@#eEN7P--v0hlvZa5Y@tV}dX+|FGySKfb`X<$?(sla2zi%ca1^RQ<%=Czn z-S})>%!cgtxRYOB&v5m$t^U6t$7%craLue36MF8OuBtv0b>{Ura~tGCbX_E^u~clko{{wreZ zma;Q27$k?BpX3)aS2oDXxUk*Mc$s_t|IT;2-iQ7Daqq40WuBT;^%h%P{CmxHBS}nc*?)umI|K)#uxjMI~ zIJ38xC+l=T)uI}&+4VnMYZKq-?t1pg{<``-!O8Z!f?x07AA0`HCy{=OPf4zKiG*#QTe7!h7>vP-msnc}h_3u^poAK_6 zJ)XNK`g@LU?~bK^xi0o6OqZ*BAQ`*4W}jSjPPCoL`&$dXM&DZ_`mwa?g=!M0_2u(u zO{8stn_K(x-SP|!3=X$nynefVjv5bWN~@41lYxQZ0F$E>0|UbbhY6rrOC5nFpav2* zij=^_CG2uB=6C;s+fm16U1jb8H=N8+8cvP4+f<`c$Sus#&=?I3T)huO+Ss(UE1ZEr zcmrrH00RSq*l1qE*=0in+Gs#AB#ef}Xz@b0c%ey7QJR!;X6q!C<3A5R5q>Jiy?R5= z)~AQ3WQHs)%}BX>Xj|m!e^uKqhU9`;A~$AF5`1ZJFn?Ry;SH}tSH~1y(EFDUYL)PS z$H*CUTwZC$jalwcQkTVmdX0&UgQ5R6**6ypNWCtj9jVj+X)0*xC=^&NHvLk9{)vc_M8QWe-UR;;HciAWRDWFl!sB^QfGC$j9ea)}j9yFq~ZDZP3 z2J;k9gDMAGy9(Oma#?a}`?_`CKURsxGp)O5#5(m_pHTPC~wZJ7@9fs&cq1Ya6l_tTrQGSuwM z$$gRe9Etblbm#vIdT+Yu@R!Y7=6dC}zVzRGO5}U(s`cG>d!(d{Ib6$r*Rl&|+^&A(y#4fWO=w)yx;u8lWl?V0an}uwhp#=}RXC?;4im$-)zvP$Zq0UG zsu1|=SollrS5>CT>*8nF-TtEeMk8SBztC6SA0Hph4V_&cm0de4blFs?+O=NWlUG(P zub*-)IB&~_$jcsw_PyJdYr6To%<|&j7OV|7*Sr&axnY)}m2g?hs) zyIZulW~v*1u6ufVmqEPo^y)nqC%$yL-J7%j(Zoxa0xvhEwaqs8o0AgHVV$I3IA_|l z`EQSFG9>KR&11wZx+}5mG#@aY|$3wzF-Ci-O0sEPM;Oe z4eiLA9uTY>(DK(H$m;u+pxWSz*Ng1=vfXATt-V!#>u+`n>4yoAjr*w65pvJs!UGgLE2~+gc-;<;9OJ zR9%=IaIqmC#FL!SW96009!Nzdl+?4pO%m>Z{y*CkNUggw|A)Ng=xDV$um>US=W>c6giCicmpX__3xH}|E*nw|ajDLC=<`cVHH z+oX0bNxWh7_1n(aW#VU^{5*1Y$C_B}>#2Hjr_biCzT5Y-%=#YVg1F0OO0v(Mv9%g) zJ+T7P{-9=iX9}hu2nL)q2~0 z^#8gm&tGzw7JrP;3y)u0cV=61rJAfUgMsLprjn1GWvg0t{&Za3TKiac!^`R!xzgL# zR^6-6zIu7hSFLMZ*GtsinxDOvx45SGYlPlf{T%zW+Z$~r$CWc=Y}>W|R$y+*>K`t# zD`U0_PV(v(eWm^VYJsit?W^-vUwfXmai-Q~kBnKb^AoOqlZL1NI#E#iKU6d$dBe5j zqZZRn??2Zo(_Z{Hf~{fZs&|4fv+}*BIyt?Z9kq1*{MT1|EUOZKCBA->g2YSC=N zR>d6K#A~Z}obiz`%zf4oy>MC^;lh=-Tj?3U_= z5N_^7`<^N1wAY5jZ}f_nH~)1|-N!cgqvGn&-{HIKHCCqAy({6^9Dgq4a;eVkZC87$ zmc5S1`~FyfVO1e=9`UmR<&m4$tO~Rz>y2%ubBp)S zzUnvQ>#ERYcV0`U#p_%T+gbM7mTh(GeS=_wtf>zp^8Q53)je*cD0LubTiVwH2OXst zPAQ5oGHkd%>nii*@^oj0x6J~)3Y1`b+pexM`Wk1nI%?*lqTruVt#AEz z|Gki>c0NDvSn9W^oqEL|{|JAZ)b{jBai+`dI^VAw@8lh~Zg^>$t9&UjFD5`Ecy-PU z;keCyU5WRONbPiV&Wug`6}WP3*i_BheG|87*`_U)yuIN=jq&f$wf4Q+1ix*a!8f&U z?xXtfSD#B-X6>x_w=(^|rfzbyzwKYH+wZe#*M;8qu}Wh&QxoR6>(a^1GY{Qav*_xf zeVw8vztY0|?Y(YirOq_??R?{{v8>{*sQN=T*L93D>1Y4FaoVP3I^qD80{cjWpuN8cl zb^Lmc{WQiib-`t_FVlJwT4YaVF7eqI*0V&kKX2=%yI~nuuYZ60%}w%|_LHK1b1S3R zjN9A#9@S0xSH3ZApIqXvnmK}+kb^G~zH>Z-NRm-dHGd8?5cxs-K`Nenrf~o3v z-0ojEbjC0z>_tx4hm0*gwy!Urure=xvQF~v%vHZ;@2oeGT6TELML(~@DQhn#W#-MT zpC!2HaK`auNd~W-m#+9&I;1|`R&1RdpSjL$n|ge1`{gq)S>7(Y^|L)$lHrxHrTeZs zdrpPT^|}4@?EYKQ`8W8Lmlm67Uk%TP#AA_GZLLkP-5TGkH5c8sR!>0AZT~Wl{jAjb z{(7awwA+6zST0z>8%1^k&)V(SLjs<@KEENJH*A&qo8;Exxu>q&e(qJPc|C4MsmAw; zt@6)Wa#v4HeKnIgX7yTw*KzM(-}9*NI=#iaW1ZNRL(??P^{vi)3|_ak=fZI>L(>Ted>;UmCZQAVb2cHIcRkwdH0k4J%zb z*cg1aYVOZsXV~Hd&VU&rj#3BKIApLfY>|RhS1--3=}qTlNz?9gWSDV#S!tI0V)J<# z8P~#h1qY^Y-L`B~Z`eBSsQgvm=a*ey^Y(CI%gdniOF6nvn-}k2|9#WU12I>&DPIb% zO#Hv{T9=@XU*2YMl$B<>Q;nTVE|;9Y>h<32c;);fU-g8a<>e;sJGc7zyX4+48z=tVFtc{vxv#6P-cR%GU3D#N z#%_+V==Evqt7mM}TI+mc+p4Lnx1I^fJob$<*nh@0>7A!jw(hnwi}Jtmcf+mZtv*l7 zwq0E_@!^K@9V`V4PFhR1@rJS{=9x#Yp0}a2rSeSL%ne^}Y>0fHwpvu}HLrK#>5!^5 z^X$ww$(yY{zcyxl)vc_O{~IH}yY+ofTU$MY-~H;Ztjl4>=Q+2{+FG0Q?fHg-+ahj! zF5LV|bM5NL*KwZOw?S=>_b1It+b!F;mc8D=kk(|nn*G)6TZVJz2d$P}ljv_?cKTZK zvbwJPtDWmYU*A7dw(4qV#blGT|JQGAe(1aS?)B_d{a0V|om={@7v94LemzCafzrNmR=`>Ui(m?d6fT z3azidD*iY-X~w6wNoH%pm2301f8AQScUjRF<25gDox3c%Vs>TC)<+V#-?qmch`F>a z{H=!B^uyZA<~=@hE`G)NYhPz|b~#U78@4yDWyLd&-&Ll`_c>Ni&1Echz0LA6O1)u2 zzJc*u7o*F+F6+GA5x2Bf@9%dXp1EeXcgkK{9eF5c{>**r{hq!K&6}^Ew|HjSuQI)B z9`Wg~KVJ1)FMq*{{qKzr4eHu8cY`a|&6A%JvReDh=c%_=UJcuPO}nS+mFD&TX`61^ zZH>E}^mSjH*nuJO z^f6q}0hb5Uw||%ap`b1n7jtFIQ&2^4`FB_D~&1!m2H2LqQG7hM6st3^-e8ct{to?b*5QmD7}kJgFMalBWXN zjHWC+C)!HrJ|1&;w VUL<>W+Wv45-_zC4Wt~$(696R81Tg>r literal 10946 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 + +
Physical Memory
Physical Memory
0KiB
[Not supported by viewer]
IndexFrameFlags
0-
-
116KiBr/w


[Not supported by viewer]
Level 4 Page Table
Level 4 Page Table
4KiB
[Not supported by viewer]
IndexFrameFlags
024KiB
r/w



[Not supported by viewer]
Level 3 Page Table
Level 3 Page Table
16KiB
[Not supported by viewer]
24KiB
[Not supported by viewer]
8KiB
[Not supported by viewer]
IndexFrameFlags



511
32KiB
r/w
[Not supported by viewer]
Level 2 Page Table
Level 2 Page Table
Level 1 Page Table
Level 1 Page Table
32KiB
[Not supported by viewer]
IndexFrameFlags
036KiB
r/w



[Not supported by viewer]
4KiB
4KiB
CR3 Register
CR3 Register
Virtual Memory
Virtual Memory
0KiB
[Not supported by viewer]
4KiB
[Not supported by viewer]
8KiB
[Not supported by viewer]
0xb8000
0xb8000
0x803fe00000
0x803fe00000
0x803fe02000
<div>0x803fe02000</div>
0x803fdfd000
0x803fdfd000
\ No newline at end of file