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

📄 map_deal.c

📁 国内一位牛人自己开发的操作系统
💻 C
字号:

#include"memory.h"

#define NOT_FIND_PHYSICAL_BLOCK	-1

#define WRONG_MEMORY_BODY_ID	-1
#define WRONG_FILE_NUMBER	-2
#define WRONG_FILE_STATE	-3
#define WRONG_CAPABILITY	-4
#define WRONG_SEMAPHORE		-5

int memory_map_deal(int sleep_semaphore,int file_window_number,
	int begin_logic_address,int end_logic_address,
	struct capability *file_capability)
{
	int max_file_number,return_value;
	int logic_address;
	int logic_block_number,physical_block_number;
	struct file_window *f;

	if(sleep_semaphore<=0)
		return WRONG_SEMAPHORE;

	max_file_number=(*(memory_body->file_number));
	if((file_window_number<0)
	||(file_window_number>=max_file_number))
		return WRONG_FILE_NUMBER;
	f=memory_body->file_window+file_window_number;
	if(f->state!=FILE_OPEN)
		return WRONG_FILE_STATE;
	if(!KERNEL_COMPARE_CAPABILITY(
		(f->file.capability),(*file_capability)))
			return WRONG_CAPABILITY;

	f->lock_number++;

	if(begin_logic_address>end_logic_address)
		end_logic_address=begin_logic_address;
	for(
		return_value=0,
		logic_address=begin_logic_address;
		logic_address<=end_logic_address;
		logic_address=logic_address+PAGE_SIZE)
	{
		if(logic_address>=f->file.window_length)
			break;
		if((return_value=prepare_free_block(
			f->file.memory_process,sleep_semaphore))<0)
				break;
		physical_block_number=search_physical_block(
			file_window_number,logic_address,
			&logic_block_number);
		if(physical_block_number<0){
			if((physical_block_number=read_one_block(
				file_window_number,logic_address,
				sleep_semaphore))<0)
					return physical_block_number;
		}
		return_value=touch_block(f->file.memory_process,
			physical_block_number,sleep_semaphore);
		if(return_value<0)
			break;
	}
	f->lock_number--;

	return return_value;
}

⌨️ 快捷键说明

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