organization

This commit is contained in:
2025-05-10 15:48:10 +03:00
parent 00c9560660
commit 0bf26a6c70
7 changed files with 158 additions and 221 deletions
+13 -121
View File
@@ -1,36 +1,16 @@
//#include "../include/gdt.h"
#include <stdint.h>
#include "../include/gdt.h"
#include "../include/string.h"
#include "../include/paging.h"
struct desc_r {
uint16_t limit;
uint32_t base_addr;
} __attribute__((packed));
struct seg_desc {
unsigned sd_lolimit : 16; /* segment limit 0-15 bits */
unsigned sd_lobase : 24; /* base address 0-23 bits */
unsigned sd_loflags : 8; /* flags (P, DPL, S and TYPE) */
unsigned sd_hilimit : 4; /* segment limit 16-19 bits */
unsigned sd_hiflags : 4; /* flags (G, DB, 0 and AVL) */
unsigned sd_hibase : 8; /* base address 24-31 bits */
} __attribute__((packed));
struct gate_desc {
unsigned gd_looffset: 16; /* offset 0-15 bits */
unsigned gd_selector: 16; /* segment selector */
unsigned gd_flags : 16; /* flags (P, DPL, TYPE, 0 and NULL) */
unsigned gd_hioffset: 16; /* offset 16-31 bits */
} __attribute__((packed));
extern char _end[], _edata[];
#define KERNEL_CS 0x08 /* kernel code segment */
#define KERNEL_DS 0x10 /* kernel data segment */
#define USER_CS 0x18 /* user code segment */
#define USER_DS 0x20 /* user data segment */
#define TSS 0x28 /* TSS segment */
void bss_init()
{
memset((void *)((int)_edata), 0, KERNEL_BSS_SIZE);
}
uint32_t get_last_boot_addr()
{
return ((uint32_t)_end & PAGE_MASK) + PAGE_SIZE;
}
void load_gdt(uint32_t gdt_ptr) {
asm volatile (
@@ -49,95 +29,7 @@ void load_gdt(uint32_t gdt_ptr) {
);
}
#define PAGE_SIZE 4096
#define PAGE_SHIFT 0x0C
#define PAGE_MASK ~(PAGE_SIZE - 1) /* 0xFFFFF000 */
#define PAGE_ALIGN(addr) (((addr) + (PAGE_SIZE - 1)) & PAGE_MASK)
#define KERNEL_BSS_SIZE ((int)_end - (int)_edata)
#define NR_GDT_ENTRIES 6 /* entries in GDT descriptor */
#define NR_IDT_ENTRIES 256 /* entries in IDT descriptor */
/* low flags of Segment Descriptors */
#define SD_CODE 0x0A /* CODE Exec/Read */
#define SD_DATA 0x02 /* DATA Read/Write */
#define SD_32INTRGATE 0x0E /* 32-bit Interrupt Gate (0D110) */
#define SD_32TRAPGATE 0x0F /* 32-bit Trap Gate (0D111) */
#define SD_CD 0x10 /* 0 = system / 1 = code/data */
#define SD_DPL0 0x00 /* priority level 0 (kernel) */
#define SD_DPL3 0x60 /* priority level 3 (user) */
#define SD_PRESENT 0x80 /* segment present or valid */
/* high flags Segment Descriptors */
#define SD_OPSIZE32 0x04 /* 32-bit code and data segments */
#define SD_PAGE4KB 0x08 /* page granularity (4KB) */
/* low flags of the TSS Descriptors */
#define SD_TSSPRESENT 0x89 /* TSS present and not busy flag */
/* EFLAGS */
#define EF_IOPL 12 /* IOPL bit */
#define KERNEL_CS 0x08 /* kernel code segment */
#define KERNEL_DS 0x10 /* kernel data segment */
#define USER_CS 0x18 /* user code segment */
#define USER_DS 0x20 /* user data segment */
#define TSS 0x28 /* TSS segment */
struct tss_entry_struct {
uint32_t prev_tss; // The previous TSS - with hardware task switching these form a kind of backward linked list.
uint32_t esp0; // The stack pointer to load when changing to kernel mode.
uint32_t ss0; // The stack segment to load when changing to kernel mode.
// Everything below here is unused.
uint32_t esp1; // esp and ss 1 and 2 would be used when switching to rings 1 or 2.
uint32_t ss1;
uint32_t esp2;
uint32_t ss2;
uint32_t cr3;
uint32_t eip;
uint32_t eflags;
uint32_t eax;
uint32_t ecx;
uint32_t edx;
uint32_t ebx;
uint32_t esp;
uint32_t ebp;
uint32_t esi;
uint32_t edi;
uint32_t es;
uint32_t cs;
uint32_t ss;
uint32_t ds;
uint32_t fs;
uint32_t gs;
uint32_t ldt;
uint16_t trap;
uint16_t iomap_base;
} __packed;
void bss_init()
{
memset((void *)((int)_edata), 0, KERNEL_BSS_SIZE);
}
uint32_t get_last_boot_addr()
{
return ((unsigned int)_end & PAGE_MASK) + PAGE_SIZE;
}
struct seg_desc gdt[NR_GDT_ENTRIES];
struct desc_r gdtr = {
sizeof(gdt) - 1,
(unsigned int)&gdt
};
static void gdt_set_entry(int num, unsigned int base_addr, unsigned int limit, char loflags, char hiflags)
static void gdt_set_entry(int num, uint32_t base_addr, uint32_t limit, char loflags, char hiflags)
{
num /= sizeof(struct seg_desc);
gdt[num].sd_lolimit = limit & 0xFFFF;
@@ -150,7 +42,7 @@ static void gdt_set_entry(int num, unsigned int base_addr, unsigned int limit, c
void gdt_init(void)
{
unsigned char loflags;
uint8_t loflags;
gdt_set_entry(0, 0, 0, 0, 0); /* null descriptor */
@@ -167,5 +59,5 @@ void gdt_init(void)
loflags = SD_TSSPRESENT;
gdt_set_entry(TSS, 0, sizeof(struct tss_entry_struct), loflags, SD_OPSIZE32);
load_gdt((unsigned int)&gdtr);
load_gdt((uint32_t)&gdtr);
}
+3 -3
View File
@@ -155,9 +155,9 @@ void kmain(unsigned int magic, unsigned int info)
apply_pic_masks();
paging_init();
printf("paging_init done\n");
test_paging();
//paging_init();
//printf("paging_init done\n");
//test_paging();
init_allocator();
heap_init();
printf("after heap_init\n");