Пример #1
0
void *mkPageDir()
{
	void *ret = 0;
	uint32_t KernelPageTable = (0xC0000000 / 0x400000);
	uint32_t KernelVirtPageTableAddr = (0xF0001000 + (0x1000 * KernelPageTable));
	Paging_p NewDIR = (Paging_p)_VMM_malloc(0xC0000000, 1, FALSE, TRUE);
	memset(NewDIR, 0, 0x1000);
	NewDIR->entry[0x300] = ((uint32_t) getPhysical(KernelVirtPageTableAddr) | 3);
	NewDIR->entry[0] = ((uint32_t) getPhysical(0xF0001000) | 3);
	Paging_p NewDirEntList = (Paging_p) _VMM_malloc(0xC0001000, 1, FALSE, TRUE);
	memset(NewDirEntList, 0, 0x1000);
	NewDIR->entry[0x3C0] = ((uint32_t) getPhysical(0xC0001000) | 3);
	NewDirEntList->entry[0] = ((uint32_t) getPhysical(0xC0000000) | 3);
	NewDirEntList->entry[1] = ((uint32_t) getPhysical(0xF0001000) | 3);
	NewDirEntList->entry[0x301] = ((uint32_t) getPhysical(KernelVirtPageTableAddr) | 3);
	NewDirEntList->entry[0x3C1] = ((uint32_t) getPhysical(0xC0001000) | 3);
	ret = getPhysical(0xC0000000);
	_VMM_unmap(0xC0000000);
	_VMM_unmap(0xC0001000);
	return ret;

	/*	uint32_t PhysEntry = Physical & 0xFFFFF000;
	PhysEntry |= 3;

	uint32_t PageTable = (Virtual / 0x400000);
	uint32_t PageVirtAddress = (0xF0001000 + (0x1000 * PageTable));
	uint32_t PageTableEnt = ((Virtual % 0x400000) / 0x1000);*/
}
Пример #2
0
void _VMM_free(uint32_t Virtual, uint32_t Pages)
{
	uint32_t PhysBase = (uint32_t)getPhysical(Virtual);
	if(PhysBase) {
		uint32_t PhysPages = Pages;
		for(Pages++; Pages > 0; Pages--, Virtual+=0x1000)
			_VMM_unmap(Virtual);
		_PMM_free(PhysBase, PhysPages);
	}
}
Пример #3
0
int main(int argc, char *argv[]) {
    // Sample page table.
    pagetable pt[] = {
        {  4, 1 }, // { frame, valid }
        {  2, 1 },
        {  9, 1 },
        { 10, 1 },
        {  0, 1 },
        { 14, 1 },
        { 12, 0 },
        {  6, 1 },
        {  1, 1 },
        {  3, 0 },
        { 13, 1 },
        {  8, 1 },
        {  7, 1 },
        { 11, 1 },
        { 15, 1 },
        {  5, 0 } // Should be PAGECOUNT members.
    };
    setPageTable(pt);

    // Tests...feel free to add more!
    assert(getPhysical(-1) == ERR_OUT_OF_RANGE);
    assert(getPhysical(5) == 69);
    assert(getPhysical(13) == 77);
    assert(getPhysical(24) == 40);
    assert(getPhysical(31) == 47);
    assert(getPhysical(52) == 164);
    assert(getPhysical(72) == 8);
    assert(getPhysical(90) == 234);
    assert(getPhysical(98) == ERR_INVALID);
    assert(getPhysical(104) == ERR_INVALID);
    assert(getPhysical(128) == 16);
    assert(getPhysical(150) == ERR_INVALID);
    assert(getPhysical(179) == 131);
    assert(getPhysical(181) == 133);
    assert(getPhysical(199) == 119);
    assert(getPhysical(218) == 186);
    assert(getPhysical(239) == 255);
    assert(getPhysical(240) == ERR_INVALID);
    assert(getPhysical(249) == ERR_INVALID);
    assert(getPhysical(256) == ERR_OUT_OF_RANGE);
}