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

📄 system_call.c

📁 国内一位牛人自己开发的操作系统
💻 C
字号:
#include "kernel.h"

#define FLAG_1	((current.env->system_call_arg1>=0)?TRUE:FALSE)
#define ABS_1	((current.env->system_call_arg1>=0)		\
		?(current.env->system_call_arg1)		\
		:(-(current.env->system_call_arg1)))

int system_call_routine(void)
{
	switch(current.env->system_call){
	default:
		current.env->system_call=-1;
		time_share(current.thread_id);
		return 0;
	case 0:
		current.env->system_call=thread_migrate(
			current.thread_id,
			ABS_1,TRUE,FALSE,FLAG_1);
		break;
	case 1:
		current.env->system_call=thread_migrate(
			current.thread_id,
			ABS_1,FALSE,FALSE,FLAG_1);
		break;
	case 2:
		{
		struct thread_physical_block pb;
		pb.stack_memory_id=current.env->system_call_arg2;
		pb.stack_block_id=current.env->system_call_arg3;
		pb.memory_id	=current.env->system_call_arg4;
		pb.block_id	=current.env->system_call_arg5;
		current.env->system_call
		=thread_migrate_with_physical_block(
			current.thread_id,ABS_1,FLAG_1,&pb,
			&(current.par->capability.capability_1));
		break;
		}
	case 3:
		current.env->system_call=thread_return(
			current.thread_id,
			current.env->system_call_arg1);
		break;
	case 4:{
		int sem_id,return_value;
		if(current.env->system_call_arg1!=0){
			sem_id=current.env->system_call_arg1;
			if(sem_id>0)
				return_value=0;
			else{
				sem_id=0-sem_id;
				return_value=reset_semaphore_value(
				sem_id,
				&(current.par->capability.
					capability_1));
			}
			if(return_value<0)
				current.env->system_call_arg1
				=return_value;
			else
				current.env->system_call_arg1
				=system_call_v(
				sem_id,&(current.env->system_call_arg2),
				&(current.par->capability.
					capability_1));
		};

		if(current.env->system_call_arg3!=0){
			sem_id=current.env->system_call_arg3;
			if(sem_id>0)
				return_value=0;
			else{
				sem_id=0-sem_id;
				return_value=reset_semaphore_value(
				sem_id,&(current.par->capability.
					capability_2));
			}
			if(return_value<0)
				current.env->system_call_arg3
					=return_value;
			else
				current.env->system_call_arg3
				=system_call_p(
				current.thread_id,sem_id,
				current.env->system_call_arg4,
				current.env->system_call_arg5,
				&(current.par->capability.
					capability_2));
		};

		if((current.env->system_call_arg1<0)
		||(current.env->system_call_arg3<0))
			current.env->system_call=(-1);
		}
		break;
	case 5:
		current.env->system_call
			=set_semaphore_time_and_p_operation(
			current.thread_id,
			current.env->system_call_arg1,
			current.env->system_call_arg2,
			current.env->system_call_arg3,
			current.env->system_call_arg4,
			&(current.par->set_semaphore_time.first_time),
			&(current.par->set_semaphore_time.step_time),
			&(current.par->set_semaphore_time.
				semaphore_capability));
		break;
	case 6:
		current.env->system_call=create_thread(
			&(current.t->file[0]),
			current.env->system_call_arg1,
			current.rt->current_process,
			current.t->priority,
			current.env,
			&(current.par->capability.capability_1));
		break;
	case 10:
		current.env->system_call=allocate_resource(
			&(current.par->process_attribute.process),
			current.env->system_call_arg1,
			&(current.par->process_attribute.capability));
		break;
	case 11:
		current.env->system_call=query_resource(
			&(current.par->process_attribute.process),
			current.env->system_call_arg1);
		break;
	case 12:
		current.env->system_call=allocate_semaphore(
			current.env->system_call_arg1,
			current.env->system_call_arg2,
			&(current.par->capability.capability_1),
			&(current.par->capability.capability_2));
		break;
	case 13:
		current.env->system_call=release_semaphore(TRUE,
			current.env->system_call_arg1,
			&(current.par->capability.capability_1));
		break;
	case 14:
		current.env->system_call=set_thread_attribute(
			current.env->system_call_arg1,
			&(current.par->thread_attribute.exception),
			&(current.par->thread_attribute.priority),
			&(current.par->thread_attribute.
				mandatory_exit_number),
			&(current.par->thread_attribute.
				current_process_capability));
		break;
	case 15:
		if(current.env->system_call_arg1>=0)
			current.env->system_call=get_thread_attribute(
				current.env->system_call_arg1,
				&(current.par->thread_attribute.
					exception),
				&(current.par->thread_attribute.
					priority),
				&(current.par->thread_attribute.
					return_stack_top),
				&(current.par->thread_attribute.
					process),
				&(current.par->thread_attribute.
					current_process),
				&(current.par->thread_attribute.
					current_process_capability));
		else{
			current.env->system_call=current.t->semaphore;
			current.env->system_call_arg1
				=current.t->process;
			current.env->system_call_arg2
				=current.rt->current_process;
			current.env->system_call_arg3
				=current.t->return_stack_top;
			current.env->system_call_arg4
				=current.t->priority;
			current.env->system_call_arg5
				=current.rt->exception.flag;
		}
		break;
	case 20:
		if((current.env->system_call=get_memory_amount(
				current.env->system_call_arg1))>=0)
			current.env->system_call_arg1
				=(int)get_block_base(
				current.env->system_call_arg1,0);
		break;
	case 21:
		current.env->system_call=set_process_file_capability(
			current.rt->current_process,
			current.env->system_call_arg1,
			current.env->system_call_arg2,
			current.env->system_call_arg3,
			&(current.par->capability.capability_1),
			current.env->system_call_arg4,
			current.env->system_call_arg5);
		if(current.env->system_call>=0)
			current.cpu_info->last.thread_id=(-1);
		break;
	case 22:
		current.env->system_call=set_thread_file_capability(
			current.thread_id,
			current.env->system_call_arg1,
			current.env->system_call_arg2,
			current.env->system_call_arg3,
			&(current.par->capability.capability_1),
			current.env->system_call_arg4,
			current.env->system_call_arg5);
		if(current.env->system_call>=0)
			current.cpu_info->last.thread_id=(-1);
		break;
	case 23:
		current.env->system_call=can_access_file(
			current.thread_id,
			current.rt->current_process,
			current.env->system_call_arg1,
			&(current.env->system_call_arg2),
			&(current.env->system_call_arg3),
			&(current.env->system_call_arg4));
		break;
	}
	return 1;
}

⌨️ 快捷键说明

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