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

📄 arch2.c

📁 虚地址空间基于文件OS内核源代码和文件
💻 C
字号:
#include "memory.h"
extern void reload_cr3();
int memory_set_tlb_item(int memory_process_id,
	int file_window,int logic_block_number,
	int physical_number,int right)
{
	int i,*p,*p1,return_value,memory_body_id,dir;

	memory_body_id=memory_body->my_memory_body;
	physical_number=(physical_number&(0x0007ffff));
	physical_number=(int)get_block_base(
		memory_body_id,physical_number);
	physical_number=(physical_number&(0x3ffff000))+(right&(0x7));
	physical_number=(physical_number|(0x01));
	
	if(file_window>=FILE_NUMBER)
		return (-1);
	if(logic_block_number>=(128*1024))
		return (-1);
	dir=logic_block_number/1024;
	logic_block_number=logic_block_number%1024;
	if(dir>file_page_table[file_window].number)
		return (-1);
	if((i=file_page_table[file_window].page_table_block[dir])<0){
		file_page_table[file_window].item_number[dir]=0;
		file_page_table[file_window].reference_number[dir]=0;
		if((i=get_free_block(memory_process_id))<0)
			return (-1);
		file_page_table[file_window].page_table_block[dir]=i;
		i=(memory_body->physical_block+i)->physical_number;
		p=(int *)get_block_base(memory_body_id,i);
		for(i=0,p1=p;i<1024;i++,p1++)
			*p1=0;
	}else{
		i=(memory_body->physical_block+i)->physical_number;
		p=(int *)get_block_base(memory_body_id,i);
	}
	p=p+logic_block_number;
	return_value=(*p);
	*p=physical_number;
	if((return_value&(0x01))==0){
		file_page_table[file_window].item_number[dir]++;
		return 1;
	}else
		return (-1);
}

int memory_clear_tlb_item(int memory_process_id,
	int file_window,int logic_block_number)
{
	register int eflag;
	int i,*p,v,memory_body_id,dir,block_number;
	
	memory_body_id=memory_body->my_memory_body;
	if(file_window>=FILE_NUMBER)
		return (-1);
	if(logic_block_number>=(128*1024))
		return (-1);
	dir=logic_block_number/1024;
	if(dir>file_page_table[file_window].number)
		return (-1);
	logic_block_number=logic_block_number%1024;
	block_number=file_page_table[file_window].page_table_block[dir];
	if(block_number<0)
		return (-1);
	i=(memory_body->physical_block+block_number)->physical_number;
	p=(int *)get_block_base(memory_body_id,i);
	p=p+logic_block_number;

	v=(*p);
	*p=0;
	if((v&(0x01))==0)
		return (-1);
	file_page_table[file_window].item_number[dir]--;

	eflag=disable_interruption();
	if((file_page_table[file_window].item_number[dir]<=0)
	&&(file_page_table[file_window].reference_number[dir]<=0)){
		free_free_block(memory_process_id,
			file_page_table[file_window].
				page_table_block[dir]);
		file_page_table[file_window].
			page_table_block[dir]=(-1);
		file_page_table[file_window].item_number[dir]=0;
		file_page_table[file_window].reference_number[dir]=0;
		notify_switch(current.thread_id);
	}
	reload_cr3_flag=0;
	reload_cr3();
	restore_interruption(eflag);
	return (v&(0x40));
}

⌨️ 快捷键说明

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