#include "paging.h" #include "libc/stdio.h" #include "libc/math.h" /// Use a bitmap to keep track of allocated pages char pages_status[PAGING_MAX_PAGES/8]; /// Kernel page directory (ATTENTION need to be 4096) u32 k_pd[PAGING_MAX_DIR_ENTRY] __attribute__((aligned(4096))); /// Kernel page table u32 k_pt[PAGING_MAX_DIR_ENTRY][1024] __attribute__((aligned(4096))); void paging_enable(){ // Init pages status for(int i=0;i>j)&0x1; if((i*8+j)>=min){ if((i*8+j)>j)&1; if(state!=1){ int page_id=i*8+j; int page_addr=PAGING_PAGE_SIZE*page_id; paging_set_usage(page_addr,1); return((char*)page_addr); } } } print("Could not allocate anymore pages! Stopping..."); asm("hlt"); } int *paging_allocate(int p){ // ----- Populate kernel adresses (to be able to execute interrupts codes) int *page_dir=(int*)paging_allocate_next_page(); int *k_page_table=(int*)paging_allocate_next_page(); // Kernel is located in the first 4Mb (page dir entry 0) page_dir[0]=(int)k_page_table|3; int addr_offset=0; for(int i=0;i<1024;i++){ k_page_table[i]=addr_offset; k_page_table[i]|=3; // Permissions addr_offset+=PAGING_PAGE_SIZE; // 4Ko pages } // ----- Populate task adresses int *u_page_table=(int)paging_allocate_next_page(); page_dir[1]=(int)u_page_table|7; int dir_entry=1; // Entry point is at 1024*4096=4194304 (page dir entry 1 and page table entry 0) int pt_entry=0; int p_current=max(1,p); // Allocate at least 1 page p_current++; // Allocated one more page for the kernel stack (one per task) while(p_current!=0){ u_page_table[pt_entry]=(int)paging_allocate_next_page(); if(p_current==1) // Kernel stack is the last page u_page_table[pt_entry]|=3; else u_page_table[pt_entry]|=7; p_current--; pt_entry++; if(pt_entry%1024==0){ dir_entry++; pt_entry=0; u_page_table=(int*)paging_allocate_next_page(); page_dir[dir_entry]=(int)u_page_table; if(p_current==1) // Kernel stack is the last page (and might be in the last page directory entry) page_dir[dir_entry]|=3; else page_dir[dir_entry]|=7; } } return page_dir; } void paging_page_fault(){ print("Page fault!"); asm("hlt"); }