⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vm.c

📁 一个微型操作系统源码
💻 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 + -