From f67e7bb128636e66e22545a32f45dab8c9b9793b Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Mon, 22 Jul 2019 10:47:33 +0200 Subject: [PATCH] Update paging introduction post to use page fault error code (#644) We previously did not use the error code because of https://github.com/phil-opp/blog_os/issues/513, which is now fixed. --- .../posts/08-paging-introduction/index.md | 33 ++++++++++++------ .../qemu-page-fault-protection.png | Bin 0 -> 12536 bytes .../qemu-page-fault.png | Bin 11599 -> 12035 bytes 3 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 blog/content/second-edition/posts/08-paging-introduction/qemu-page-fault-protection.png diff --git a/blog/content/second-edition/posts/08-paging-introduction/index.md b/blog/content/second-edition/posts/08-paging-introduction/index.md index 5ee100e1..d93f317a 100644 --- a/blog/content/second-edition/posts/08-paging-introduction/index.md +++ b/blog/content/second-edition/posts/08-paging-introduction/index.md @@ -278,18 +278,19 @@ use x86_64::structures::idt::PageFaultErrorCode; extern "x86-interrupt" fn page_fault_handler( stack_frame: &mut InterruptStackFrame, - _error_code: PageFaultErrorCode, + error_code: PageFaultErrorCode, ) { use x86_64::registers::control::Cr2; println!("EXCEPTION: PAGE FAULT"); println!("Accessed Address: {:?}", Cr2::read()); + println!("Error Code: {:?}", error_code); println!("{:#?}", stack_frame); hlt_loop(); } ``` -The [`CR2`] register is automatically set by the CPU on a page fault and contains the accessed virtual address that caused the page fault. We use the [`Cr2::read`] function of the `x86_64` crate to read and print it. Normally the [`PageFaultErrorCode`] type would provide more information about the type of memory access that caused the page fault, but there is currently an [LLVM bug] that passes an invalid error code, so we ignore it for now. We can't continue execution without resolving the page fault, so we enter a [`hlt_loop`] at the end. +The [`CR2`] register is automatically set by the CPU on a page fault and contains the accessed virtual address that caused the page fault. We use the [`Cr2::read`] function of the `x86_64` crate to read and print it. The [`PageFaultErrorCode`] type provides more information about the type of memory access that caused the page fault, for example whether it was caused by a read or write operation. For this reason we print it too. We can't continue execution without resolving the page fault, so we enter a [`hlt_loop`] at the end. [`CR2`]: https://en.wikipedia.org/wiki/Control_register#CR2 [`Cr2::read`]: https://docs.rs/x86_64/0.7.0/x86_64/registers/control/struct.Cr2.html#method.read @@ -323,27 +324,39 @@ pub extern "C" fn _start() -> ! { When we run it, we see that our page fault handler is called: -![EXCEPTION: Page Fault, Accessed Address: VirtAddr(0xdeadbeaf), InterruptStackFrame: {…}](qemu-page-fault.png) +![EXCEPTION: Page Fault, Accessed Address: VirtAddr(0xdeadbeaf), Error Code: CAUSED_BY_WRITE, InterruptStackFrame: {…}](qemu-page-fault.png) -The `CR2` register indeed contains `0xdeadbeaf`, the address that we tried to access. +The `CR2` register indeed contains `0xdeadbeaf`, the address that we tried to access. The error code tells us through the [`CAUSED_BY_WRITE`] that the fault occurred while trying to perform a write operation. It tells us even more through the [bits that are _not_ set][`PageFaultErrorCode`]. For example, the fact that the `PROTECTION_VIOLATION` flag is not set means that the page fault occurred because the target page wasn't present. -We see that the current instruction pointer is `0x20430a`, so we know that this address points to a code page. Code pages are mapped read-only by the bootloader, so reading from this address works but writing causes a page fault. You can try this by changing the `0xdeadbeaf` pointer to `0x20430a`: +[`CAUSED_BY_WRITE`]: https://docs.rs/x86_64/0.7.0/x86_64/structures/idt/struct.PageFaultErrorCode.html#associatedconstant.CAUSED_BY_WRITE + +We see that the current instruction pointer is `0x2031b2`, so we know that this address points to a code page. Code pages are mapped read-only by the bootloader, so reading from this address works but writing causes a page fault. You can try this by changing the `0xdeadbeaf` pointer to `0x2031b2`: ```rust // Note: The actual address might be different for you. Use the address that // your page fault handler reports. -let ptr = 0x20430a as *mut u32; -// read from a code page -> works +let ptr = 0x2031b2 as *mut u32; + +// read from a code page unsafe { let x = *ptr; } -// write to a code page -> page fault +println!("read worked"); + +// write to a code page unsafe { *ptr = 42; } +println!("write worked"); ``` -By commenting out the last line, we see that the read access works, but the write access causes a page fault. +By commenting out the last line, we see that the read access works, but the write access causes a page fault: + +![QEMU with output: "read worked, EXCEPTION: Page Fault, Accessed Address: VirtAddr(0x2031b2), Error Code: PROTECTION_VIOLATION | CAUSED_BY_WRITE, InterruptStackFrame: {…}"](qemu-page-fault-protection.png) + +We see that the _"read worked"_ message is printed, which indicates that the read operation did not cause any errors. However, instead of the _"write worked"_ message a page fault occurs. This time the [`PROTECTION_VIOLATION`] flag is set in addition to the [`CAUSED_BY_WRITE`] flag, which indicates that the page was present, but the operation was not allowed on it. In this case, writes to the page are not allowed since code pages are mapped as read-only. + +[`PROTECTION_VIOLATION`]: https://docs.rs/x86_64/0.7.0/x86_64/structures/idt/struct.PageFaultErrorCode.html#associatedconstant.PROTECTION_VIOLATION ### Accessing the Page Tables -Let's try to take a look at the page tables that our kernel runs on: +Let's try to take a look at the page tables that define how our kernel is mapped: ```rust // in src/main.rs diff --git a/blog/content/second-edition/posts/08-paging-introduction/qemu-page-fault-protection.png b/blog/content/second-edition/posts/08-paging-introduction/qemu-page-fault-protection.png new file mode 100644 index 0000000000000000000000000000000000000000..be6bdcff501e372653efe66859652c5ba501a42b GIT binary patch literal 12536 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 GLK6V0+~2VP literal 0 HcmV?d00001 diff --git a/blog/content/second-edition/posts/08-paging-introduction/qemu-page-fault.png b/blog/content/second-edition/posts/08-paging-introduction/qemu-page-fault.png index 5657759750e232705f15b81b77c75fe66f5eb983..815328f87c2cdae191bc1407ca06893efb30cd35 100644 GIT binary patch delta 10533 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 U^Lxq1z`(%Z>FVdQ&MBb@0J+-a+W-In delta 10038 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