fix paging bugs in writeprotection
This commit is contained in:
@ -92,7 +92,7 @@ unsigned int* pg_alloc_page() {
|
|||||||
// pruefe ob Page frei
|
// pruefe ob Page frei
|
||||||
if (((*p_page) & PAGE_RESERVED) == 0) {
|
if (((*p_page) & PAGE_RESERVED) == 0) {
|
||||||
*p_page = (*p_page | PAGE_RESERVED);
|
*p_page = (*p_page | PAGE_RESERVED);
|
||||||
return (unsigned int*)(i << 12);
|
return (unsigned int*)(i << 12); // Address without flags (Offset 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -108,8 +108,10 @@ void pg_write_protect_page(unsigned int* p_page) {
|
|||||||
|
|
||||||
/* hier muss Code eingefügt werden */
|
/* hier muss Code eingefügt werden */
|
||||||
|
|
||||||
|
unsigned int* page = (unsigned int*)PAGE_TABLE + ((unsigned int)p_page >> 12); // Pagetable entry
|
||||||
|
|
||||||
unsigned int mask = PAGE_WRITEABLE; // fill to 32bit
|
unsigned int mask = PAGE_WRITEABLE; // fill to 32bit
|
||||||
*p_page = *p_page & ~mask; // set writable to 0
|
*page = *page & ~mask; // set writable to 0
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@ -121,8 +123,10 @@ void pg_notpresent_page(unsigned int* p_page) {
|
|||||||
|
|
||||||
/* hier muss Code eingefügt werden */
|
/* hier muss Code eingefügt werden */
|
||||||
|
|
||||||
|
unsigned int* page = (unsigned int*)PAGE_TABLE + ((unsigned int)p_page >> 12); // Pagetable entry
|
||||||
|
|
||||||
unsigned int mask = PAGE_PRESENT;
|
unsigned int mask = PAGE_PRESENT;
|
||||||
*p_page = *p_page & ~mask; // set present to 0
|
*page = *page & ~mask; // set present to 0
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|||||||
@ -52,6 +52,28 @@
|
|||||||
#ifndef __Paging_include__
|
#ifndef __Paging_include__
|
||||||
#define __Paging_include__
|
#define __Paging_include__
|
||||||
|
|
||||||
|
// Bits fuer Eintraege in der Page-Table
|
||||||
|
#define PAGE_PRESENT 0x001
|
||||||
|
#define PAGE_WRITEABLE 0x002
|
||||||
|
#define PAGE_BIGSIZE 0x080
|
||||||
|
#define PAGE_RESERVED 0x800 // Bit 11 ist frei fuer das OS
|
||||||
|
|
||||||
|
// Adresse des Page-Directory (benoetigt 4 KB)
|
||||||
|
#define PAGE_DIRECTORY 0x200000
|
||||||
|
|
||||||
|
// Adresse der Page-Table (benoetigt 4 KB)
|
||||||
|
#define PAGE_TABLE 0x201000
|
||||||
|
|
||||||
|
// Start- und End-Adresse der 4 KB Seiten die durch die Page-Table adressiert werden
|
||||||
|
#define FST_ALLOCABLE_PAGE 0x202000
|
||||||
|
#define LST_ALLOCABLE_PAGE 0x2FF000
|
||||||
|
|
||||||
|
// Externe Funktionen in startup.asm
|
||||||
|
extern "C" {
|
||||||
|
void paging_on(unsigned int* p_pdir); // Paging einschalten
|
||||||
|
void invalidate_tlb_entry(unsigned int* ptr); // Page in TLB invalid.
|
||||||
|
}
|
||||||
|
|
||||||
// ativiert paging
|
// ativiert paging
|
||||||
extern void pg_init();
|
extern void pg_init();
|
||||||
|
|
||||||
|
|||||||
16
c_os/main.cc
16
c_os/main.cc
@ -56,27 +56,29 @@ int main() {
|
|||||||
pg_init();
|
pg_init();
|
||||||
|
|
||||||
// Trigger Bluescreen
|
// Trigger Bluescreen
|
||||||
// kout << "Trigger Bluescreen, if you can read this it didn't work" << endl;
|
kout << "Trigger Bluescreen, if you can read this it didn't work" << endl;
|
||||||
|
|
||||||
// BlueScreen 1
|
// BlueScreen 1
|
||||||
// asm("int $3");
|
// asm("int $3");
|
||||||
|
|
||||||
// BlueScreen 2
|
// BlueScreen 2
|
||||||
// unsigned int* page = pg_alloc_page();
|
unsigned int* page = pg_alloc_page();
|
||||||
// *page = 42; // Should work
|
*page = 42;
|
||||||
// pg_write_protect_page(page);
|
pg_write_protect_page(page);
|
||||||
// *page = 42; // should trigger BlueScreen
|
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
|
||||||
|
|
||||||
// Demo threads anlegen
|
// Demo threads anlegen
|
||||||
// scheduler.ready(new HelloWorldThread());
|
// scheduler.ready(new HelloWorldThread());
|
||||||
scheduler.ready(new CoopThreadDemo());
|
// scheduler.ready(new CoopThreadDemo());
|
||||||
// scheduler.ready(new VBEdemo()); // Switch to VESA graphics mode
|
// scheduler.ready(new VBEdemo()); // Switch to VESA graphics mode
|
||||||
|
|
||||||
// Scheduler starten (schedule() erzeugt den Idle-Thread)
|
// Scheduler starten (schedule() erzeugt den Idle-Thread)
|
||||||
scheduler.schedule();
|
scheduler.schedule();
|
||||||
|
|
||||||
// TODO: Use templates for queue so threads don't have to be casted down from chain
|
// TODO: Use templates for queue so threads don't have to be casted down from chain
|
||||||
// TODO: Move scrollback control to thread
|
|
||||||
|
|
||||||
// Scheduler doesn't return
|
// Scheduler doesn't return
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user