some test things

This commit is contained in:
2025-05-10 15:48:06 +03:00
parent 7e97987e95
commit b836a37264
5 changed files with 379 additions and 84 deletions
+67
View File
@@ -1,10 +1,77 @@
#include "../include/paging.h"
#include <stdint.h>
#include "../include/multiboot.h"
#include "../include/string.h"
uint32_t kernel_page_directory[1024] __attribute__((aligned(4096)));
uint32_t kernel_page_table[1024] __attribute__((aligned(4096)));
uint32_t user_page_table[1024] __attribute__((aligned(4096)));
#define PAGE_OFFSET 0xC0000000
#define PAGE_SIZE 4096
#define PAGE_PRESENT 0x1
#define PAGE_RW 0x002 /* Read/Write */
#define PAGE_USER 0x004 /* User */
#define PAGE_NOALLOC 0x200 /* No Page Allocated (OS managed) */
#define PAGE_SHIFT 0x0C
#define PAGE_MASK ~(PAGE_SIZE - 1) /* 0xFFFFF000 */
#define GDT_BASE (0xFFFFFFFF - (PAGE_OFFSET - 1))
#define GET_PGDIR(address) ((unsigned int)((address) >> 22) & 0x3FF)
#define GET_PGTBL(address) ((unsigned int)((address) >> 12) & 0x3FF)
#define PAGE_ALIGN(addr) (((addr) + (PAGE_SIZE - 1)) & PAGE_MASK)
unsigned int *kpage_dir;
unsigned int setup_tmp_pgdir(unsigned int magic, unsigned int info)
{
int n, pd;
unsigned int addr, memksize;
unsigned int *pgtbl;
struct multiboot_info *mbi;
if(magic != MULTIBOOT_BOOTLOADER_MAGIC) {
/* 4MB of memory assumed */
memksize = 4096;
} else {
mbi = (struct multiboot_info *)(PAGE_OFFSET + info);
if(!(mbi->flags & MULTIBOOT_INFO_MEMORY)) {
/* 4MB of memory assumed */
memksize = 4096;
} else {
/* we need to add the first 1MB to memksize */
memksize = (unsigned int)mbi->mem_upper + 1024;
/* CONFIG_VM_SPLIT22 marks the maximum physical memory supported */
if(memksize > ((0xFFFFFFFF - PAGE_OFFSET) / 1024)) {
memksize = (0xFFFFFFFF - PAGE_OFFSET) / 1024;
}
}
}
addr = PAGE_OFFSET + (memksize * 1024) - memksize;
addr = PAGE_ALIGN(addr);
kpage_dir = (unsigned int *)addr;
memset(kpage_dir, 0, PAGE_SIZE);
addr += PAGE_SIZE;
pgtbl = (unsigned int *)addr;
memset(pgtbl, 0, memksize);
for(n = 0; n < memksize / sizeof(unsigned int); n++) {
pgtbl[n] = (n << PAGE_SHIFT) | PAGE_PRESENT | PAGE_RW;
if(!(n % 1024)) {
pd = n / 1024;
kpage_dir[pd] = (unsigned int)(addr + (PAGE_SIZE * pd) + GDT_BASE) | PAGE_PRESENT | PAGE_RW;
kpage_dir[GET_PGDIR(PAGE_OFFSET) + pd] = (unsigned int)(addr + (PAGE_SIZE * pd) + GDT_BASE) | PAGE_PRESENT | PAGE_RW;
}
}
return (unsigned int)kpage_dir - PAGE_OFFSET;
}
void enablePaging() {
asm volatile (