make bluescreen demo more general for paging
This commit is contained in:
@ -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();
|
|
||||||
}
|
|
@ -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
|
|
51
c_os/user/demo/PagingDemo.cc
Normal file
51
c_os/user/demo/PagingDemo.cc
Normal file
@ -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();
|
||||||
|
}
|
30
c_os/user/demo/PagingDemo.h
Normal file
30
c_os/user/demo/PagingDemo.h
Normal file
@ -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
|
Reference in New Issue
Block a user