[MEMORY] Copy and write between memory spaces
This commit is contained in:
parent
5ca2b6994a
commit
8b2e58b6b1
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user