📄 arch2.c
字号:
#include "../kernel/kernel.h"
#include "../memory/memory.h"
#define MAX_TLB_BUF 6
static int buf[MAX_TLB_BUF],*reference[MAX_TLB_BUF];
static int pointer;
struct file_page_table file_page_table[FILE_NUMBER];
int *add_tlb_buf(int dir,int system_file,int file_dir,int right)
{
int i,j,*p;
if((dir<0)||(dir>=3*256))
return (int *)0;
i=buf[pointer];
if((i>=0)&&(i<3*256)){
buf[pointer]=(-1);
page_dir[i]=0;
reload_cr3_flag++;
}
j=file_page_table[system_file].page_table_block[file_dir];
if(j<0)
return (int *)0;
j=(memory_body->physical_block+j)->physical_number;
p=(int *)get_block_base(0,j);
j=(0x3ffff000)&((int)p);
buf[pointer]=dir;
page_dir[dir]=(j|right);
reference[pointer]=(&(file_page_table[system_file].
reference_number[file_dir]));
(*(reference[pointer]))++;
pointer=((1+pointer)%MAX_TLB_BUF);
return p;
}
void notify_switch(int thread_id)
{
int i,j;
extern int page_fault_process(int flag,int cr2,int err_code);
for(i=0;i<MAX_TLB_BUF;i++){
j=buf[i];
if((j>=0)&&(j<3*256)){
page_dir[j]=0;
(*(reference[i]))--;
reload_cr3_flag++;
}
buf[i]=-1;
};
pointer=0;
for(i=0;i<CR2_BUF_NUMBER;i++)
page_fault_process(100,current.env->point.cr2[i],0);
return ;
}
void init_tlb()
{
int i,j;
for(i=0;i<1024;i++){
if(i<(3*256))
page_dir[i]=0;
else{
j=(int)&(system_page_table[i-(3*256)]);
j=j&(0x3ffff000);
j=j|(0x07);
page_dir[i]=j;
}
};
for(i=0;i<FILE_NUMBER;i++)
file_page_table[i].number=0;
for(i=0;i<MAX_TLB_BUF;i++)
buf[i]=-1;
pointer=0;
reload_cr3_flag=1;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -