📄 2
字号:
#include "../hos.h"void init_mm(){ int i; // do some preparation for mm init_mem_map(); // we assume 1st Mega (first 256 frames) is already occupied by kernel for(i=0;i<256;i++) mem_map[i].count=1;}void set_page_table(struct task_struct *p, unsigned long sloc){// process p is located physically at sloc. set page directory// and page table properly. we assume all processes is less than 1 page unsigned long * dir0; dir0 = (unsigned long *)get_free_pgframe(); // location of free page frame. use this frame // as dir 0 for current process // copy swapper_dir0 to dir0 to represent kernel mymemcpy(dir0, swapper_dir0, PGSIZE); p->mm.pgdir[0]=(unsigned long)dir0 | 0x03; dir0[USER_PAGE]=sloc | 0x03; // also we assume all process locates at 0x200000 which is page 512 dump_directory_table(p->mm.pgdir);}void init_directory_table(struct task_struct *p){ int i; printk("init dir table for pid %d\n",p->pid); printk("i is at %x \n",&i); printk("p is at %x \n", p); printk("pgdir is at %x \n", p->mm.pgdir); for(i=0;i<MAXDIR;i++){ p->mm.pgdir[i]=0; } printk("done\n");}void init_directory(unsigned long *dir){ int i; printk("in init dir\n"); for(i=0;i<MAXFRAME;i++){ dir[i]=0; }}void dump_directory(unsigned long *dir){ int i; for(i=0;i<MAXFRAME;i++){ wait_for_anykey(); if (dir[i]!=0) printk("page %d is at %x\n", i, dir[i]); }}void dump_directory_table(unsigned long *pgdir){ int i; printk("dumping directory table at %x\n",pgdir); wait_for_anykey(); for(i=0;i<MAXDIR;i++){ if (mloc(pgdir[i])!=0){ // pgdir[i] is pointing to a directory printk("dumping %d th directory which is at %x\n",i,pgdir[i]); wait_for_anykey(); dump_directory(mloc(pgdir[i])); } }}void dump_mm(struct task_struct *p){// dump mm of p. dump page table only for now printk("dumping mm for pid %d\n", p->pid); wait_for_anykey(); dump_directory_table(p->mm.pgdir);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -