void paging_init() { uint32_t memsize = getTotalMem(); nframes = memsize / FRAME_BLOCK_SIZE; pFrames = (uint32_t)malloc(INDEX_BIT(nframes)); memset(pFrames,0,INDEX_BIT(nframes)); kerneldir = (page_dir_t*)malloc_a(sizeof(page_dir_t)); curdir = kerneldir; //You may ask why I didnt use for loop //Because kernel end will change.If I use for lopp dont take effect from kernel //end change.Which can give us unexcepted results int i = 0; while(i < place_addr) { allocFrame(getFrame(i,TRUE,kerneldir),FALSE,FALSE); i += FRAME_BLOCK_SIZE; } //isr_install_interrupt(16,page_handle); paging_changedir(kerneldir); }
void set_nframes(uint32_t n) { nframes = n; if (frames) panic("reallocing frames\n"); frames = (uint32_t *)kmalloc(INDEX_BIT(nframes * 8)); memset(frames, 0, INDEX_BIT(nframes)); uintptr_t p; kernel_dir = kvmalloc_p(sizeof(page_dir_t), &p); printk("mm: frame: kernel_dir at 0x%x\n", kernel_dir); memset(kernel_dir, 0, sizeof(page_dir_t)); }
void set_frame(uintptr_t a) { int f = a / 0x1000; int i = INDEX_BIT(f); int o = OFFSET_BIT(f); frames[i] |= (1 << o); }
int test_frame(uintptr_t a) { int f = a / 0x1000; int i = INDEX_BIT(f); int o = OFFSET_BIT(f); return (frames[i] & (1 << o)); }
void clear_frame(uintptr_t a) { int f = a / 0x1000; int i = INDEX_BIT(f); int o = OFFSET_BIT(f); frames[i] &= ~(1 << o); }
uint32_t mem_used() { uint32_t ret = 0; int i, j; for (i = 0; i < INDEX_BIT(nframes); i++) { for (j = 0; j < 32; j++) { int t = 1 << j; if (frames[i] & t) ret ++; } } return ret * 4; }
uint32_t first_frame() { int i, j; for (i = 0; i < INDEX_BIT(nframes); i++) { if (frames[i] != 0xFFFFFFFF) { for (j = 0; j < 32; j++) { uint32_t test = 1 << j; if (!(frames[i] & test)) return i * 0x20 + j; } } } panic("%s: Out of memory", __func__); /* unreachable */ return 0xFFFFFFFF; }
uint32_t getFirstFrame() { int i; for(i = 0;i < INDEX_BIT(nframes);i++) { if( pFrames[i] != 0xFFFFFFFF) { int j; for(j = 0;j < 32;j++) { int32_t bit = 1 << j; if( !(pFrames[j] & bit)) { return 32*i+j; } } } } return -1; }
int testFrame(uint32_t _addr) { return pFrames[INDEX_BIT(_addr / FRAME_BLOCK_SIZE)] & (1 << OFFSET_BIT(_addr / FRAME_BLOCK_SIZE) ); }
void clearFrame(uint32_t _addr) { pFrames[INDEX_BIT(_addr / FRAME_BLOCK_SIZE)] &= ~(1 << OFFSET_BIT(_addr / FRAME_BLOCK_SIZE)); }
void setFrame(uint32_t _addr) { pFrames[INDEX_BIT(_addr / FRAME_BLOCK_SIZE)] |= 1 << OFFSET_BIT(_addr / FRAME_BLOCK_SIZE); }