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

📄 sys.c

📁 os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm
💻 C
字号:
/* *	ApOS (Another Project software for s3c2410) *	 *	This program is free software; you can redistribute it and/or modify *	it under the terms of the GNU General Public License version 2 as *	published by the Free Software Foundation. *			 *						Copyright caiyuqing * */#include "../include/s3c2410/cpu.h"#include "../include/kernel/sys.h"#include "../include/kernel/sched.h"#include "../include/kernel/signal.h"#include "../include/kernel/task.h"#include "../include/kernel/gui.h"extern struct lcd_control_obj lcd_control_obj;extern struct task_struct* current;struct task_struct* task[NR_TASKS];/* *	系统调用函数表 */fn_ptr sys_call_table[] = { 	sys_enter_super,sys_fork,sys_singal,sys_sigaction,sys_free_process	};/* *	software interrupt处理函数 *	所有的系统呼叫处理函数的形式参数都皆是 struct cpu_registers *regs *	 *	其中: *		regs->r0 为系统呼叫号 *		regs->r1 为系统呼叫参数1 *		regs->r2 为系统呼叫参数2 *		regs->r3 为系统呼叫参数3 * * */void do_system_call(struct cpu_registers *regs){	unsigned int res;	unsigned int signum;		//从r0得到系统呼叫号	fn_ptr fun;	fun=sys_call_table[regs->r0];	regs->r0=(*fun)(regs);}//0号系统调用使系统进入system模式int sys_enter_super(struct cpu_registers *regs){	unsigned int reg=read_spsr();	reg|=SystemMode;	write_spsr(reg);}/* *	1号系统调用 */int sys_fork(struct cpu_registers *regs){	int nr=find_empty_process();	if(nr==-1)		return -1;	else	{		copy_process(nr,regs);	}	return nr;}/* *	2号系统调用 *	不可靠的信号设置函数 */int sys_singal(struct cpu_registers *regs){	int 	signum=regs->r1;	unsigned int handler=regs->r2;	unsigned int restorer=regs->r3;		struct sigaction tmp;	/*	 *	若信号不在定义的范围之内或信号是SIGKILL	 *	则以失败返回	 */	if(signum<1||signum>32||signum==SIGKILL)	{		return -1;	}	tmp.sa_handler=(void (*)(int))handler;//sa_handler设置为用户指定的句柄	tmp.sa_mask=0;//不对该信号进行屏蔽(信号触发时该信号处理函数将被调用)	/*	 *	SA_NOMASK置位,不阻止在指定的信号处理函数中再收到该信号	 *	SA_ONESHOT置位,当指定的信号句柄被调用后则马上恢复成默认句柄	 *	 */	tmp.sa_flags=SA_ONESHOT|SA_NOMASK;	/*	 *	restorer为信号句柄处理完毕后调用函数,该函数作用	 *	是将用户堆栈恢复成调用信号句柄之前的状态	 */	tmp.sa_restorer=(void (*)(void))restorer;	handler=(unsigned int)current->sigaction[signum].sa_handler;	current->sigaction[signum]=tmp;	return handler;//返回原信号句柄}/* *	可靠的信号设置函数 */int sys_sigaction(struct cpu_registers *regs){	int 	signum=regs->r1;	struct sigaction *action=regs->r2;	struct sigaction *oldaction=regs->r3;	struct sigaction tmp;		if(signum<1||signum>32||signum==SIGKILL)	{		return -1;	}		tmp=current->sigaction[signum];		current->sigaction[signum]=*action;	*oldaction=tmp;			if(current->sigaction[signum].sa_flags&SA_NOMASK)	{		current->sigaction[signum].sa_mask=0;	}	else	{		//对该信号进行屏蔽(信号触发时该信号处理函数不被调用)		current->sigaction[signum].sa_mask|=(1<<signum);	}		return 0;}/* *	3号系统调用 *	用于撤消进程 */int sys_free_process(struct cpu_registers *regs){	return free_task(regs->r1);}

⌨️ 快捷键说明

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