📄 paging.c
字号:
/** paging.c ** ** Description: ** Virtual Memory, hardware paging ** **/#include <mm.h>pagedir *PD = NULL;int setupPaging(ulong available){ uint pages, pdes, total_memory; total_memory = available; pages = (total_memory >> PAGE_SHIFT); /* number of page directory entries */ pdes = (pages>>10) + (((pages%1024) > 0) ? 1 : 0); PD = (pagedir *)PAGING_CR3; vmMapInit(PD,pages); vmKernelMap(PD); enablePaging(); return pdes;}void __inline__ make_pde(pagedir *dir, uint nr, ulong addr,uchar attrib){ dir->entry[nr].present = 1; dir->entry[nr].readWrite = 1; dir->entry[nr].user = 0; dir->entry[nr].accessed = 0; dir->entry[nr].dirty = 0; dir->entry[nr].os_use = attrib; dir->entry[nr].reserved1 = 0; dir->entry[nr].reserved2 = 0; dir->entry[nr].address = (ulong)addr;#ifdef DEBUG/* if (addr>0) kprintf("PAGE: pde %d at 0x%08lx\n", nr,(ulong)addr); */#endif}void __inline__ make_pte(pagetable *tab, uint nr, ulong addr, uchar attrib){ tab->entry[nr].present = 1; tab->entry[nr].readWrite = 1; tab->entry[nr].user = 1; tab->entry[nr].accessed = 0; tab->entry[nr].dirty = 0; tab->entry[nr].os_use = attrib; tab->entry[nr].reserved1 = 0; tab->entry[nr].reserved2 = 0; tab->entry[nr].address = (ulong)addr;#ifdef DEBUG/* kprintf("PAGE: pte %d at 0x%08lx\n", nr, (ulong)addr); */#endif}void enablePaging(void){ ulong CR0 = get_CR0(); set_CR3(PAGING_CR3); /* set most significant bit of CR0 */ set_CR0(CR0 | 0x80000000); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -