📄 mm.c
字号:
#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; printk("in set page table. pid %d, pgdir[0] is %x\n",p->pid, p->mm.pgdir[0]); dir0[USER_PAGE]=sloc | 0x03; printk("aft modifying dir0. pid %d, pgdir[0] is %x\n",p->pid, p->mm.pgdir[0]); // we have changed page table. need to flush TLB __flush_tlb(); // 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; printk("dumping directory at %x\n", dir); for(i=0;i<MAXFRAME;i++){ if ((i % 25)==0) 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);}void copy_mm(struct task_struct *src, struct task_struct *dest){ int i; printk("copying directory table\n"); // allocate directory table first dest->mm.pgdir = (unsigned long *)get_free_pgframe(); init_directory_table(dest); // now copy for(i=0;i<MAXDIR;i++){ dest->mm.pgdir[i]=src->mm.pgdir[i]; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -