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

📄 mm.c

📁 用于汇编领域的,运用于OS的MAIN函数.基于硬件基础的源代码
💻 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 + -