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

📄 page_fault.c

📁 国内一位牛人自己开发的操作系统
💻 C
字号:
#include"memory.h"

int page_fault_process(int flag,int cr2,int err_code)
{
	int return_value;
	int dir,system_dir,file;
	int memory_body_id,system_file,offset,map_length,right;

	if(flag<=0){
		int i,x,y;
		for(i=0,x=cr2;i<CR2_BUF_NUMBER;i++){
			y=current.env->point.cr2[i];
			current.env->point.cr2[i]=x;
			if(((0xffc00000)&cr2)==((0xffc00000)&y))
				break;
			x=y;
		}
	}

	file=cr2;offset=cr2;dir=cr2;
	file=((file>>29)&(0x07));
	offset=(offset&(0x1fffffff));
	dir=((dir>>22)&(0x3ff));
	if(dir>=(3*256))
		return 0;
	for(;;){
		system_file=can_access_file(current.thread_id,
			current.rt->current_process,file,
			&memory_body_id,&map_length,&right);
		if((system_file<0)||(system_file>=FILE_NUMBER))
			return 0;
		if(right==NO_ACCESS_RIGHT)
			return 0;
		if((page_dir[dir]&(0x01))==0){
			system_dir=offset;
			system_dir=(system_dir>>22);
			system_dir=system_dir&(0x7f);
			if(system_dir>file_page_table
				[system_file].number)
					return 0;
			else{
				int i,*p;
				p=add_tlb_buf(dir,system_file,
					system_dir,right);
				if(((int)p)!=0){
					i=((offset>>12)&(0x3ff));
					if(((*(p+i))&(0x01))!=0)
						return 1;
				}
			}
		}
		if(flag>0)
			return 1;
		if((err_code&(0x01))!=0)
			return 0;
		lock_memory_body(memory_body->my_memory_body);
		return_value=memory_map_deal(current.t->semaphore,
			system_file,offset,offset+map_length,
			&(os->system_capability));
		unlock_memory_body(memory_body->my_memory_body);
		if(return_value<0)
			return 0;
		if((page_dir[dir]&(0x01))!=0)
			return 1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -