📄 vm.c
字号:
/** vm.c ** ** Description: ** Virtual Memory Management - regions ** based ot Roadrunner/pk vm code ** **/#include <asm/system.h> /* for flush_tlb() */#include <asm/io.h>#include <asm/errno.h>#include <string.h> /* bzero() etc. */#include <mm.h> void vmMapInit(pagedir *pd, ulong pages){ int i; pagetable *pde = NULL; bzero(pd, sizeof(pagedir)); for (i=0; i < pages; i++) { if ((i & 0x3ff) == 0) { /* PageDir entry absolute address */ pde = (pagetable *) ((ulong)pd + ((i>>10) + 1) * PAGE_SIZE); bzero(pde, sizeof(pagetable)); make_pde(pd, i>>10, (ulong)pde >> PAGE_SHIFT,VMM_FREE); } make_pte(pde, i & 0x3ff, i, VMM_FREE); } flush_tlb();}int vmMap(pagedir *pd, void *page, ulong attr){ pagetable *pde; int idx; ulong addr,pte; if (pd == NULL || page == NULL) return EINVAL; /* get table entry. PDE_SHIFT = 22 */ idx = (int) (((ulong)page >> PDE_SHIFT) & PAGE_MASK); pde = (pagetable *)((pd->entry[idx].address) << PAGE_SHIFT); /* get page entry. PTE_SHIFT = 12 */ idx = (int) (((ulong)page >> PTE_SHIFT) & PAGE_MASK); addr = (ulong)(pde->entry[idx].address); pte = (ulong)page >> PAGE_SHIFT; if (addr == pte) return 0; if (addr != 0L) return EPERM; /* already mapped */ make_pte(pde,idx,pte,attr); return 0;}int vmUnmap(pagedir *pd, void *page){ pagetable *pde; int idx; ulong addr,pte; if (pd == NULL || page == NULL) return EINVAL; /* get table entry. PDE_SHIFT = 22 */ idx = (int) (((ulong)page >> PDE_SHIFT) & PAGE_MASK); pde = (pagetable *)((pd->entry[idx].address) << PAGE_SHIFT); /* get page entry. PTE_SHIFT = 12 */ idx = (int) (((ulong)page >> PTE_SHIFT) & PAGE_MASK); addr = (ulong)(pde->entry[idx].address); pte = (ulong)page >> PAGE_SHIFT; if (addr != pte) {#ifdef DEBUG kprintf("unmap: pde=0x%08lx, idx=%ld, addr=0x%08lx, page=0x%08lx(0x%08lx)\n", pde,idx,addr,page,pte);#endif return EPERM; } make_pte(pde,idx,(ulong)0,VMM_FREE); return 0;}int vmMapRange(pagedir *pd, void *start, size_t len, ulong attr){ ulong addr, end; int result; size_t length; length = PAGE_ROUND_UP(len); addr = (ulong) start; end = addr + length; for (; addr < end; addr += PAGE_SIZE) if ((result = vmMap(pd, (void *) addr, attr)) > 0) return result;#ifdef DEBUG/* kprintf("Map Range: 0x%08lx - 0x%08lx (%ld)\n", start,end,length); */#endif return 0;}int vmUnmapRange(pagedir *pd, void *start, size_t len){ ulong addr, end; size_t length; int result; length = PAGE_ROUND_UP(len); addr = (ulong) start; end = addr + length; for (; addr < end; addr += PAGE_SIZE) if ((result = vmUnmap(pd, (void *) addr)) > 0) return result;#ifdef DEBUG/* kprintf("UnMap Range: 0x%08lx - 0x%08lx (%ld)\n", start,end,length); */#endif return 0;}#ifdef DEBUGvoid dumpPageDir(pagedir *pd, ulong pdes){ int i, j, idx; ulong addr; idx = 0; for (i=0;i<16;i++) { for (j=0;j<6;j++) { addr = (ulong)(pd->entry[idx].address); kprintf("%08lx ",addr); idx++; if (idx > pdes) { kprintf("\n"); return; } } kprintf("\n"); }}#endifint vmKernelMap(pagedir *pd){ int result; extern void _end; if ((result = vmMapRange(pd, (void *)PAGING_CR3, PAGE_ROUND_UP((ulong)&_end-PAGING_CR3), VMM_BUSY))>0) {#ifdef DEBUG kprintf("[!!!] Kernel Memory Map Problem: %ld\n",result);#endif return result; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -