Commit Graph

281 Commits

Author SHA1 Message Date
9b3c7816a3 Scheduler: pop the interrupt state when returning early from load_user_task() 2022-10-14 16:54:52 +02:00
26211bd49f It (almost) works now
The only thing doing weird stuff is exec(), so that's commented out and throws ENOSYS right now.

But we have two user tasks running in parallel, isolated from each other!
2022-10-14 16:46:00 +02:00
0c7c249935 exec is still doing some weird stuff, totally corrupting the page tables 2022-10-13 22:20:24 +02:00
5d41b4b113 Almost there...
exec() is not working yet. But the rest are!!
2022-10-13 22:13:04 +02:00
24272c57ef Almost there! 2022-10-13 21:55:51 +02:00
83982a24e2 add a comment 2022-10-13 21:21:02 +02:00
ee712432bd Some more multiple address space stuff
This page-faults. This is because the memory where the ELF should be is all zeroes, which the CPU tries to interpret.
2022-10-13 21:14:39 +02:00
229b06c63b Add basic address space infrastructure 2022-10-13 19:19:51 +02:00
522aa2f812 mmap, munmap: Add more checks 2022-10-13 18:50:12 +02:00
83e6b8cd21 VMM: Fix naming convention 2022-10-13 18:42:53 +02:00
57482e4e93 VMM: Make it even nicer 2022-10-13 18:15:52 +02:00
b360307f41 VMM: Make it so much gooder
There are still some fixes to be made, but I think this is already way cleaner than before.
2022-10-13 17:58:13 +02:00
9f2c9fb190 Kernel: Make Utilities be inline 2022-10-13 17:17:28 +02:00
b0e1b8a2b2 Missed some empty lines 2022-10-12 20:51:24 +02:00
2dd3a23092 Kernel: remove warnings when a standard IO syscall returns an error
That will probably happen a lot. We want userspace to tell us IF THE ERROR IS RELEVANT.
So, these unnecessary warnings are just noise.
Userspace may also use these functions to check for file descriptors.
For example, libc does this at program initialization, it checks whether fd 0 and 1 exist (by calling lseek() and seeing if it fails with errno=EBADF).
2022-10-12 20:50:21 +02:00
52944ba5d8 Kernel/VMM: Add support for larger pages to getFlags() 2022-10-12 20:05:27 +02:00
69a9f7f06a Kernel: Move VMM from a class to a namespace
Also, rename the ugly Paging::VirtualMemoryManager name to just 'VMM'. Which is now used instead of kernelVMM.
2022-10-12 20:02:25 +02:00
5f8376409d Kernel, libc: Implement EFAULT 2022-10-12 19:25:35 +02:00
e37ff67da2 Make exec return an error if the loaded executable would use more memory than is currently available 2022-10-12 19:22:08 +02:00
9cddf9485d ELFLoader: Make check_elf_image return how much memory the executable will use on success 2022-10-12 19:20:14 +02:00
4091799701 Kernel, libc: Add ENOEXEC (Exec format error) 2022-10-12 19:15:44 +02:00
8a7ddfca80 exec: Use check_elf_image()
This allows exec to recover if an error should occur when loading the executable.

Thus, the calling process will be notified instead of killed.
2022-10-12 18:43:48 +02:00
1a54342454 Sanity check 2022-10-12 18:38:18 +02:00
d4c4c0177d compilation fix :) 2022-10-12 18:37:32 +02:00
3ac9fed23a ELFLoader: Add check_elf_image() and check_elf_image_from_filesystem()
These two functions validate an image, without actually loading it. Very useful for exec!
2022-10-12 18:37:00 +02:00
261fc73146 ELFLoader: Read the ELF file header by header using the VFS
Instead of just allocating one big redundant blob of memory and reading into it, then having to free it...
2022-10-12 18:23:52 +02:00
e9df5fd663 exec: Copy pathname into kernel memory, since the user memory where it resides is going to be freed 2022-10-12 18:04:20 +02:00
bcbf43e55c Kernel/std: Add strdup() 2022-10-12 18:03:54 +02:00
531afc3d6f libc: Add support for the new exec() system call
execv() is a temporary wrapper that ignores the second parameter, while execve() and execvp() still error out.
2022-10-12 17:45:58 +02:00
f8b3567042 Kernel: Add an exec() syscall
Very bare-bones for now. Doesn't support arguments or environment (we don't have that stuff right now), and the executable is not a valid ELF, it terminates the task.

But it's a start!
2022-10-12 17:42:01 +02:00
25a460e3c6 Scheduler: clear user tasks' registers 2022-10-12 17:12:06 +02:00
136c0b3ae9 Scheduler: add a reset_task function
This can be used later to implement execve()
2022-10-12 17:08:45 +02:00
4e3ef9593d Scheduler: Move ELF image freeing to ELFLoader 2022-10-12 17:08:17 +02:00
a6f0a7056f Scheduler: Set the user_task field in a Task at creation time
We were previously looking at its segment registers to see if they were user-like, but this method is bad.
What is the task was executing a system call?

So now, we store that value at creation time.
2022-10-12 17:07:39 +02:00
edda41a7bb libc: Implement fseek(), ftell() and rewind()
All three use the new syscall seek() (with its lseek() wrapper in unistd.h)!!
2022-10-12 15:56:03 +02:00
854f585e1a Kernel: Add a seek() system call
Now, time for libc support!!
2022-10-12 15:28:52 +02:00
97b7572933 VFS: Implement a new type of Node, VFS_DEVICE
This is used to differentiate normal files from devices.
2022-10-12 15:22:34 +02:00
0f5910add7 Kernel/Utilities: Add new round_{up,down}_to_nearest_page functions 2022-10-12 14:51:04 +02:00
baa71b09cc Kernel: Build with -fstack-protector-strong instead of -fstack-protector-all
We lose a LITTLE bit of security, while allowing the compiler to optimize MUCH more.

Very simple functions, like most functions in misc/utils.cpp, were being made very big when some of them can just be "jmp thingy" or "and rax, something" and waste much less space.

This change makes more sense, I think.
2022-10-12 14:50:31 +02:00
4768d5fc12 ELFLoader: Consider the offset when calculating how many pages to map
If a section needs to be mapped at 0x50f50 and its size is 0x200, then that address space exceeds one page.
But since 0x200 is less than one page, we only map one page.

If we count the offset, 0xf50 + 0x200 need two pages. So we can map the right amount of memory.
2022-10-12 14:40:06 +02:00
bbd9f1d187 VMM: Add FIXME 2022-10-12 14:35:34 +02:00
15f340dbbe VMM: Do not map recursively 2022-10-12 14:34:12 +02:00
28469497e9 Change build system to accept arbitrary CFLAGS during the build process
For the kernel, at least.
2022-10-12 14:31:41 +02:00
d3cb642e5f Scheduler: add FIXME 2022-10-12 14:30:57 +02:00
0ee9bd7290 Scheduler: free a task's ELF image.
Now that we have support for larger pages, this works!!
2022-10-12 14:30:46 +02:00
eaea4603c6 MemoryManager: Fix logging when built with debug logging
That is to say, -DMM_DEBUG
2022-10-12 14:29:30 +02:00
4021cb3ac0 KernelHeap: do not crash the entire system
Previously, calling free_virtual_page(s) would cause an assertion fail if the address was not in the kernel heap range.
Now, we just return.
2022-10-12 14:28:48 +02:00
ad9c7af0bf VMM: add FIXME 2022-10-12 14:27:47 +02:00
950f4ef608 VMM: Add support for larger pages
getPhysical() now stops at a larger page, unmap() can unmap a larger page, but map() just transforms it into a normal page.
getFlags() larger pages support is still pending.

At least now we don't page fault because we're trying to free a larger page.
2022-10-12 14:27:26 +02:00
525d567af6 VMM: When unmapping a page, invalidate the TLB for that page 2022-10-12 14:24:34 +02:00