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

📄 arch4.c

📁 国内一位牛人自己开发的操作系统
💻 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;i<check_access_number;i++){
		f=memory_body->file_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;
}

⌨️ 快捷键说明

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