Commit Graph

199 Commits

Author SHA1 Message Date
83e6b8cd21 VMM: Fix naming convention 2022-10-13 18:42:53 +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
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
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
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
4e3ef9593d Scheduler: Move ELF image freeing to ELFLoader 2022-10-12 17:08:17 +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
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
97eacc027e Kernel: Use PAGE_SIZE in more places 2022-10-12 13:05:57 +02:00
e90b90c556 Kernel, libc: Round up to nearest page-aligned size instead of down 2022-10-12 12:15:12 +02:00
1e16a78106 libc: Document functions in sys/mman.h 2022-10-12 12:06:45 +02:00
25ab31c7ce Remove unnecessary comments 2022-10-11 21:32:28 +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
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
6088031c49 stdio: log stuff more 2022-10-11 17:19:03 +02:00
81815a0bdd Refactor sys/stdio.cpp 2022-10-11 17:10:44 +02:00
2a755fcd93 sys_open(): actually return EMFILE if the process has used all of its file slots 2022-10-11 17:03:16 +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
3feb7782bc Kernel/mmap, munmap: Use %p in printf 2022-10-08 18:24:05 +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
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
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
8e6741ebd6 Rename SYS_version to SYS_getversion 2022-10-02 17:25:56 +02:00
c6b044acab ELFLoader: show permissions of loadable segment 2022-10-02 17:10:24 +02:00
83d23ce8fe Correct the syscall ABI 2022-10-02 17:01:46 +02:00
ac6fdce737 Add 2 new syscalls (sys_version, sys_gettid) 2022-10-01 17:30:31 +02:00
ba4806f9d3 Syscall: do not send user programs' output to the serial console 2022-10-01 15:53:55 +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
008bdf505c Rename gfx.cpp to paint.cpp 2022-10-01 13:09:43 +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
6e6cf5b2b0 Add an ELF Loader!! 2022-10-01 12:15:56 +02:00
ef5994e389 Proper userspace program 2022-09-29 20:06:18 +02:00
f25014a8ed refine syscalls 2022-09-29 19:17:43 +02:00