www.pudn.com > LFYOS.zip > arch2.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)); 
}