Example #1
0
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);
}
Example #2
0
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));
}
Example #3
0
void set_frame(uintptr_t a)
{
    int f = a / 0x1000;
    int i = INDEX_BIT(f);
    int o = OFFSET_BIT(f);
    frames[i] |= (1 << o);
}
Example #4
0
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));
}
Example #5
0
void clear_frame(uintptr_t a)
{
    int f = a / 0x1000;
    int i = INDEX_BIT(f);
    int o = OFFSET_BIT(f);

    frames[i] &= ~(1 << o);
}
Example #6
0
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;
}
Example #7
0
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;
}
Example #8
0
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;
}
Example #9
0
int testFrame(uint32_t _addr)
{
	return pFrames[INDEX_BIT(_addr / FRAME_BLOCK_SIZE)] & (1 << OFFSET_BIT(_addr / FRAME_BLOCK_SIZE) );
}
Example #10
0
void clearFrame(uint32_t _addr)
{
	pFrames[INDEX_BIT(_addr / FRAME_BLOCK_SIZE)] &= ~(1 << OFFSET_BIT(_addr / FRAME_BLOCK_SIZE));
}
Example #11
0
void setFrame(uint32_t _addr)
{
	pFrames[INDEX_BIT(_addr / FRAME_BLOCK_SIZE)] |= 1 << OFFSET_BIT(_addr / FRAME_BLOCK_SIZE);
}