www.pudn.com > LFYOS.zip > arch4.c


#include "memory.h" 
extern void reload_cr3(); 
 
int memory_get_accessed_block(int check_access_number) 
{ 
	static int file_number=0,dir_number=0,page_number=0; 
	int i,j,k,l,*p,eflag; 
	int memory_body_id; 
	struct file_window *f; 
 
	memory_body_id=memory_body->my_memory_body; 
 
	for(i=0;ifile_window+file_number; 
		if(f->state!=FILE_OPEN){ 
			file_number=(1+file_number)%FILE_NUMBER; 
			dir_number=0; 
			page_number=0; 
			continue; 
		} 
		if(dir_number>(file_page_table[file_number].number)){ 
			file_number=(1+file_number)%FILE_NUMBER; 
			dir_number=0; 
			page_number=0; 
			continue; 
		} 
		if((j=file_page_table[file_number]. 
			page_table_block[dir_number])<0) 
		{ 
			page_number=0; 
			dir_number++; 
			j=(file_page_table[file_number].number); 
			if(dir_number>j){ 
				dir_number=0; 
				file_number=(1+file_number)%FILE_NUMBER; 
			} 
			continue; 
		} 
		eflag=disable_interruption(); 
		k=file_page_table[file_number].item_number[dir_number]; 
		l=file_page_table[file_number]. 
			reference_number[dir_number]; 
		if((k<=0)&&(l<=0)){ 
			free_free_block(f->file.memory_process, 
				file_page_table[file_number]. 
				page_table_block[dir_number]); 
			file_page_table[file_number]. 
				page_table_block[dir_number]=(-1); 
			file_page_table[file_number]. 
				item_number[dir_number]=0; 
			file_page_table[file_number]. 
				reference_number[dir_number]=0; 
			notify_switch(current.thread_id); 
			page_number=0; 
			dir_number++; 
		}else{ 
			j=(memory_body->physical_block+j) 
				->physical_number; 
			p=(int *)get_block_base(memory_body_id,j); 
			p=p+page_number; 
			j=(*p); 
			if(((j&(0xff8))!=0)&&((j&(0x01))!=0)){ 
				*p=(j&(0xfffff007)); 
				j=PAGE_SIZE*(page_number 
					+1024*dir_number); 
				restore_interruption(eflag); 
				touch_file_access(file_number,j); 
				return 0; 
			} 
			page_number++; 
			if(page_number>=1024){ 
				page_number=0; 
				dir_number++; 
			} 
		} 
		if(dir_number>(file_page_table[file_number].number)){ 
			file_number=(1+file_number)%FILE_NUMBER; 
			dir_number=0; 
			page_number=0; 
		} 
		reload_cr3_flag=0; 
		reload_cr3(); 
		restore_interruption(eflag); 
	} 
	return -1; 
}