merge branch memory-shit into higher-half

This commit is contained in:
2025-05-10 15:48:10 +03:00
parent 65f543fa92
commit 767e74976f
14 changed files with 419 additions and 178 deletions
+26 -2
View File
@@ -2,6 +2,8 @@
#include "../include/string.h"
#include "../include/paging.h"
struct tss_entry_struct tss;
void bss_init()
{
memset((void *)((int)_edata), 0, KERNEL_BSS_SIZE);
@@ -29,6 +31,16 @@ void load_gdt(uint32_t gdt_ptr) {
);
}
void flush_tss(void) {
asm volatile (
"mov %0, %%ax\n\t"
"ltr %%ax\n\t"
:
: "i" (0x28)
: "ax"
);
}
static void gdt_set_entry(int num, uint32_t base_addr, uint32_t limit, char loflags, char hiflags)
{
num /= sizeof(struct seg_desc);
@@ -44,6 +56,17 @@ void gdt_init(void)
{
uint8_t loflags;
memset(&tss, 0, sizeof(tss));
tss.ss0 = KERNEL_DS;
tss.iomap_base = 0xFFFF; // Disable I/O bitmap
tss.esp0 = 0xC0010000; /* kernel stack address (firstly defined in boot.asm)*/
tss.cs = KERNEL_CS;
tss.ds = KERNEL_DS;
tss.es = KERNEL_DS;
tss.fs = KERNEL_DS;
tss.gs = KERNEL_DS;
tss.ss = KERNEL_DS;
gdt_set_entry(0, 0, 0, 0, 0); /* null descriptor */
loflags = SD_CODE | SD_CD | SD_DPL0 | SD_PRESENT;
@@ -56,8 +79,9 @@ void gdt_init(void)
loflags = SD_DATA | SD_CD | SD_DPL3 | SD_PRESENT;
gdt_set_entry(USER_DS, 0, 0xFFFFFFFF, loflags, SD_OPSIZE32 | SD_PAGE4KB);
loflags = SD_TSSPRESENT;
gdt_set_entry(TSS, 0, sizeof(struct tss_entry_struct), loflags, SD_OPSIZE32);
loflags = 0x89; // P=1, DPL=0, S=0 (system), Type=0x9 (32-bit TSS)
gdt_set_entry(TSS, (uint32_t)&tss, sizeof(struct tss_entry_struct) - 1, SD_PRESENT | SD_DPL0 | SD_TSSPRESENT, 0);
load_gdt((uint32_t)&gdtr);
flush_tss();
}