From 8b2e58b6b12afdd36b05ed2a58a1038f8a954471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Mon, 19 Dec 2016 09:40:08 +0100 Subject: [PATCH] [MEMORY] Copy and write between memory spaces --- kernel/boot/kmain.c | 8 +++----- kernel/include/mem.h | 2 ++ kernel/mem/vmm.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/kernel/boot/kmain.c b/kernel/boot/kmain.c index de9ef35..640b996 100644 --- a/kernel/boot/kmain.c +++ b/kernel/boot/kmain.c @@ -9,11 +9,6 @@ void thread_function() { - char *str = (char *)0x10000; - str[0] = (char)((unsigned int)'0' + get_current_process()->pid); - str[1] = (char)((unsigned int)'0' + get_current_thread()->tid); - str[3] = '-'; - str[2] = '\0'; while(1) { debug((char *)0x10000); @@ -49,6 +44,9 @@ int kmain(uint64_t multiboot_magic, void *multiboot_data) vmm_set_page(p1->P4, 0x10000, pmm_alloc(), PAGE_PRESENT | PAGE_WRITE); vmm_set_page(p2->P4, 0x10000, pmm_alloc(), PAGE_PRESENT | PAGE_WRITE); + vmm_p4_memcpy(p1->P4, (void *)0x10000, 0, "Hello, 1", 9); + vmm_p4_memcpy(p2->P4, (void *)0x10000, 0, "Hello, 2", 9); + scheduler_insert(t1); scheduler_insert(t2); scheduler_insert(t3); diff --git a/kernel/include/mem.h b/kernel/include/mem.h index d14f567..7ca2084 100644 --- a/kernel/include/mem.h +++ b/kernel/include/mem.h @@ -57,6 +57,8 @@ void vmm_set_P4(page_table *P4); void vmm_free_P4(page_table *P4); uintptr_t vmm_get_page(page_table *P4, uintptr_t addr); uintptr_t vmm_set_page(page_table *P4, uintptr_t addr, uintptr_t phys, uint32_t flags); +size_t vmm_p4_memcpy(page_table *dst_P4, void *dst, page_table *src_P4, void *src, size_t n); +size_t vmm_p4_memset(page_table *P4, void *s, int c, size_t n); void kfree(void *a); void *kmalloc(size_t size); diff --git a/kernel/mem/vmm.c b/kernel/mem/vmm.c index ff72a5a..fa4ff56 100644 --- a/kernel/mem/vmm.c +++ b/kernel/mem/vmm.c @@ -121,6 +121,52 @@ uintptr_t vmm_set_page(page_table *P4, uintptr_t addr, uintptr_t phys, uint32_t } +size_t vmm_p4_memcpy(page_table *dst_P4, void *dst, page_table *src_P4, void *src, size_t n) +{ + size_t copied = 0; + while(n) + { + size_t d_offset = (uintptr_t)dst % PAGE_SIZE; + size_t s_offset = (uintptr_t)src % PAGE_SIZE; + size_t d_bytes = PAGE_SIZE - d_offset; + size_t s_bytes = PAGE_SIZE - s_offset; + size_t bytes = (d_bytes < s_bytes)?d_bytes:s_bytes; + bytes = (bytes < n)?bytes:n; + void *d_page = STRIP_FLAGS(vmm_get_page(dst_P4, (uintptr_t)dst)); + void *s_page = STRIP_FLAGS(vmm_get_page(src_P4, (uintptr_t)src)); + if (!d_page || !s_page) + return 0; + memcpy(incptr(P2V(d_page), d_offset), incptr(P2V(s_page), s_offset), bytes); + + copied += bytes; + n -= bytes; + dst = incptr(dst, bytes); + src = incptr(src, bytes); + } + return copied; +} + +size_t vmm_p4_memset(page_table *P4, void *s, int c, size_t n) +{ + size_t set = 0; + while(n) + { + size_t offset = (uintptr_t)s % PAGE_SIZE; + size_t bytes = PAGE_SIZE - offset; + bytes = (bytes < n)?bytes:n; + void *page = STRIP_FLAGS(vmm_get_page(P4, (uintptr_t)s)); + if(!page) + return 0; + memset(incptr(P2V(page), offset), c, bytes); + + set += bytes; + n -= bytes; + s = incptr(s, bytes); + } + return set; +} + + registers_t *page_fault_handler(registers_t *r) { debug("\n ===== PAGE FAULT =====\n");