📄 sys.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 + -