2
来自「用于汇编领域的,运用于OS的MAIN函数.基于硬件基础的源代码」· 代码 · 共 74 行
TXT
74 行
#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 + =
减小字号Ctrl + -
显示快捷键?