diff --git a/c_os/user/demo/BlueScreenDemo.cc b/c_os/user/demo/BlueScreenDemo.cc deleted file mode 100644 index 88860ed..0000000 --- a/c_os/user/demo/BlueScreenDemo.cc +++ /dev/null @@ -1,20 +0,0 @@ -#include "user/demo/BlueScreenDemo.h" -#include "kernel/Paging.h" - -void BlueScreenDemo::run() { - kout << "Trigger Bluescreen, if you can read this it didn't work" << endl; - - // BlueScreen 1 - // asm("int $3"); - - // BlueScreen 2 - unsigned int* page = pg_alloc_page(); - *page = 42; - pg_write_protect_page(page); - invalidate_tlb_entry(page); // If we don't invalidate after first access the write protection - // won't work as no lookup is performed (address in tlb) - *page = 42; // We map logical to physical 1:1 so no need to do any lookup - // If tlb is invalidated this access produces a pagefault - - scheduler.exit(); -} diff --git a/c_os/user/demo/BlueScreenDemo.h b/c_os/user/demo/BlueScreenDemo.h deleted file mode 100644 index ea5351d..0000000 --- a/c_os/user/demo/BlueScreenDemo.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef BlueScreenDemo_include__ -#define BlueScreenDemo_include__ - -#include "kernel/Globals.h" -#include "kernel/threads/Thread.h" - -class BlueScreenDemo : public Thread { -public: - BlueScreenDemo(const BlueScreenDemo& copy) = delete; - - BlueScreenDemo() : Thread("BlueScreenDemo") {} - - void run() override; -}; - -#endif diff --git a/c_os/user/demo/PagingDemo.cc b/c_os/user/demo/PagingDemo.cc new file mode 100644 index 0000000..d18dd81 --- /dev/null +++ b/c_os/user/demo/PagingDemo.cc @@ -0,0 +1,51 @@ +#include "user/demo/PagingDemo.h" +#include "kernel/Paging.h" + +void PagingDemo::writeprotect_page() { + kout << "Accessing a writeprotected page triggers bluescreen,\nif you can read this it didn't work" << endl; + + // BlueScreen 1 + // asm("int $3"); + + // BlueScreen 2 + log.info() << "Allocating page" << endl; + unsigned int* page = pg_alloc_page(); + *page = 42; + log.info() << "Writeprotecting page..." << endl; + pg_write_protect_page(page); + + log.info() << "Accessing writeprotected page" << endl; + *page = 42; // We map logical to physical 1:1 so no need to do any lookup + + // No free because bluescreen +} + +void PagingDemo::notpresent_page() { + kout << "Produces pagefault, if you can read this it didn't work" << endl; + + log.info() << "Allocating page" << endl; + unsigned int* page = pg_alloc_page(); + *page = 42; + + log.info() << "Marking page notpresent..." << endl; + pg_notpresent_page(page); + + log.info() << "Accessing page" << endl; + kout << "Page not accessible: " << *page << endl; + + // No free because bluescreen +} + +void PagingDemo::run() { + kout << "Press w for writeprotect demo, n for notpresent demo" << endl; + switch(listener.waitForKeyEvent()) { + case 'w': + writeprotect_page(); + break; + case 'n': + notpresent_page(); + break; + } + + scheduler.exit(); +} diff --git a/c_os/user/demo/PagingDemo.h b/c_os/user/demo/PagingDemo.h new file mode 100644 index 0000000..1e275b3 --- /dev/null +++ b/c_os/user/demo/PagingDemo.h @@ -0,0 +1,30 @@ +#ifndef BlueScreenDemo_include__ +#define BlueScreenDemo_include__ + +#include "kernel/Globals.h" +#include "kernel/threads/Thread.h" +#include "user/event/KeyEventListener.h" + +class PagingDemo: public Thread { +private: + void writeprotect_page(); + void free_page(); + void notpresent_page(); + + KeyEventListener listener; + +public: + PagingDemo(const PagingDemo& copy) = delete; + + PagingDemo(): Thread("PagingDemo"), listener(tid) { + kevman.subscribe(listener); + } + + ~PagingDemo() override { + kevman.unsubscribe(listener); + } + + void run() override; +}; + +#endif