[MEMORY] Copy and write between memory spaces

This commit is contained in:
Thomas Lovén 2016-12-19 09:40:08 +01:00
parent 5ca2b6994a
commit 8b2e58b6b1
3 changed files with 51 additions and 5 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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");