/* Based off of code from Leonard Kevin McGuire Jr (www.kmcg3413.net) ([email protected]) http://wiki.osdev.org/User:Pancakes/BitmapHeapImplementation */ void main_heap_init() { kheap_init(&main_heap); for (uint8_t i = 0; i < 15; i++) { void * block = memory_alloc_page(0); kheap_add_block(&main_heap, (uint32_t) block, PAGE_SIZE, 16); } }
int pagetable_map( struct pagetable *p, unsigned vaddr, unsigned paddr, int flags ) { struct pagetable *q; struct pageentry *e; unsigned a = vaddr>>22; unsigned b = (vaddr>>12) & 0x3ff; if(flags&PAGE_FLAG_ALLOC) { paddr = (unsigned) memory_alloc_page(0); if(!paddr) return 0; } e = &p->entry[a]; if(!e->present) { q = pagetable_create(); if(!q) return 0; e->present = 1; e->readwrite = 1; e->user = (flags&PAGE_FLAG_KERNEL) ? 0 : 1; e->writethrough = 0; e->nocache = 0; e->accessed = 0; e->dirty = 0; e->pagesize = 0; e->globalpage = (flags&PAGE_FLAG_KERNEL) ? 1 : 0; e->avail = 0; e->addr = (((unsigned)q) >> 12); } else {
void memory_init() { int i; pages_total = (total_memory * 1024) / (PAGE_SIZE / 1024); pages_free = pages_total; console_printf("memory: %d MB (%d KB) total\n", (pages_free * PAGE_SIZE) / MEGA, (pages_free * PAGE_SIZE) / KILO); freemap = alloc_memory_start; freemap_bits = pages_total; freemap_bytes = 1 + freemap_bits / 8; freemap_cells = 1 + freemap_bits / CELL_BITS; freemap_pages = 1 + freemap_bytes / PAGE_SIZE; console_printf("memory: %d bits %d bytes %d cells %d pages\n", freemap_bits, freemap_bytes, freemap_cells, freemap_pages); memset(freemap, 0xff, freemap_bytes); for (i = 0; i < freemap_pages; i++) { memory_alloc_page(0); } // This is ahack that I don't understand yet. // vmware doesn't like the use of a particular page // close to 1MB, but what it is used for I don't know. freemap[0] = 0x0; console_printf("memory: %d MB (%d KB) available\n", (pages_free * PAGE_SIZE) / MEGA, (pages_free * PAGE_SIZE) / KILO); }
void memory_init() { int i; memory_detect_map(); pages_total = (total_memory * 1024) / (PAGE_SIZE / 1024); pages_free = pages_total; console_printf("memory: %d MB (%d KB) total\n", (pages_free * PAGE_SIZE) / MEGA, (pages_free * PAGE_SIZE) / KILO); // Freemap is organized as follows // Each page is represented as one bit // Each cell in the freemap is 32 bits, representing 32 pages freemap = alloc_memory_start; freemap_bits = pages_total; freemap_bytes = 1 + freemap_bits / 8; freemap_cells = 1 + freemap_bits / CELL_BITS; freemap_pages = 1 + freemap_bytes / PAGE_SIZE; console_printf("memory: %d bits %d bytes %d cells %d pages\n", freemap_bits, freemap_bytes, freemap_cells, freemap_pages); memset(freemap, 0xff, freemap_bytes); for (i = 0; i < freemap_pages; i++) { memory_alloc_page(0); } // This is ahack that I don't understand yet. // vmware doesn't like the use of a particular page // close to 1MB, but what it is used for I don't know. freemap[0] = 0x0; // VirtualBox doesn't like memory address 0x1A0000 through 0x1C0000 // so block it off freemap[5] = 0x0; console_printf("memory: %d MB (%d KB) available\n", (pages_free * PAGE_SIZE) / MEGA, (pages_free * PAGE_SIZE) / KILO); }
struct pagetable * pagetable_create() { return memory_alloc_page(1); }