[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 2/3] kernel2/i386: Nach 4 MB mappen, erste PT ist Userspace



* kernel2: Erste PT für Userspace freiräumen, damit sich VM86 dort
  breitmachen kann. Da wir am Anfang ein 1:1-Mapping haben, heißt das,
  dass tyndur jetzt mehr als 4 MB RAM braucht. Schade.
* kernel2: Der Videospeicher hat kein 1:1-Mapping mehr, sonst würde er
  im Userspace landen.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/include/arch/i386/page.h              |    2 +-
 src/kernel2/src/arch/i386/kernel.ld       |    4 ++--
 src/kernel2/src/arch/i386/mm/mm_context.c |   17 +++++++++++------
 src/kernel2/src/arch/i386/mm/virt.c       |   11 +++++++----
 src/kernel2/src/console.c                 |    2 +-
 5 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/src/include/arch/i386/page.h b/src/include/arch/i386/page.h
index 19d3dc3..c37f15e 100644
--- a/src/include/arch/i386/page.h
+++ b/src/include/arch/i386/page.h
@@ -41,7 +41,7 @@
 
 // TODO: Muss das Kernelzeug wirklich hier sein? :/
 // Die Adresse, an der der Kernel-Adressraum beginnt
-#define KERNEL_MEM_START    0x00000000
+#define KERNEL_MEM_START    0x00400000
 #define KERNEL_MEM_END      0x40000000
 
 #define PAGETABLES_MEM_START 0x3fc00000
diff --git a/src/kernel2/src/arch/i386/kernel.ld b/src/kernel2/src/arch/i386/kernel.ld
index d9dcd48..10f9d2d 100644
--- a/src/kernel2/src/arch/i386/kernel.ld
+++ b/src/kernel2/src/arch/i386/kernel.ld
@@ -1,5 +1,5 @@
-LOAD_ADDR = 0x100000;
-LINK_ADDR = 0x100000;
+LOAD_ADDR = 0x400000;
+LINK_ADDR = 0x400000;
 VIRT_TO_PHYS = LINK_ADDR - LOAD_ADDR;
 
 ENTRY(_start)
diff --git a/src/kernel2/src/arch/i386/mm/mm_context.c b/src/kernel2/src/arch/i386/mm/mm_context.c
index 7f40312..9192142 100644
--- a/src/kernel2/src/arch/i386/mm/mm_context.c
+++ b/src/kernel2/src/arch/i386/mm/mm_context.c
@@ -145,7 +145,8 @@ mmc_context_t mmc_create_kernel_context()
 static void mmc_sync(mmc_context_t* context)
 {
     if (context->version < page_directory_version) {
-        memcpy(context->page_directory_virt, page_directory_current, 0x3FC);
+        memcpy(&context->page_directory_virt[1],
+               &page_directory_current[1], 0x3FC - 4);
         context->version = page_directory_version;
     }
 
@@ -305,17 +306,21 @@ static bool map_page
     // Kernelpages duerfen immer nur im gerade aktiven Kontext gemappt werden.
     // Ales andere ergibt keinen Sinn, weil diese Bereiche ohnehin zwischen
     // allen Kontexten synchron gehalten werden muessen.
-    //
-    // TODO: Ergibt sehr wohl Sinn, wenn man nämlich IDT und GDT von einem
-    // vm86-Task erstellen will.
-#if 0
+    if ((flags & PTE_P) && !(flags & PTE_U) &&
+        !(((uintptr_t) vaddr >= KERNEL_MEM_START) &&
+          ((uintptr_t) vaddr <  KERNEL_MEM_END)))
+    {
+        panic("Versuch, Kernelpages in Userspace-Bereich zu mappen: %x",
+              vaddr);
+    }
+
+    // Außerdem müssen sie im richtigen Speicherbereic gemappt werden
     if ((context != &mmc_current_context()) &&
         ((uintptr_t) vaddr >= KERNEL_MEM_START) &&
         ((uintptr_t) vaddr <  KERNEL_MEM_END))
     {
         panic("Versuch, Kernelpages in inaktivem Kontext zu mappen");
     }
-#endif
 
     // Falls es sich im den aktuellen Kontext handelt, muss das Page directory
     // nicht gemappt werden, sonst schon.
diff --git a/src/kernel2/src/arch/i386/mm/virt.c b/src/kernel2/src/arch/i386/mm/virt.c
index e4c08f2..18e8098 100644
--- a/src/kernel2/src/arch/i386/mm/virt.c
+++ b/src/kernel2/src/arch/i386/mm/virt.c
@@ -45,6 +45,9 @@ extern void pmm_set_bitmap_start(void* bitmap_start);
 extern bool use_phys_addr;
 extern page_directory_t page_directory_current;
 
+extern unsigned short* vidmem;
+unsigned short* paging_vidmem;
+
 /**
  * Initialisiert die virtuelle Speicherverwaltung. Insbesondere wird ein
  * Page Directory fuer den Kernel angelegt und geladen.
@@ -64,10 +67,8 @@ void vmm_init(mmc_context_t* kernel_context)
         (paddr_t) kernel_phys_start + rosize, PTE_P | PTE_W, NUM_PAGES(rwsize));
 
     // Videospeicher mappen
-    // TODO Usermodus muss die momentan wegen VM86 sehen. Waere wohl besser,
-    // wenn VM86 einen eigenen Adressraum haette.
-    mmc_map(kernel_context, (vaddr_t) 0xB8000, (paddr_t) 0xB8000,
-        PTE_U | PTE_W | PTE_P, 8);
+    paging_vidmem = mmc_automap(kernel_context, (paddr_t) 0xB8000, 8,
+        KERNEL_MEM_START, KERNEL_MEM_END, PTE_P | PTE_W);
 
     // BIOS mappen
     mmc_map(kernel_context, (vaddr_t) 0xC0000, (paddr_t) 0xC0000,
@@ -108,6 +109,8 @@ void vmm_init(mmc_context_t* kernel_context)
  */
 void vmm_init_local(mmc_context_t* kernel_context)
 {
+    vidmem = paging_vidmem;
+
     // Und ab ins Verderben
     asm volatile (
         // Adresse des Page directories setzen
diff --git a/src/kernel2/src/console.c b/src/kernel2/src/console.c
index cf20352..1a6aea2 100644
--- a/src/kernel2/src/console.c
+++ b/src/kernel2/src/console.c
@@ -89,7 +89,7 @@
 
 void con_set_hw_cursor(void);
 
-static unsigned short * vidmem = (unsigned short*)0xb8000;
+unsigned short * vidmem = (unsigned short*)0xb8000;
 
 // Aktuelle Cursor-Position
 static unsigned int cursor_x;
-- 
1.7.7