Compare commits

..

No commits in common. "49d1e4f0111e296e751778233e7bb0c4211d7ebf" and "4ef764e62e7f39b741e222d0e201c2dc42b80ad3" have entirely different histories.

3 changed files with 29 additions and 10 deletions

View File

@ -1,6 +1,18 @@
# Luna
A simple kernel and userspace for the x86_64 platform, written mostly in C++ and C.
## WARNING
This branch is no longer actively updated. I have started rewriting the kernel for three different reasons:
- To switch to CMake, which is a lot more convenient than manually writing Makefiles.
- The code in this branch is so unportable that it doesn't have ANY hope of moving outside x86_64. I wanted to change that.
- To start fresh without my 3-month-old bad code, with a new way of doing things, kind of inspired by my recent adventures with the Rust programming language (it's still C++ though, I found Rust to be too limiting for kernel development).
The code for this rewrite can be found in the [restart](https://git.cloudapio.eu/apio/Luna/src/branch/restart) branch.
The changes in this branch will be merged as soon as the rewrite has reached a level of functionality similar to the `main` branch.
Until then, this version of Luna will stay in the `main` branch, although not actively developed.
## Features
- x86_64-compatible [kernel](kernel/).
- Keeps track of which [memory](kernel/src/memory/) is used and which memory is free, and can allocate memory for itself and [user programs](kernel/src/sys/mem.cpp).

View File

@ -45,10 +45,10 @@ uint64_t Memory::get_usable()
bool Memory::is_kernel_address(uintptr_t address)
{
return address >= 0xfffffffff8000000;
return address >= 0xffff800000000000;
}
bool Memory::is_user_address(uintptr_t address)
{
return address && address < 0xfffffffff8000000;
}
return address && address < 0x00007fffffffffff;
}

View File

@ -55,9 +55,9 @@ void sys_mmap(Context* context, void* address, size_t size, int prot, int fd, of
if (address)
{
kdbgln("mmap(): %ld pages at address %p, %s, fd %d", size / PAGE_SIZE, address, format_prot(prot), fd);
if (Memory::is_kernel_address((uintptr_t)address))
if (!Memory::is_user_address((uintptr_t)address))
{
kwarnln("munmap() failed: attempted to unmap a kernel page");
kwarnln("mmap() failed: attempted to map a non-user page");
context->rax = MAP_FAIL(ENOMEM);
return;
}
@ -153,9 +153,9 @@ void sys_munmap(Context* context, void* address, size_t size)
context->rax = -EINVAL;
return;
}
if (Memory::is_kernel_address((uintptr_t)address))
if (!Memory::is_user_address((uintptr_t)address))
{
kwarnln("munmap() failed: attempted to unmap a kernel page");
kwarnln("munmap() failed: attempted to unmap a non-user page");
context->rax = -EINVAL;
return;
}
@ -202,12 +202,19 @@ void sys_mprotect(Context* context, void* address, size_t size, int prot)
context->rax = -EINVAL;
return;
}
if (Memory::is_kernel_address((uintptr_t)address))
if (!Memory::is_user_address((uintptr_t)address))
{
kwarnln("mprotect() failed: attempted to protect a kernel page");
kwarnln("mprotect() failed: attempted to protect a non-user page");
context->rax = -EINVAL;
return;
}
// FIXME: Check for overflow when adding address + size.
if (!Memory::is_user_address((uintptr_t)address + size))
{
kwarnln("mprotect() failed: end of given range is out of user memory");
context->rax = -EINVAL;
return;
}
uint64_t flags = VMM::get_flags((uint64_t)address);
if (flags == (uint64_t)-1)
{
@ -223,4 +230,4 @@ void sys_mprotect(Context* context, void* address, size_t size, int prot)
kdbgln("mprotect() succeeded");
context->rax = 0;
return;
}
}