Commit Graph

233 Commits

Author SHA1 Message Date
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
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
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
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
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
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
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
bcbf43e55c Kernel/std: Add strdup() 2022-10-12 18:03:54 +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
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
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
66add380cf Kernel/Utilities: add a new get_top_of_stack convenience function 2022-10-12 13:17:58 +02:00
97eacc027e Kernel: Use PAGE_SIZE in more places 2022-10-12 13:05:57 +02:00
f5deb1048a Kernel: Add functions to push and pop the interrupt state
This can be useful when you want to disable interrupts, but then only enable them back if they were previously enabled.
2022-10-12 12:58:56 +02:00
b3e16068ef Kernel: Add Utilities::get_rflags(), and thus Interrupts::are_enabled() 2022-10-12 12:56:55 +02:00
96b1d1c2f2 Devices: Tell a device which name you want it to be instantiated with
This allows us to create a device in any path, with any filename.
2022-10-12 10:54:46 +02:00
eb03ae91e0 Devices: Add a new Serial device
This device permits userspace to interface with the serial port.
2022-10-12 10:44:30 +02:00
d3ac590e24 Kernel: Remove the sys_getversion() syscall
User programs can now acquire this information by reading /dev/version.
2022-10-11 21:31:28 +02:00
12cf37d0a7 Kernel/syscalls: Modify sys_write to accept a file descriptor and write to it
Previously, sys_write only wrote to the tty. Now, it uses the VFS interface, as it should.
2022-10-11 21:06:12 +02:00
e764647133 Devices: add a new ConsoleDevice
This new device is the userspace interface to the text console/tty.
2022-10-11 21:04:50 +02:00
e67ef7778c VFS: Support writing to files 2022-10-11 21:03:30 +02:00
04da26bff5 kernel: add a few comments 2022-10-11 19:51:24 +02:00
0131193379 ELFLoader, Scheduler: Transition to use VFS
We should start to drop the old InitRD API, which only allows for files to be loaded from the initrd, and which forces pathnames to be relative (bin/init)
With VFS, we can load any kind of file from any kind of filesystem, and using paths that make sense (/bin/init)
2022-10-11 19:33:48 +02:00
0a7d4a530d VFS, DeviceFS: Implement a device filesystem
For now, we just have a version device. (this will allow us to get rid of sys_getversion!!)
More should be implemented soon.
2022-10-11 19:21:16 +02:00
4aa3da8c12 VFS: Add basic mount(), unmount() and mkdir() functions (not accessible to userspace yet) 2022-10-11 18:23:00 +02:00
1278cec065 VFS: Add a 'type' flag to Nodes, implement EISDIR 2022-10-11 17:48:11 +02:00
da2ede3450 Kernel, libc, userspace: Implement file descriptors
Kernel: Implement a descriptor struct which stores the opened node and read offset, and give each task 8 of those.
Implement three syscalls: sys_read, sys_open and sys_close (sys_write still writes to the console instead of using a fd, for now)
Implement three new errors: ENOENT, EBADF and EMFILE.

libc: Implement the new errors, and the new syscalls in syscall().
Also fix _RETURN_WITH_ERRNO() to set errno correctly, which was making strerror() return null, thus crashing perror().

userspace: make init demonstrate the new file API.
2022-10-10 20:21:39 +02:00
63b2de4e3c Basic FDs 2022-10-10 19:00:24 +02:00
bbe7c6e658 VFS: Implement resolve_path and form the initial ramdisk's VFS properly
Finally, resolve_path: a function which takes a path (/etc/fstab for example), and walks the VFS:
In this case, it would start with the root FS node, and ask it: "do you have a directory/file named etc?"
The node could say 'yes', 'no', or 'i'm not a directory, I'm a file' (should not be the case for the VFS root, but for the other ones it could be)
If it says yes, we continue and ask the child if it has a file named fstab. Etc...
2022-10-10 18:44:43 +02:00
2be70d0bc1 VFS: Use 64-bit numbers in read()
There is no need for any kind of 32-bit compatibility.
2022-10-09 21:30:38 +02:00
8158ddc94f VFS: be more verbose 2022-10-09 21:19:22 +02:00
b38c52f8c7 more vfs stuff 2022-10-08 21:35:19 +02:00
f3d7e220ac The beginnings of a VFS implementation!! 2022-10-08 21:22:46 +02:00
f83a6ace51 Kernel, libc: Add support for providing a status code to exit()
The exit() libc function already accepted an integer, but didn't pass it on to the kernel since we had no mechanism for it to do that.
Now, the kernel stores a task's exit status to display it later (and in the future, return it to userspace via wait()/waitpid())
2022-10-08 17:56:40 +02:00
abcf1b6118 Define PAGE_SIZE as 4096 and use it everywhere instead of using 4096 as a magic number 2022-10-08 14:52:28 +02:00
ce6ec3585c Kernel, libc: Add ENOSYS
This error is returned by the kernel/C Library when an attempt is made to use a system call that doesn't exist.
2022-10-08 14:18:25 +02:00
a086ec514b Remove the Superblock.h file which has never been used.
This file was included for a future Ext2 implementation. It should be included when said Ext2 implementation is actually started.
2022-10-08 13:28:30 +02:00
71e15e94af Kernel, libc and userspace: Add basic errno support.
Kernel: Add an errno.h header with definitions for each header,
and return those, negated, from syscalls when there is an error.
mmap() returns an invalid address with errno encoded, instead of
returning a negated errno; this address is encoded as ffffffffffffffEE
where EE is errno in hex.

libc: make syscall() return -1 and set errno on error, instead of
returning the raw return value of the system call. Also, add mmap()
and munmap() wrappers in sys/mman.h :).

userspace: make the memeater program show the value of errno
when allocating memory fails.

Things to improve: add perror() and strerror() to make the errno
experience even better! >.<
2022-10-08 12:06:09 +02:00
dc389da74e Implement an ELFImage struct
This struct allows us to keep track of what memory is used by the loaded executable. For some reason, freeing this memory when the task exits triggers a kernel page fault, so I'm not doing that right now.
2022-10-07 17:54:05 +02:00
594d79143e Kernel: enable -Wconversion 2022-10-06 17:13:34 +02:00
952d8fa294 Be more strict with warnings 2022-10-05 17:34:22 +02:00
8f310dd307 PMM: Map the page bitmap to kernel heap once the PMM and VMM are both initialized 2022-10-04 18:36:09 +02:00
dae2ff8d50 Add mmap and munmap syscalls, and thus, add malloc and free to libc!! (yet again, thanks to the wonderful liballoc) 2022-10-02 20:45:04 +02:00
1ecd24f5d6 Kernel: Add SSE support (enable SSE on boot and save context (user tasks only) on task switch) 2022-10-02 18:53:54 +02:00
8e6741ebd6 Rename SYS_version to SYS_getversion 2022-10-02 17:25:56 +02:00
ac6fdce737 Add 2 new syscalls (sys_version, sys_gettid) 2022-10-01 17:30:31 +02:00
87cb41e549 Separate the logging stack into toggleable backends, to disable console logging once boot finishes. 2022-10-01 15:35:11 +02:00
0e46ea8ada Finally, a text renderer that actually works. We can now see the kernel messages without a serial port :) 2022-10-01 14:27:45 +02:00
30411b4b78 Fix hackiness in converting a uint32_t to a Color, by providing a function to do so 2022-10-01 13:08:47 +02:00
66bee86a8b Scheduler: add a load_user_task function that directly loads a file from the initrd 2022-10-01 12:28:32 +02:00
6e6cf5b2b0 Add an ELF Loader!! 2022-10-01 12:15:56 +02:00
53d36be339 Add a much-needed get_blocks_from_size function 2022-10-01 12:13:38 +02:00
e769cb45a7 MemoryManager: add get_page_at and get_pages_at functions to map any physical memory at a fixed virtual address (inverse of get_mapping and get_mappings) 2022-10-01 12:12:50 +02:00
ef5994e389 Proper userspace program 2022-09-29 20:06:18 +02:00
522d74b65d Add is_user_address and is_kernel_address functions 2022-09-29 19:30:42 +02:00
f25014a8ed refine syscalls 2022-09-29 19:17:43 +02:00
46f459337c Interrupts: Remove ensure_handler and use a more reliable way of detecting if we are in a handler 2022-09-29 18:35:51 +02:00
07d6fe388d Fix naming 2022-09-25 21:43:28 +02:00
f1a7138568 User mode (with a few syscalls)
IT ACTUALLY WORKS NOW.

Why wasn't it working? Oh, because I was not setting already present page tables's permissions to user mode. Just a little bug. THAT I SPENT DAYS TRYING TO FIND

Anyways, it works now. Such a relief...
2022-09-25 20:35:05 +02:00
19dff40ee2 Scheduler: track total CPU time of tasks 2022-09-25 17:49:51 +02:00
3fd1b6773d Panic: Only dump stack trace if InitRD is initialized 2022-09-25 17:41:34 +02:00
a078a11dde Move PMM and VMM initialization into MemoryManager::init 2022-09-25 17:38:17 +02:00
4e62566c48 Add with_value_of and with_value to MSR 2022-09-25 17:28:38 +02:00
aee4e55fdd add a proper kernel panic 2022-09-25 16:56:00 +02:00
704a23d0ad Sanity checks 2022-09-24 23:09:39 +02:00
6bd3529f32 Port liballoc to get proper kmalloc/kcalloc/krealloc/kfree functions.
Yes, that's not completely-from-scratch.
But let's be honest, am I going to do everything from scratch? Probably not. I'm not making my own bootloader.
And making a proper smaller-than-4-KB allocator is not something I want to do.
Plus, liballoc works perfectly in this rewrite, seeing as the MM code actually works, instead of leaking all your poor memory
And liballoc_{lock, unlock} can be actually defined, since we have spinlocks here!
2022-09-24 22:40:59 +02:00
3891d0c52e Rename KernelMemoryManager to MemoryManager
Kind of a more catchy name, isn't it?
2022-09-24 21:45:13 +02:00
46b7dab847 Remove RangeAllocator and make a PMM namespace 2022-09-24 21:27:45 +02:00
198f4196c4 Add an MSR utility struct 2022-09-24 20:48:27 +02:00
7b8d30aacd Add a Device class to PCI and a PCITypes file for string names for PCI device types 2022-09-23 18:01:07 +02:00
8a93c53277 Add a Device class to PCI 2022-09-23 17:24:45 +02:00
c3e5251687 Some more userland and font failing 2022-09-23 16:41:43 +02:00
11dd165a8e Scheduler: add proper support for user tasks (still faults though) 2022-09-22 08:14:04 +02:00
543fe2885f Add support for user pages 2022-09-22 07:57:30 +02:00
ec01dc2927 Scheduler: Change fixed Task array for (highly inefficient) memory allocation, add userspace task support (which as memory is mapped kernel-only instantly crashes), and support for exiting a task (marking it as exited and reaping it later) 2022-09-21 21:06:00 +02:00
ee49caa6d3 Interrupts: ensure is_in_handler is true if we know we are in a handler 2022-09-21 21:03:49 +02:00
4401b31440 Remove ds from context, no need for it in x86_64, use ss instead 2022-09-21 21:03:24 +02:00
d54ed0dc8b Make ASSERT, PANIC and TODO show a backtrace and scheduler tid if initialized 2022-09-21 20:56:40 +02:00
af8e5aca64 Add basic PCI driver 2022-09-21 17:57:02 +02:00
49ddb47ad4 Reorganize structure 2022-09-21 17:56:53 +02:00
1c12cf016e Add a Scheduler.
Finally.

Just Round Robin with sleeping, but it's still awesome. I think this can finish v0.3, with a few adjustments.
2022-09-20 19:58:04 +02:00
e6c6a1677a Rename "SavedContext" to "Context"
Seemed like a more appropriate name.
2022-09-20 19:56:43 +02:00
d0d2d4381c Add a is_in_handler function to validate being in an interrupt handler 2022-09-20 17:16:07 +02:00
1c1aa96293 Add a moon_version function that returns the full version string 2022-09-20 16:34:24 +02:00
6967fa9117 Update config.h to use a .cpp file that will be recompiled when it changes 2022-09-20 16:30:34 +02:00
15883c2dd3 Guard MOON_SUFFIX in config.h 2022-09-20 16:22:03 +02:00
7f1731ca2c Moon 0.3-dev 2022-09-19 21:13:45 +02:00
ee8c2759a6 Got a stack tracer working!! 2022-09-19 21:11:43 +02:00
9d3030763b We can fetch a symbol's name from its address!! 2022-09-19 20:54:05 +02:00
d8bfb76eef Try to make TextRenderer work... still failing
I can now safely call try_initialize() in early_init though
2022-09-19 20:17:37 +02:00
31460fe148 I.... think I fixed the initrd code? 2022-09-19 17:06:08 +02:00
d4a982306f Add spinlocks 2022-09-18 20:15:19 +02:00
be31f2c017 Moon 0.2-dev 2022-09-18 17:16:44 +02:00
783af21a7e We are not using C 2022-09-18 09:43:29 +02:00
9d19765b0e Add the ability to toggle loglevels in KernelLog 2022-09-15 18:42:38 +02:00
18140a55ec Make strstr take a const char* as a needle instead of a char* 2022-09-15 18:42:18 +02:00
efb28d3258 Randomness and stack protection!! 2022-09-14 18:54:40 +02:00
f98a45aefe Updated InitRD to use virtual mappings 2022-09-10 22:15:19 +02:00
4aeada05d3 Remove unused drawing files 2022-09-10 18:44:14 +02:00
6a0cf7cf98 New framebuffer class!! 2022-09-10 18:42:40 +02:00
e3e2952661 Consistent naming 2022-09-10 18:06:46 +02:00
1ab0f7291b Add kdbg and kdbgln 2022-09-08 17:02:40 +02:00
9de9eacb1d add strstr 2022-09-08 17:02:16 +02:00
276d20a33d Remove log/Address.h, since Log.h has variadic functions now 2022-09-08 16:26:24 +02:00
b4484e951d LOTS MORE LOGGING. which is great, of course. 2022-09-07 19:41:08 +02:00
c2391cee5d Added config.h 2022-09-07 15:02:54 +02:00
e936a143d3 MAKE LOG FUNCTIONS VARIADIC!! 2022-09-07 15:02:23 +02:00
1820286d8b stuff 2022-09-07 10:33:22 +02:00
c9e13f0128 Add attribute(format) to *printf to detect ill-formed calls to those functions 2022-09-06 18:25:38 +02:00
bd0a24097f Add a KernelMemoryManager namespace to wrap PMM + VMM 2022-09-06 18:08:15 +02:00
0fbc68ca88 Finish VMM 2022-09-06 13:49:17 +02:00
8bff2ee0f5 Add a RangeAllocator which serves as a physical memory allocator 2022-09-06 13:21:54 +02:00
716974a916 Add a minimal shutdown method, that only works on emulators (at least for now) 2022-09-06 12:13:43 +02:00
003c730117 Make hang() noreturn 2022-09-06 12:12:55 +02:00
a1659aa127 Add a reboot() function
This reboot function first tries to reboot using ACPI, then pulsing the CPU's RESET line through the keyboard, then triple-faulting. If we're still there, it halts.
2022-09-06 11:47:55 +02:00
aa673e1402 Add FADT header 2022-09-06 11:47:00 +02:00
f7f8c1068a Move SDTHeader to separate file 2022-09-06 11:46:26 +02:00
78fe37ddb3 Move declaration of IDTR to header 2022-09-06 11:44:37 +02:00
6a6be3292d Memory::get_system and Memory::get_usable 2022-09-05 17:13:12 +02:00
1367e88d88 Finally implement %l and %z format modifiers
Finally, we can use %zx with a 64-bit number instead of %x%x with 2 32-bit values split from a 64-bit number!
2022-09-05 16:59:45 +02:00
1b727a66ea Ready. Set. Go! 2022-09-05 16:13:51 +02:00