Beispiel #1
0
/*
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);
	}
}
Beispiel #2
0
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 {
Beispiel #3
0
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);
}
Beispiel #4
0
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);
}
Beispiel #5
0
struct pagetable * pagetable_create()
{
	return memory_alloc_page(1);
}