📄 page_fault.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 + -