da61e3648f
Kernel: Implement blocking reads
...
This is a huge step forward!! bc actually runs now, without echo or backspace, but it runs!!
2022-10-21 21:26:19 +02:00
bef9158450
Kernel, libc: Add isatty() and F_ISTTY to fcntl()
2022-10-21 18:34:31 +02:00
93207820b3
libc: Add a few errors to errno.h
...
As well as ino_t, which I forgot in the fstat() commit :)
2022-10-21 18:34:01 +02:00
fcf191aa7a
Kernel, libc: Add fstat()
2022-10-21 18:31:09 +02:00
a06e1c5a21
VFS: Remove warning when file is not found
...
That is a common ocurrence.
2022-10-20 19:11:50 +02:00
f7cf395f71
Kernel, libc: Add access()
2022-10-20 19:03:24 +02:00
27448611b3
UserMemory: do not map refs into kernel memory
...
This is bad design. But it fails if mapped, since something overwrites KernelHeap.
2022-10-20 18:50:07 +02:00
712f4f5e51
KernelHeap: Add more debug logging
2022-10-20 18:49:33 +02:00
9d0dfbaedf
PMM: Log invalid frees
2022-10-20 18:49:12 +02:00
073c90e948
InitRD: leak an unused pointer so kmalloc() doesn't map memory all the time
2022-10-20 18:49:00 +02:00
cd9ecc1746
Kernel: Return EFAULT when the kernel believes the wstatus pointer is invalid
2022-10-20 08:20:56 +02:00
47bdfecedb
Devices: Add /dev/uptime
...
This file contains how many milliseconds have passed since boot at the time of reading it :)
2022-10-19 21:11:12 +02:00
1938a059a2
Kernel: Free the last spawned thread's PID on exit
2022-10-19 20:51:54 +02:00
51665a04b7
Kernel: Restart if init exits
2022-10-19 20:33:41 +02:00
7e9744419e
sh: Improve it
2022-10-19 20:16:21 +02:00
3c5c92c7c3
sh: Add a simple interactive shell
2022-10-19 19:42:05 +02:00
b035795eb3
Kernel: Move errno.h and (k)assert.h out of the main include directory
...
This is mostly so IDEs don't pick them up instead of the userspace headers :)
2022-10-19 17:41:23 +02:00
f3af3e252b
Kernel: refresh task_misbehave()
...
That function was severely outdated.
2022-10-19 17:26:36 +02:00
ef8ba3dec4
Kernel: Do not hang when a user task misbehaves
...
This was for testing/debugging. But we DEFINITELY don't want that.
2022-10-19 17:25:56 +02:00
656667812a
Kernel: reparent child processes to PID 1 when their parent exits
2022-10-19 17:16:01 +02:00
a29f7f8df2
Kernel: waitpid: support -1 as PID (wait for any child)
2022-10-19 17:15:30 +02:00
48d4a5910a
Kernel: Add a few convenience functions to manipulate userland memory
2022-10-19 17:13:16 +02:00
755242719c
VMM: Add a few memsets
...
This seems to fix exec() making weird page tables!!
2022-10-19 07:56:08 +02:00
671f2a2de3
Kernel, libc: Implement waitpid()
...
FIXME: exec() is now doing weird page table stuff. But at least it works, no panics :)
2022-10-18 21:30:52 +02:00
bb00e3c112
Kernel: Guard against recursive panics
...
Previously, when we panicked (page-fault for example) while dumping a kernel panic, it would just loop over and over again.
Now, we check if we were already in a panic, and limit the dump:
- No stack trace.
- Only a few registers.
- Only serial (since we can page fault while writing to the framebuffer)
This should make recursive panics much more difficult to achieve.
If we page-fault while writing to console, we don't even see a panic (not even in serial) and eventually triple-fault.
So this patch is actually more user-friendly.
2022-10-18 21:08:21 +02:00
59506b8852
Kernel: Show current_task's name in the log
2022-10-18 18:41:17 +02:00
52d391507d
Kernel: Rename the getpid() syscall to getprocid()
...
Now, we have one single system call to fetch all sorts of identifiers:
PID, PPID, UID, GID; EUID, EGID, and more...
2022-10-18 17:36:17 +02:00
a9d3bdba6f
Kernel: Keep track of a task's PPID
2022-10-18 17:18:37 +02:00
bdf1bb15a1
StackTracer: only show kernel addresses for now, until there are more checks
2022-10-18 17:14:09 +02:00
48d68a3e31
Kernel: Switch back to kernel address space on kernel panic
2022-10-18 17:13:43 +02:00
92d8c9d4d5
Next version!
2022-10-17 21:28:35 +02:00
4f41b9ed37
Scheduler: Implement a find_by_pid function
2022-10-17 20:40:38 +02:00
8b17065718
Kernel, libc: Rename gettid() to getpid() and move it to unistd.h
2022-10-17 20:08:44 +02:00
87ef210759
Kernel, libc: Remove spawn()
...
Now, fork() and exec() are both implemented. More POSIX-y, thus spawn can be removed.
2022-10-17 19:55:01 +02:00
a2c05de604
mmap(), mprotect(), munmap(): Check more stuff
2022-10-17 19:32:24 +02:00
593daba651
Kernel: Remove unused headers in main.cpp
2022-10-17 19:23:53 +02:00
ea8a42b8c0
Kernel: Add a name field to the Task structure
2022-10-17 19:12:47 +02:00
34fc6996b0
UserHeap: allocate needed memory in request_virtual_pages
2022-10-17 18:52:11 +02:00
92634048fc
UserHeap: some nice improvements
2022-10-17 18:49:19 +02:00
64f5078494
Kernel, libc: Implement fork()
...
This time for real.
Also, add a new per-user-task virtual address allocator (UserHeap), so that mmap'ed pages are in user range and can be copied.
2022-10-17 18:43:35 +02:00
966fdc76d7
Move userspace task to userspace memory
2022-10-17 17:30:05 +02:00
b334e1cd50
VMM: check if the entry is already present
2022-10-17 17:26:16 +02:00
682be58d97
AddressSpace: copy instead of linking
2022-10-17 17:24:33 +02:00
250db2c90f
Scheduler: add an append_task() function
2022-10-17 17:14:22 +02:00
c2fa4f380d
Kernel: Use the new Task member functions
2022-10-17 17:07:25 +02:00
ce10fb5743
fcntl(F_DUPFD): Allocate any file descriptor greater than or equal to arg
2022-10-17 17:01:22 +02:00
891651f2d6
Task: Move functions operating on Task to member functions
...
Also, add an alloc_fd_greater_than_or_equal() function, for use in fcntl(F_DUPFD)
2022-10-17 17:00:07 +02:00
e34045a78c
Kernel: on stack smashing detection, do not trigger a normal panic
...
That triggers stack traces, which we do not want in a stack smash fail situation
2022-10-16 19:04:24 +02:00
9b39d618de
Kernel, libc: Implement spawn()
...
This function is a Luna alternative to fork() and exec().
Why? Simply because I can't figure out for the life of me how to implement a working fork().
So meanwhile, we have spawn() as a replacement. exec() still exists, though.
2022-10-16 18:48:35 +02:00
a1146a5ce2
Panic: show panic message on screen
2022-10-16 18:23:33 +02:00
d2e2883a79
Kernel: Make mkdir() accessible to userspace
2022-10-16 17:22:12 +02:00
18fbccafb7
VFS: add an exists() function
2022-10-16 16:58:18 +02:00
d62eb6c791
Tests: Add test framework
2022-10-16 15:31:58 +02:00
f8154ce230
Kernel: Implement mkdir() from a single path
...
This is done using dirname() and basename() :)
2022-10-16 14:45:25 +02:00
8c0a57f0c2
Kernel: Copy strrchr, dirname and basename over from libc
2022-10-16 14:36:25 +02:00
1624f0360d
exec: More logging
2022-10-15 17:47:57 +02:00
68403dc029
Kernel: Make AddressSpaces reference-counted
2022-10-15 17:40:33 +02:00
eca7227fda
StackTracer: Stop when instruction is at nullptr
2022-10-15 17:31:57 +02:00
aca1367158
Kernel: Switch to strlcpy() as well
...
Surprisingly, most uses of strncpy() are in places where strncpy() is actually a better choice.
For example, copying to a fixed-length char array in a structure.
2022-10-15 17:30:34 +02:00
4bad782aad
Kernel: Increment the maximum number of file descriptors a task can have
...
Doesn't use up more space in the Task structure, and now we are above the Minimum Acceptable Value as defined by POSIX (20), I think.
2022-10-15 14:20:29 +02:00
62a2bcf2ff
Kernel: Add a clock() system call
2022-10-15 13:17:26 +02:00
3a9dddaa57
Kernel, libc: Remove the rand() system call
...
That's why we now have a VFS and a /dev pseudo-filesystem. To provide that kind of things.
Remember, everything is a file!!
The new way to ask the kernel for random numbers is to read from /dev/random.
2022-10-15 13:04:48 +02:00
613f8170b6
Kernel, libc: Implement mprotect() and use proper PROT_* values
2022-10-15 12:57:14 +02:00
62d631f1b4
Kernel: Rename assert.h to kassert.h so IDEs pickup the kernel header instead of the userspace one
2022-10-15 12:56:48 +02:00
1e86acd4c0
libc: Implement fcntl(F_DUPFD) and dup()
2022-10-15 11:16:34 +02:00
36bb1cab5c
FileDescriptor: add operator=() so that the fcntl(F_DUPFD syscall compiles :)
2022-10-15 11:16:18 +02:00
5c61252061
Kernel: Add a new fcntl() system call
2022-10-15 10:56:06 +02:00
3eb1bff2e9
Task: add an alloc_fd() function
2022-10-15 10:45:12 +02:00
91d76a2ee4
Devices: Add a new RandomDevice :)
...
This new device uses the seeded Mersenne PRNG we use in the kernel.
This device is not meant for regular userspace use, but more for userspace to seed their own PRNGs from.
If the DeviceFS is mounted at /dev, this device can be found at /dev/random.
2022-10-14 20:14:49 +02:00
faaf930a14
Moon 0.12-dev
2022-10-14 19:55:29 +02:00
97461c7c1f
Prepare for moon 0.11
2022-10-14 19:49:52 +02:00
e0aa552fae
Kernel: Add a move() function
...
The standard C++ move() function.
2022-10-14 19:04:56 +02:00
f82fbbe60c
Make address spaces not cloned by default
2022-10-14 18:23:04 +02:00
c8a92af4d2
Whoops! bugfix
2022-10-14 18:21:09 +02:00
1c3377fc98
Prepare for cloning address spaces, not there yet
2022-10-14 18:17:57 +02:00
e43777bd31
Apparently, it just works now.
2022-10-14 18:00:33 +02:00
97a8a4a4a2
Solve rebase
2022-10-14 17:39:24 +02:00
81f56083c5
Almost there!
2022-10-14 17:38:29 +02:00
cdb73836b0
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-14 17:37:51 +02:00
bb7887a29d
Add basic address space infrastructure
2022-10-14 17:34:29 +02:00
177282d79c
Use the more appropriate size_t
2022-10-14 17:33:06 +02:00
5abd8814e3
Kernel: Continue moving utilities to a separate subdirectory
2022-10-14 17:33:06 +02:00
e21b608af4
Utilities: Start moving utilities into specific headers in a utils/ subdirectory
2022-10-14 17:31:47 +02:00
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
c9ebe89899
Kernel/KernelHeap: Add MODULE #define
2022-10-12 14:04:41 +02:00
cf160d1260
Scheduler: Use misc/utils.h instead of doing everything manually.
...
That way the code is cleaner + we have one single point of failure.
2022-10-12 13:18:35 +02:00
66add380cf
Kernel/Utilities: add a new get_top_of_stack convenience function
2022-10-12 13:17:58 +02:00
cf3f61e373
Kernel: More GDT refactoring
2022-10-12 13:12:46 +02:00
c1f9d3323f
Kernel: Refactor TSS loading to make it cleaner >.<
2022-10-12 13:07:28 +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
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
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
eaf7a1620b
Next version!
2022-10-11 21:42:23 +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
112e375b5e
Kernel: Add a FIXME
2022-10-11 21:21:27 +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