3 Commits

Author SHA1 Message Date
4fbd9b3987 minor fix 2026-02-06 21:44:51 +01:00
8aad1235c3 A bit of cleaning 2026-02-06 14:39:19 +01:00
38710653be Config header file + comment header 2026-02-06 13:59:46 +01:00
35 changed files with 286 additions and 78 deletions

View File

@@ -1,4 +1,4 @@
SOURCES = src/sched/scheduler.c src/sched/process.c src/mem/heap/kheap.c src/mem/paging/vmm.c src/mem/paging/paging.c src/mem/paging/pmm.c src/string/string.c src/io/kbd/ps2.c src/io/serial/serial.c src/io/term/printf.c src/io/term/term.c src/idt/idt.c src/mem/gdt/gdt.c src/mem/misc/utils.c src/time/timer.c src/kmain.c
SOURCES = src/boot/boot.c src/sched/scheduler.c src/sched/process.c src/mem/heap/kheap.c src/mem/paging/vmm.c src/mem/paging/paging.c src/mem/paging/pmm.c src/string/string.c src/io/kbd/ps2.c src/io/serial/serial.c src/io/term/printf.c src/io/term/term.c src/idt/idt.c src/mem/gdt/gdt.c src/mem/misc/utils.c src/time/timer.c src/kmain.c
PROBLEMATIC_FLAGS=-Wno-unused-parameter -Wno-unused-variable

View File

@@ -14,7 +14,7 @@ The basics that I'm targeting are:
### Basic utility of what we call a "kernel"
- Fix terminal driver (backspace issues, scrolling) OR add Flanterm or equivalent
- Implement tasks, and task switching
- Implement tasks, and task switching + context switching and spinlock acquire/release
- Load an executable
- Filesystem (TAR for read-only initfs, then maybe read-write using FAT12/16/32 or easier fs) w/ VFS layer
- Getting to userspace (syscalls)
@@ -22,7 +22,6 @@ The basics that I'm targeting are:
### Scalability/maintenance/expansion features
- Global config header file
- Documentation
- SOME error handling in functions
- Unit tests

41
src/boot/boot.c Normal file
View File

@@ -0,0 +1,41 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Limine requests for boot
* @license GPL-3.0-only
*/
#include <limine.h>
// Framebuffer request
__attribute__((used, section(".limine_requests")))
volatile struct limine_framebuffer_request framebuffer_request = {
.id = LIMINE_FRAMEBUFFER_REQUEST,
.revision = 0
};
// Memory map request
__attribute__((used, section(".limine_requests")))
volatile struct limine_memmap_request memmap_request = {
.id = LIMINE_MEMMAP_REQUEST,
.revision = 0
};
// Higher Half Direct Map
__attribute__((used, section(".limine_requests")))
volatile struct limine_hhdm_request hhdm_request = {
.id = LIMINE_HHDM_REQUEST,
.revision = 0
};
// Executable Address/Kernel Address (find base phys/virt address of kernel)
__attribute__((used, section(".limine_requests")))
volatile struct limine_kernel_address_request kerneladdr_request = {
.id = LIMINE_KERNEL_ADDRESS_REQUEST,
.revision = 0
};
__attribute__((used, section(".limine_requests_start")))
volatile LIMINE_REQUESTS_START_MARKER;
__attribute__((used, section(".limine_requests_end")))
volatile LIMINE_REQUESTS_END_MARKER;

35
src/config.h Normal file
View File

@@ -0,0 +1,35 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief PepperOS configuration file
* @license GPL-3.0-only
*/
#ifndef CONFIG_H
#define CONFIG_H
/* version */
#define PEPPEROS_VERSION_MAJOR "0"
#define PEPPEROS_VERSION_MINOR "0"
#define PEPPEROS_VERSION_PATCH "1"
#define PEPPEROS_SPLASH "pepperOS version "PEPPEROS_VERSION_MAJOR"."PEPPEROS_VERSION_MINOR"."PEPPEROS_VERSION_PATCH"\n"
/* process */
#define PROCESS_NAME_MAX 64
#define PROCESS_STACK_SIZE 0x10000 // 64kb
/* sched */
// 1 tick = 1 ms => quantum = 10ms
#define SCHEDULER_QUANTUM 10
/* kernel */
#define KERNEL_BASE 0xFFFFFFFF80000000ULL
// 2 MB should be enough (as of now, the whole kernel ELF is around 75kb)
#define KERNEL_SIZE 0x200000
/* heap */
#define KHEAP_SIZE (16*1024*1024)
/* term */
#define TERM_HISTORY_MAX_LINES 256
#endif

View File

@@ -1,4 +1,8 @@
; Assembly stub for the IDT
;
; @author xamidev <xamidev@riseup.net>
; @brief Stub for Interrupt Descriptor Table handlers
; @license GPL-3.0-only
;
bits 64

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Interrupt Descriptor Table setup and dispatching
* @license GPL-3.0-only
*/
#include "idt.h"
#include <stdint.h>
#include <stddef.h>
@@ -6,6 +12,7 @@
#include <kernel.h>
#include <stdbool.h>
#include "sched/scheduler.h"
#include "config.h"
struct interrupt_descriptor idt[256];
struct idtr idt_reg;
@@ -185,8 +192,7 @@ struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context)
DEBUG("Control Protection Exception!");
break;
case 32:
//DEBUG("Timer Interrupt");
case 32: // Timer Interrupt
ticks++;
if (ticks % SCHEDULER_QUANTUM == 0)

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Interrupt Descriptor Table setup and dispatching
* @license GPL-3.0-only
*/
#ifndef IDT_H
#define IDT_H

View File

@@ -1,4 +1,8 @@
// PS/2 Keyboard support
/*
* @author xamidev <xamidev@riseup.net>
* @brief PS/2 Keyboard driver
* @license GPL-3.0-only
*/
#include "io/serial/serial.h"
#include "ps2.h"

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief PS/2 Keyboard driver
* @license GPL-3.0-only
*/
#ifndef PS2_H
#define PS2_H

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Debug serial driver
* @license GPL-3.0-only
*/
#include <kernel.h>
#include "serial.h"

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Debug serial driver
* @license GPL-3.0-only
*/
#ifndef SERIAL_H
#define SERIAL_H

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Framebuffer-based terminal driver
* @license GPL-3.0-only
*/
// Terminal output
/*
There are a couple of bugs here and there but for now I don't care too much
@@ -10,6 +16,7 @@ because this shitty implementation will be replaced one day by Flanterm
#include <kernel.h>
#include "term.h"
#include "mem/misc/utils.h"
#include "config.h"
extern struct boot_context boot_ctx;
@@ -37,7 +44,7 @@ static Cursor cursor = {0, 0};
static uint8_t* fb;
static struct limine_framebuffer* framebuffer;
uint8_t lines_length[MAX_LINES];
uint8_t lines_length[TERM_HISTORY_MAX_LINES];
static inline size_t term_max_cols(void)
{

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Framebuffer-based terminal driver
* @license GPL-3.0-only
*/
#ifndef TERM_H
#define TERM_H
@@ -11,8 +17,6 @@ enum TermColors
WHITE = 0xffffff
};
#define MAX_LINES 256
#define PSF1_FONT_MAGIC 0x0436
typedef struct

View File

@@ -1,10 +1,12 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Kernel global macros
* @license GPL-3.0-only
*/
#ifndef KERNEL_H
#define KERNEL_H
#define PEPPEROS_VERSION_MAJOR "0"
#define PEPPEROS_VERSION_MINOR "0"
#define PEPPEROS_VERSION_PATCH "1"
enum ErrorCodes
{
ENOMEM,
@@ -36,7 +38,4 @@ struct boot_context
struct limine_kernel_address_response* kaddr;
};
// 1 tick = 1 ms => quantum = 10ms
#define SCHEDULER_QUANTUM 10
#endif

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief PepperOS kernel entry point
* @license GPL-3.0-only
*/
#include <stdbool.h>
#include <stddef.h>
#include <limine.h>
@@ -16,55 +22,21 @@
#include "mem/heap/kheap.h"
#include "sched/process.h"
#include "sched/scheduler.h"
#include "config.h"
// Limine version used
__attribute__((used, section(".limine_requests")))
static volatile LIMINE_BASE_REVISION(3);
volatile LIMINE_BASE_REVISION(3);
// Framebuffer request
__attribute__((used, section(".limine_requests")))
static volatile struct limine_framebuffer_request framebuffer_request = {
.id = LIMINE_FRAMEBUFFER_REQUEST,
.revision = 0
};
// Memory map request
__attribute__((used, section(".limine_requests")))
static volatile struct limine_memmap_request memmap_request = {
.id = LIMINE_MEMMAP_REQUEST,
.revision = 0
};
// Higher Half Direct Map
__attribute__((used, section(".limine_requests")))
static volatile struct limine_hhdm_request hhdm_request = {
.id = LIMINE_HHDM_REQUEST,
.revision = 0
};
// Executable Address/Kernel Address (find base phys/virt address of kernel)
__attribute__((used, section(".limine_requests")))
static volatile struct limine_kernel_address_request kerneladdr_request = {
.id = LIMINE_KERNEL_ADDRESS_REQUEST,
.revision = 0
};
__attribute__((used, section(".limine_requests_start")))
static volatile LIMINE_REQUESTS_START_MARKER;
__attribute__((used, section(".limine_requests_end")))
static volatile LIMINE_REQUESTS_END_MARKER;
// Panic (should dump registers etc. in the future)
// Halt and catch fire (makes machine stall)
void hcf()
{
//CLEAR_INTERRUPTS;
for (;;)
{
asm("hlt");
}
CLEAR_INTERRUPTS; for (;;)asm("hlt");
}
// Doing nothing (can be interrupted)
void idle() {for(;;)asm("hlt");}
void panic(struct cpu_status_t* ctx)
{
DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m at rip=%p\nSomething went horribly wrong! vect=0x%.2x errcode=0x%x\n\rrax=%p rbx=%p rcx=%p rdx=%p\n\rrsi=%p rdi=%p r8=%p r9=%p\n\rr10=%p r11=%p r12=%p r13=%p\n\rr14=%p r15=%p\n\n\rflags=%p\n\rstack at rbp=%p\n\rHalting...",
@@ -75,10 +47,13 @@ void panic(struct cpu_status_t* ctx)
hcf();
}
const char* splash = "pepperOS version "PEPPEROS_VERSION_MAJOR"."PEPPEROS_VERSION_MINOR"."PEPPEROS_VERSION_PATCH"\n";
struct boot_context boot_ctx;
extern volatile struct limine_framebuffer_request framebuffer_request;
extern volatile struct limine_memmap_request memmap_request;
extern volatile struct limine_hhdm_request hhdm_request;
extern volatile struct limine_kernel_address_request kerneladdr_request;
extern struct process_t* processes_list;
extern struct process_t* current_process;
@@ -139,7 +114,7 @@ void kmain()
keyboard_init(FR);
term_init();
kputs(splash);
kputs(PEPPEROS_SPLASH);
hcf();
idle();
}

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Global Descriptor Table (for legacy reasons)
* @license GPL-3.0-only
*/
#include "gdt.h"
#include <stdint.h>
#include "io/serial/serial.h"

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Global Descriptor Table (for legacy reasons)
* @license GPL-3.0-only
*/
#ifndef GDT_H
#define GDT_H

View File

@@ -1,9 +1,16 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Kernel heap
* @license GPL-3.0-only
*/
#include "kheap.h"
#include "mem/paging/paging.h"
#include "mem/paging/pmm.h"
#include <stddef.h>
#include <kernel.h>
#include "sched/process.h"
#include "config.h"
extern uint64_t kernel_phys_base;
extern uint64_t kernel_virt_base;

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Kernel heap
* @license GPL-3.0-only
*/
#ifndef KHEAP_H
#define KHEAP_H
@@ -6,9 +12,6 @@
// When the kernel heap is ready, we can alloc our VM object linked list
// and then continue working on the VMM.
// 16MB should be enough for some linked lists
#define KHEAP_SIZE (16*1024*1024)
#include <stdbool.h>
#include <stddef.h>

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Common memory utilities
* @license GPL-3.0-only
*/
#include <stddef.h>
#include <stdint.h>
#include <limine.h>

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Common memory utilities
* @license GPL-3.0-only
*/
#ifndef MEM_UTILS_H
#define MEM_UTILS_H
@@ -8,6 +14,7 @@ void* memset(void* s, int c, size_t n);
void* memmove(void *dest, const void* src, size_t n);
int memcmp(const void* s1, const void* s2, size_t n);
// DEBUG
void memmap_display(struct limine_memmap_response* response);
void hhdm_display(struct limine_hhdm_response* hhdm);

View File

@@ -1,8 +1,15 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief x64 4-level paging implementation
* @license GPL-3.0-only
*/
#include "paging.h"
#include "pmm.h"
#include <kernel.h>
#include <stddef.h>
#include <limine.h>
#include "config.h"
/*
Paging on x86 uses four different page table levels:

View File

@@ -1,8 +1,13 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief x64 4-level paging implementation
* @license GPL-3.0-only
*/
#ifndef PAGING_H
#define PAGING_H
#define PAGE_SIZE 4096
#define BITS_PER_ROW 64
#include <stdint.h>
#include <limine.h>
@@ -40,10 +45,4 @@ extern uint64_t hhdm_off;
#define PTE_HUGE (1ULL << 7)
#define PTE_NOEXEC (1ULL << 63)
// Specified in linker.ld
#define KERNEL_BASE 0xFFFFFFFF80000000ULL
// 2 MB should be enough (as of now, the whole kernel ELF is around 75kb)
#define KERNEL_SIZE 0x200000
#endif

View File

@@ -1,4 +1,8 @@
// OMG here we are. I'm cooked.
/*
* @author xamidev <xamidev@riseup.net>
* @brief Physical memory manager from freelist
* @license GPL-3.0-only
*/
/*
pmm - Physical Memory Manager

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Physical memory manager from freelist
* @license GPL-3.0-only
*/
#ifndef PAGING_PMM_H
#define PAGING_PMM_H

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Virtual memory manager
* @license GPL-3.0-only
*/
/*
The VMM (virtual memory manager) will have two roles:
- mapping pages

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Virtual memory manager
* @license GPL-3.0-only
*/
#ifndef VMM_H
#define VMM_H

View File

@@ -1,9 +1,16 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Process linked list implementation
* @license GPL-3.0-only
*/
#include <stddef.h>
#include "process.h"
#include "mem/heap/kheap.h"
#include "kernel.h"
#include "string/string.h"
#include "mem/gdt/gdt.h"
#include "config.h"
struct process_t* processes_list;
struct process_t* current_process;

View File

@@ -1,7 +1,14 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Process definition
* @license GPL-3.0-only
*/
#ifndef PROCESS_H
#define PROCESS_H
#include <stddef.h>
#include "config.h"
typedef enum
{
@@ -10,9 +17,6 @@ typedef enum
DEAD
} status_t;
#define PROCESS_NAME_MAX 64
#define PROCESS_STACK_SIZE 0x10000 // 64kb
struct process_t
{
size_t pid;
@@ -31,4 +35,4 @@ struct process_t* process_get_next(struct process_t* process);
void process_display_list(struct process_t* processes_list);
#endif
#endif

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Round-robin scheduler
* @license GPL-3.0-only
*/
#include "kernel.h"
#include "process.h"
@@ -35,6 +41,6 @@ struct cpu_status_t* scheduler_schedule(struct cpu_status_t* context)
}
}
DEBUG("SCHEDULER CALLED: current_process=%p", current_process);
DEBUG("current_process={pid=%u name='%s'}", current_process->pid, current_process->name);
return current_process->context;
}

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Round-robin scheduler
* @license GPL-3.0-only
*/
#ifndef SCHEDULER_H
#define SCHEDULER_H

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief String manipulation utilities
* @license GPL-3.0-only
*/
#include <stddef.h>
char* strcpy(char *dest, const char *src)

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief String manipulation functions
* @license GPL-3.0-only
*/
#ifndef STRING_H
#define STRING_H

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief Programmable Interval Timer init and enabling
* @license GPL-3.0-only
*/
#include <stdint.h>
#include "io/serial/serial.h"
#include <kernel.h>

View File

@@ -1,3 +1,9 @@
/*
* @author xamidev <xamidev@riseup.net>
* @brief PIT functions
* @license GPL-3.0-only
*/
#ifndef TIMER_H
#define TIMER_H