d54c882c63
Add new/delete-like functions but with Results
2022-11-20 15:48:08 +01:00
caf6d1563c
Kernel: Add a heap memory allocator
...
This is the first time I've actually dropped liballoc in favor of writing my own implementation.
Usually, malloc() and such looked so complicated that I preferred to let a nice external library do the job.
But I've decided to try writing my own allocator, and now we have heap memory without any 3rd party code!
2022-11-20 15:15:26 +01:00
cb88630d86
Bugfix: Make alloc_at return the start of the virtual memory range instead of the end
2022-11-20 15:11:53 +01:00
af267772f0
Rename MemoryManager::map to map_frames_at
...
To make it clearer that this API is only intented for mapping contiguous frames of physical memory (for MMIO perhaps?)
2022-11-19 22:32:48 +01:00
1b41a3e9cf
Introduce a few helpers to allocate/map/unmap several pages, which wrap around the MMU functionality
2022-11-19 22:28:45 +01:00
c886669d56
Break down operations to make protect_kernel_sections() more readable
2022-11-19 22:27:59 +01:00
d96cb73995
Rename physical "pages" to "frames"
...
AFAIK, this is the proper naming scheme. "Pages" are virtual, and "frames" physical.
2022-11-19 22:27:08 +01:00
847f2b4f4c
Replace more usage of stdint.h types with Luna's Types.h
2022-11-19 22:25:03 +01:00
83bcac7a16
Kernel: Introduce a timer interface
2022-11-19 20:01:01 +01:00
047f445651
Kernel: Add helpers to validate memory addresses
2022-11-19 18:38:47 +01:00
424b069d55
Kernel: Start the call stack with a null RBP on x86_64
2022-11-19 18:38:32 +01:00
883a1da0d7
More indentation in CMakeLists.txt
2022-11-19 18:00:45 +01:00
70c6b78e35
Organize source tree
2022-11-19 17:59:49 +01:00
a44e2f41fe
Cleanup kernel/CMakeLists.txt
2022-11-19 17:59:39 +01:00
102eabcb4b
Do some more formatted logging
2022-11-19 17:52:24 +01:00
83e6bd1322
Make the build system more platform-agnostic
2022-11-19 17:46:53 +01:00
8cae20a82c
Move __check_failed out of line so anyone can implement it
2022-11-19 17:20:10 +01:00
b8c136eeb4
Make a common header for attribute shorthands
2022-11-19 17:18:51 +01:00
648bd3fb61
Switch format.h to use Result
2022-11-19 16:13:25 +01:00
31673c0ac9
Introduce format attribute
2022-11-19 15:53:58 +01:00
3cdf224b90
Remove useless files now that functions are out of line
2022-11-19 15:46:46 +01:00
dadc3e570b
Move a few functions out of line
2022-11-19 15:43:09 +01:00
4ebf244d3b
Support printing some integers in output_integer
2022-11-19 13:15:13 +01:00
603ff46d8c
Add a format implementation
2022-11-19 12:30:36 +01:00
762ca844d8
Add CPU::platform_string
2022-11-18 21:04:53 +01:00
109de54822
Provide stubbed handlers for many more x86 exceptions
...
I am now officially a big-boy OS developer, I read the Intel manuals for this!! (Not that the OSDev wiki doesn't have the information, but it was missing descriptions for some more obscure exceptions)
2022-11-18 20:51:25 +01:00
9d318d50aa
Use TRY in MMU.cpp
2022-11-16 20:37:41 +01:00
2c9329928c
Replace page_size (function) with ARCH_PAGE_SIZE (constant)
2022-11-16 20:37:32 +01:00
30ac95bcf8
Use usize/isize instead of (s)size_t
...
Since we're using Rust-style integer types already, why not go all in?
2022-11-16 20:30:34 +01:00
7fc5a6b753
Make kernel rodata and data not executable
2022-11-16 20:02:04 +01:00
7f15ba0ac5
Add some interrupt handling
2022-11-16 17:37:18 +01:00
df8666fd73
Remove unneeded label
2022-11-15 20:47:50 +01:00
bb46cd890b
Add GDT and IDT setup and loading + NX if supported
2022-11-15 20:41:59 +01:00
c9feb11366
Introduce a check() method (like assert() but always on)
2022-11-15 19:36:50 +01:00
c319336e3d
Add a CPU interface
2022-11-15 19:10:32 +01:00
e16324887f
MMU: Properly clear flags
2022-11-15 19:10:19 +01:00
3358454833
Add getters for free, used and reserved memory
2022-11-13 16:56:03 +01:00
6a7097c9ec
Add variables for the future
2022-11-13 16:54:07 +01:00
ae235e5538
MMU: unmap and remap for x86_64
2022-11-13 16:51:21 +01:00
ba1bf72e1b
Remove unused include
2022-11-13 16:32:28 +01:00
d6c56fb512
Mapping finally works!!
2022-11-13 16:31:32 +01:00
4c4f72b865
More MMU stuff, but writing still fails
2022-11-13 15:33:53 +01:00
d148e0aff7
Initialize MemoryManager instead of MMU directly
2022-11-13 14:29:59 +01:00
705c2747de
Add memory manager
2022-11-13 14:29:15 +01:00
6b95307b54
Add init
2022-11-13 12:20:53 +01:00
ffbe5260a5
Add Framebuffer stuff
2022-11-13 11:25:15 +01:00
82c2381ac9
Serial printing!!
2022-11-13 10:30:10 +01:00
cf758fdfdc
Initial commit :)
2022-11-13 10:09:09 +01:00
42efc21110
Start implementing read and write support in tmpfs
...
write seems to work fine, read just hangs there, waiting.
2022-11-12 20:11:26 +01:00
046065c533
Fix tmpfs
2022-11-12 19:05:47 +01:00
3451d50a37
Try building a tmpfs, but weird stuff happens
2022-11-12 18:13:41 +01:00
000ffd1fae
Scheduler: Handle weird cases when the task we're iterating on is null
2022-11-12 18:12:42 +01:00
37bb3273ce
Kernel: Add a C interface to the logging system
2022-11-12 18:12:18 +01:00
511bb7a8c1
Kernel: Make readdir() available in created InitRD directories
2022-11-12 18:11:58 +01:00
fa325072ac
Kernel: Add __cxa_atexit and __cxa_finalize
2022-11-12 17:43:57 +01:00
de2451e553
Kernel: Change up the logging in the kernel's PRNG
2022-11-12 12:56:13 +01:00
11ee01f269
Kernel: Remove "checkpoint logging" in main.cpp
2022-11-12 12:55:47 +01:00
5c51b82f6a
Kernel: Remove obtain_user_ref and add copy_typed_to and from_user
2022-11-12 12:08:26 +01:00
58fb422161
Kernel: Return a Result in MemoryManager and strdup_from_user
2022-11-12 11:56:40 +01:00
662afad426
Kernel: Add a Result class
2022-11-12 11:30:28 +01:00
559d074ce4
Kernel: Make a more convenient wrapper for basename() and dirname()
2022-11-12 10:39:25 +01:00
4aa3bd3107
Next version!
2022-11-09 17:25:05 +01:00
078f3f5862
Kernel: Add a remainder to refactor the initial ramdisk code
2022-11-09 16:07:49 +01:00
d76af10e70
Kernel: Move initrd into the fs/ folder
...
It makes more sense to put it in there.
2022-11-09 16:03:16 +01:00
60bd8d9418
Kernel: Add an explanatory comment to the end of _start()
2022-11-09 15:58:00 +01:00
1ea216dfd1
Kernel: Rename assert.h to ensure.h
...
The macro is named "ensure", the header file should reflect that.
2022-11-09 15:28:35 +01:00
da7ad8da5b
Kernel: Show the file location when a check fails
2022-11-09 15:23:59 +01:00
ea94b331fb
Scheduler: Use copy_to_user in a few system calls
2022-11-09 15:20:53 +01:00
accf7ee417
libc: Add unimplemented st_nlink field
2022-11-09 11:36:21 +01:00
033c41cbd7
Kernel: Rework the uid/gid system to make it compliant
2022-11-09 09:54:07 +01:00
98da473fdc
Run clang-format
2022-11-08 19:07:43 +01:00
054d5a8bb4
Build system: Prettify build
2022-11-08 18:03:43 +01:00
6f72f92493
Kernel: Start preparing for recursive paging
2022-11-08 17:12:59 +01:00
5d94525c7a
Kernel: Figure out why a program is misbehaving
2022-11-06 18:12:25 +01:00
44815b08c7
Kernel: Use copy_from_user() and copy_to_user() in read/write
...
This is huge. Finally, we can do proper reads/writes with invalid addresses, or big buffers.
2022-11-06 15:19:23 +01:00
b2fb740d99
Kernel: Refuse to mkdir any directory named . or ..
2022-11-05 12:09:01 +01:00
b78f6f269d
Kernel: Omit displaying KernelHeap's buffer location in the log
2022-11-05 11:59:00 +01:00
9ab3ab7c40
Kernel: Show init's exit status before restarting
2022-11-05 11:56:16 +01:00
b63a9f5ba9
Kernel: Improve strdup_from_user and add copy to and from user
...
Still a bit funky, that's why we're not using it in read() and write() yet.
2022-11-05 11:54:55 +01:00
67f536cf91
Kernel: Split number-parsing code into a separate file
2022-11-05 10:50:58 +01:00
d0efc106b0
Kernel: Add UBSAN (Undefined Behaviour Sanitizer)
2022-11-05 10:47:18 +01:00
ffcaac0ca3
Kernel: Add validate_user_write() and validate_user_read()
...
Not at copy_from_user and copy_to_user yet, but an improvement over blindly using physical memory.
2022-11-04 22:46:48 +01:00
cbc2e76082
Remove the .elf suffix from the kernel filename
2022-11-03 20:44:37 +01:00
e5b2641019
Kernel: Enforce W^X when loading executables
...
From now on, if an executable contains segments that
want to be loaded as both writable and executable,
we refuse and abort with ENOEXEC.
2022-11-03 20:28:54 +01:00
2c08de044f
Kernel, libc: Add support for querying the framebuffer's scanline via ioctl()
2022-11-03 20:20:22 +01:00
71633e264f
Kernel: Make the serial port writable for everyone :)
2022-11-03 17:13:32 +01:00
0fd31698b2
Kernel: Accept not opened file descriptors in dup2()
...
This involves renaming the descriptor_from_fd function to the more appropriately named
open_descriptor_from_fd (since we check if the descriptor was opened and error out otherwise),
and creating a new function that does not verify that the file descriptor was opened.
2022-11-03 16:52:21 +01:00
249c79f8a3
Kernel, libc: Add ioctl()
...
Right now, only the framebuffer supports this system call, to query its dimensions.
2022-11-02 20:59:42 +01:00
feab66c0d3
Kernel: Remove the paint() system call
...
That was a very old one from back in the old days. Now that the framebuffer is finally a device file,
and it can be memory-mapped by user programs for more performance,
this syscall is MORE than obsolete.
2022-11-02 20:35:06 +01:00
8f2308c80d
Kernel: Implement mmap-able device files (regular files are not mmap-able yet)
2022-11-02 20:24:07 +01:00
42a805fd60
Kernel: Move the translated keyboard to /dev/console and make /dev/kbd provide raw scancodes
2022-11-02 19:51:54 +01:00
c604c074a1
Kernel: Rename ASSERT() to ensure()
...
Doesn't get stripped on release builds, so it shouldn't be named assert.
2022-11-02 19:38:15 +01:00
e5cf32c7b3
Kernel: Introduce page ownership
...
Some pages, such as framebuffer pages, are not physical memory frames reserved for the current process.
Some, such as the framebuffer, may be shared between all processes.
Yet, on exit() or on exec(), a process frees all frames mapped into its address spaces.
And on fork(), it copies all data between frames. So how could we map framebuffers.
Simple: we use one of the bits in page table entries which are available to the OS, and mark whether that page is owned by the current process.
If it is owned, it will be:
- Freed on address space destruction
- Its data will be copied to a new page owned by the child process on fork()
If it is not owned, it will be:
- Left alone on address space destruction
- On fork(), the child's virtual page will be mapped to the same physical frame as the parent
This still needs a bit more work, such as keeping a reference of how many processes use a page to free it when all processes using it exit/exec.
This should be done for MAP_SHARED mappings, for example, since they are not permanent forever,
unlike the framebuffer for example.
2022-11-02 19:32:28 +01:00
07e518c38f
Kernel: Make sys_mmap log the correct prot value
2022-11-02 18:39:58 +01:00
22740e69bf
Kernel: Add support for the NX bit
...
Not support, actually. We now REQUIRE it.
2022-11-02 18:34:57 +01:00
534500cda0
Implement enough runtime for binutils to compile
2022-10-31 12:29:53 +01:00
c2a08060cf
VFS: Add support for an implementation-defined value
2022-10-30 20:53:45 +01:00
5eae93bbb0
Bugfix: do not crash if we are blocking for no reason
2022-10-30 20:51:32 +01:00
52d4f34f05
Kernel, libc: Implement umask()
2022-10-30 19:55:38 +01:00
29c59abf7d
Kernel: Rename blocking_wait_info's wait_pid to pid
2022-10-30 19:28:43 +01:00
9c3792718c
Kernel: Remove waitpid() debug messages and add more checks
2022-10-30 19:24:56 +01:00
e244c150c2
Kernel, libc: Add ECHILD
2022-10-30 19:24:26 +01:00
c68d040484
Scheduler: Make sure we are in the kernel's address space when resuming a blocked process
2022-10-30 19:10:46 +01:00
00f90246c8
Kernel: Implement very basic escape sequences for TextRenderer
2022-10-30 18:34:40 +01:00
08c4dac2c2
Kernel: Enable -Wvla
2022-10-30 18:20:16 +01:00
af0f4d2037
Kernel: Remove /dev/uptime
...
This information can now be fetched with clock_gettime.
2022-10-30 10:16:53 +01:00
e640c6e245
Kernel, libc, userspace: Add file timestamps (atime,ctime,mtime)
2022-10-30 09:57:17 +01:00
8d46c9bbe2
Kernel, libc: Fix a big bug in printf()
...
Every time printf flushes the buffer to us in sprintf() or snprintf(), we call strncat to append the data.
But we want to start from the beginning in the first flush. What if there was data already there?
Well, we just append to the old data. Which is not good, and breaks snprintf()'s maximum size policy.
This fix sets the first byte of str to NULL, to avoid this.
2022-10-30 09:53:23 +01:00
688a640a16
Kernel: Add the clock_gettime syscall, which replaces clock as it can be used for more stuff
2022-10-30 09:07:59 +01:00
baf97840e9
Kernel: Keep track of boot time
2022-10-30 09:07:03 +01:00
d1e4bc5504
Kernel: Use framebuffer virtual address instead of physical address
...
Just found out bootboot.fb_ptr was the physical address, not virtual.
That explains why we were getting page faults while writing to the physical address of the framebuffer. (we were in a user address space when doing so)
So this should probably make the system much more stable!!
2022-10-29 20:10:49 +02:00
32e09d3417
libc: Stub out more functionality so part of binutils builds
2022-10-29 09:39:12 +02:00
2ca20c1a1e
compilation fix
2022-10-28 21:02:23 +02:00
e05f3f5325
Kernel: Read file modes from the initrd, filtering out write permissions
2022-10-28 20:52:10 +02:00
a2d9ada4dc
oopsie
2022-10-28 19:38:04 +02:00
b8296eb92d
su: Also set group ID
2022-10-28 17:55:56 +02:00
09a615bd99
Kernel, libc: Expose processes' UID and GID in pstat()
2022-10-28 17:31:34 +02:00
1c4f1ab867
Kernel, libc: Add setuid() and setgid() system calls
2022-10-28 17:19:26 +02:00
c312d81de4
Kernel, libc: Add st_uid and st_gid to stat, and handle st_mode differently
2022-10-28 17:13:20 +02:00
26b20938de
Kernel, libc: Use mode in mkdir()
2022-10-28 17:11:35 +02:00
0115cce750
Kernel/VFS: Add file owners and file modes, and check those in system calls
2022-10-28 17:10:28 +02:00
6ddfc5ee52
Kernel: Invoke sys_stat when asked
2022-10-28 17:06:33 +02:00
16dc227a05
Kernel: Add UID and GID fields to Task
2022-10-28 17:06:13 +02:00
3effe8b004
Kernel: Add EACCES to std/errno.h
2022-10-28 17:02:27 +02:00
50cda50f01
Kernel, libc: Add F_GETFD, F_SETFD and FD_CLOEXEC
2022-10-27 17:17:24 +02:00
fcf53ef6a5
Kernel: Make waitpid() block by default unless WNOHANG is specified
2022-10-27 17:05:42 +02:00
06e6429567
Kernel: Reorganize a bit of scheduler code
2022-10-27 08:07:34 +02:00
f9dad8a8d6
Kernel, libc: Stub out struct stat.st_dev
2022-10-27 08:01:33 +02:00
9b0f6b6595
Kernel, libc: Add O_EXCL
2022-10-27 07:55:59 +02:00
1c35eabb2b
open(): Add a third optional mode argument
2022-10-27 07:52:57 +02:00
a3c6635f3e
Kernel, libc: Add O_APPEND and stub out O_CREAT and O_TRUNC
2022-10-27 07:43:55 +02:00
41f7232b77
Devices: Return EOF after first read for some devices
...
Still not optimal.
2022-10-26 20:54:47 +02:00
e1f58c0163
Kernel: If wrapping a line at screen bottom, scroll properly
2022-10-26 20:14:24 +02:00
a4e430d35e
Kernel: count the null byte while calculating how much stack space argv will use
2022-10-26 20:05:24 +02:00
7d20c507b1
Kernel, libc, userspace: Implement command-line arguments (argv)
...
The only thing missing now is for sh to pass them on.
2022-10-26 18:57:06 +02:00
af452e2b2a
Kernel, libc: Add dup2()
2022-10-25 18:58:06 +02:00
af46b8d9ac
Kernel: Cleanup file descriptor validation
2022-10-25 18:35:17 +02:00
ec2c314234
Kernel: Add /dev/null
2022-10-25 17:59:55 +02:00
d458c5c848
Fix kernel/Makefile
2022-10-24 20:52:11 +02:00
0dec5f7bad
libc: Add dummy getcwd()
2022-10-24 17:05:28 +02:00
58b01b74e2
Kernel, libc: Add stat()
2022-10-23 18:35:32 +02:00
0c04246300
Next version!
2022-10-23 17:24:18 +02:00
e457b88b04
Kernel, libc: Implement O_DIRECTORY and use that in dirent.h
2022-10-23 14:46:27 +02:00
8bf2904d74
libc: Implement a basic subset of dirent.h
2022-10-23 14:41:45 +02:00
14367f07b5
Kernel: Add support for getdents() to DeviceFS
2022-10-23 14:05:55 +02:00
78d72c2f0c
Kernel, libc: Add a getdents() system call
...
This is meant to be a low-level interface to implement dirent.h on top of.
2022-10-23 14:03:46 +02:00
cf94ca2a4e
Kernel: Update libk's string.h
2022-10-22 19:06:06 +02:00
437f51add7
Kernel: move over the mem* functions from libc
2022-10-22 19:04:35 +02:00
20429929dd
InitRD: Bump up the filesystem limits
2022-10-22 17:23:22 +02:00
58ca030711
initrd: warn when failing to register stuff
2022-10-22 17:21:34 +02:00