merge branch memory-shit into higher-half
This commit is contained in:
+67
-48
@@ -10,56 +10,51 @@ uint32_t *kpage_dir;
|
||||
|
||||
uint32_t setup_tmp_pgdir(uint32_t magic, uint32_t info)
|
||||
{
|
||||
int n, pd;
|
||||
uint32_t pagedir_address, memksize;
|
||||
uint32_t *page_table;
|
||||
struct multiboot_info *mbi;
|
||||
int n, pd;
|
||||
uint32_t pagedir_address, memksize;
|
||||
uint32_t *page_table;
|
||||
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 = (uint32_t)mbi->mem_upper + 1024;
|
||||
if(memksize > ((0xFFFFFFFF - PAGE_OFFSET) / 1024)) {
|
||||
memksize = (0xFFFFFFFF - PAGE_OFFSET) / 1024;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(magic != MULTIBOOT_BOOTLOADER_MAGIC) {
|
||||
memksize = 4096;
|
||||
} else {
|
||||
mbi = (struct multiboot_info *)(PAGE_OFFSET + info);
|
||||
if(!(mbi->flags & MULTIBOOT_INFO_MEMORY)) {
|
||||
memksize = 4096;
|
||||
} else {
|
||||
memksize = (uint32_t)mbi->mem_upper + 1024;
|
||||
if(memksize > ((0xFFFFFFFF - PAGE_OFFSET) / 1024)) {
|
||||
memksize = (0xFFFFFFFF - PAGE_OFFSET) / 1024;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* address becomes PAGE_OFFSET (0xC0000000) plus the size of memory minus the first page */
|
||||
/* TODO: check if I wrote the comment above correctly*/
|
||||
pagedir_address = PAGE_OFFSET + (memksize * 1024) - memksize;
|
||||
pagedir_address = PAGE_ALIGN(pagedir_address);
|
||||
/* Address is PAGE_OFFSET plus memory size minus 4KB */
|
||||
pagedir_address = PAGE_OFFSET + (memksize * 1024) - 4096;
|
||||
pagedir_address = PAGE_ALIGN(pagedir_address);
|
||||
|
||||
/*
|
||||
memory pages:
|
||||
0 -> page directory
|
||||
1 -> page table
|
||||
*/
|
||||
kpage_dir = (uint32_t *)pagedir_address;
|
||||
memset(kpage_dir, 0, PAGE_SIZE);
|
||||
kpage_dir = (uint32_t *)pagedir_address;
|
||||
memset(kpage_dir, 0, PAGE_SIZE);
|
||||
|
||||
pagedir_address += PAGE_SIZE;
|
||||
page_table = (uint32_t *)pagedir_address;
|
||||
memset(page_table, 0, memksize);
|
||||
pagedir_address += PAGE_SIZE;
|
||||
page_table = (uint32_t *)pagedir_address;
|
||||
memset(page_table, 0, memksize);
|
||||
|
||||
/* if we have 4MB assumed earlier, the memksize will be 4096 and this loop will run while n < 1024 */
|
||||
/* so basically 4MB is 1024 pages */
|
||||
for(n = 0; n < memksize / sizeof(uint32_t); n++) {
|
||||
page_table[n] = (n << PAGE_SHIFT) | PAGE_PRESENT | PAGE_RW;
|
||||
if(!(n % 1024)) {
|
||||
pd = n / 1024;
|
||||
kpage_dir[pd] = (uint32_t)(pagedir_address + (PAGE_SIZE * pd) + GDT_BASE) | PAGE_PRESENT | PAGE_RW;
|
||||
kpage_dir[GET_PGDIR(PAGE_OFFSET) + pd] = (uint32_t)(pagedir_address + (PAGE_SIZE * pd) + GDT_BASE) | PAGE_PRESENT | PAGE_RW;
|
||||
}
|
||||
}
|
||||
return (uint32_t)kpage_dir - PAGE_OFFSET;
|
||||
for(n = 0; n < memksize / sizeof(uint32_t); n++) {
|
||||
page_table[n] = (n << PAGE_SHIFT) | PAGE_PRESENT | PAGE_RW;
|
||||
if(!(n % 1024)) {
|
||||
pd = n / 1024;
|
||||
uint32_t pt_phys = (uint32_t)page_table - PAGE_OFFSET + (PAGE_SIZE * pd);
|
||||
kpage_dir[pd] = pt_phys | PAGE_PRESENT | PAGE_RW | PAGE_USER;//TODO: fix, I don't think pd should have DPL3
|
||||
kpage_dir[GET_PGDIR(PAGE_OFFSET) + pd] = pt_phys | PAGE_PRESENT | PAGE_RW | PAGE_USER;//TODO: fix, I don't think pd should have DPL3
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t pd_phys = (uint32_t)kpage_dir - PAGE_OFFSET;
|
||||
kpage_dir[1023] = pd_phys | PAGE_PRESENT | PAGE_RW; // Recursive mapping
|
||||
|
||||
|
||||
return (uint32_t)kpage_dir - PAGE_OFFSET;
|
||||
}
|
||||
|
||||
void grub_memory_map(unsigned int magic, struct multiboot_info* mbi)
|
||||
@@ -79,16 +74,40 @@ void grub_memory_map(unsigned int magic, struct multiboot_info* mbi)
|
||||
(multiboot_memory_map_t*) (mbi->mmap_addr + i);
|
||||
|
||||
printf("Start Addr: %x | Length: %x | Size: %x | Type: %x\n",
|
||||
mmmt->addr, mmmt->len, mmmt->size, mmmt->type);
|
||||
mmmt->addr_low, mmmt->len_low, mmmt->size, mmmt->type);
|
||||
|
||||
if(mmmt->type == MULTIBOOT_MEMORY_AVAILABLE) {
|
||||
if(mmmt->type != MULTIBOOT_MEMORY_AVAILABLE) {
|
||||
/*
|
||||
* Do something with this memory block!
|
||||
* BE WARNED that some of memory shown as availiable is actually
|
||||
* actively being used by the kernel! You'll need to take that
|
||||
* into account before writing to memory!
|
||||
*/
|
||||
printf("available\n");
|
||||
printf("not available\n");
|
||||
uint32_t size_in_pages = mmmt->len_low / PAGE_SIZE;
|
||||
printf("size_in_pages: 0x%X\n", size_in_pages);
|
||||
|
||||
uint32_t base_page = mmmt->addr_low / PAGE_SIZE;
|
||||
uint32_t page_count = mmmt->len_low / PAGE_SIZE;
|
||||
printf("page_base: %X, page_count: %X\n", base_page, page_count);
|
||||
for (uint32_t j = 0; j < page_count; j++) {
|
||||
set_bit(base_page + j);
|
||||
}
|
||||
}
|
||||
}
|
||||
extern uint32_t _start, _end; // From linker script
|
||||
uint32_t kernel_start_phys = (uint32_t)&_start - 0xC0000000;
|
||||
uint32_t kernel_end_phys = (uint32_t)&_end - 0xC0000000;
|
||||
uint32_t kernel_start_page = kernel_start_phys / PAGE_SIZE;
|
||||
uint32_t kernel_end_page = (kernel_end_phys + PAGE_SIZE - 1) / PAGE_SIZE;
|
||||
printf("Kernel phys range: 0x%X to 0x%X, pages: 0x%X to 0x%X\n",
|
||||
kernel_start_phys, kernel_end_phys, kernel_start_page, kernel_end_page);
|
||||
|
||||
for (uint32_t i = kernel_start_page; i < kernel_end_page; i++) {
|
||||
if (i < BITMAP_SIZE) {
|
||||
set_bit(i);
|
||||
} else {
|
||||
printf("Bitmap overflow at kernel page %u\n", i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user