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

📄 arch2.c

📁 国内一位牛人自己开发的操作系统
💻 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 + -