GeekOs系统调用
来源:互联网 发布:redis存储json数据 编辑:程序博客网 时间:2024/06/06 10:58
关于系统调用
以/src/libc/process.c中DEF_SYSCALL(Spawn_Program,SYS_SPAWN,int,
(const char *program,const char *command)
const char *arg0=program;
size_t arg1=strlen(program);
const char*arg2=command;
size_t arg3 *strlen(command);
SYSCALL_REGS_4)为例:
◆DEF_SYSCALL是函数的宏定义,在syscall.h中,定义如下:
#define DEF_SYSCALL(name,num,retType,params,argDefs,regs)
retType name params{
int sysNum=(num),rc;
argDefs
__asm__ __volatile__(SYSCALL:”=a”(rc):”a”(sysNum)regs);
return (retType) rc;
}
◆ 根据此宏定义我们可以写出下面的函数(其中SYSCALL定义为:“int $0x90”,作为系统调用中断号):
intSpawn_Program (const char *program,const char *command)
{
int sysNum=(SYS_SPAWN),rc;
const char *arg0=program;
size_t arg1=strlen(program);
const char*arg2=command;
size_t arg3 *strlen(command);
__asm__ __volatile__(SYSCALL:”=a”(rc):”a”(sysNum) SYSCALL_REGS_4);
return (int) rc;
}
◆在syscall.h中有个系统调用号的枚举类型:
enum{
SYS_NULL,
SYS_EXIT,
SYS_PRINTSTRING,
SYS_GETKEY
SYS_SETATTR,,
SYS_GETCURSOR,
SYS_PUTCURSOR,
SYS_SPAWN,
SYS_WAIT,
SYS_GETPID,
};
◆在syscall.c文件中定义了一个系统调用处理函数的全局表:
Const Syscall g_syscallTable[]={Sys_Null,Sys_Exit,Sys_PrintString,
Sys_GetKey,Sys_SetAttr,Sys_GetCursor,
Sys_PutCursor,Sys_Spawn,Sys_Wait,Sys_GetPID};
◆ 系统调用处理函数(在trap.c文件中)Syscall_Handler定义如下:
Static void Syscall_Handler(struct Interrupt_State *state)
{
uint_t syscallNum=state->eax;
if(syscallNum<0||syscallNum>=g_numSyscalls){
Print(“Illegal system call %d by process %d\n”
syscallNum,g_currentThread->pid);
Exit(-1);
KASSERT(false);
}
state->eax=g_syscallTable[syscallNum](state);
}
◆ 在上面的函数Spawn_Program中
__asm__ __volatile__(SYSCALL:”=a”(rc):”a”(sysNum) SYSCALL_REGS_4);
“SYSCALL”代表进入系统调用中断,进入系统调用处理函数Syscall_Handler,系统调用号“(sysNum)”(此时值是(SYS_SPAWN))存放在寄存器state->eax中,当调用号<0或>=系统调用处理函数全局表项个数时显示出错信息。然后,根据系统调用号
sysNum被赋值(SYS_SPAWN)作为表g_syscallTable[]下标,从而找到通过表
g_syscallTable[syscallNum](state)找到内核处理程序Sys_Spawn(state),在Sys_Spawn函数中调用Spawn函数进行用户进程的创建。创建成功后返回新进程的进程号给state->eax寄存器。
- GeekOs系统调用
- GeekOS-Project0
- GeekOS-Project1
- GeekOS project0
- geekos project4
- GeekOS Project3
- GeekOS Project2
- GeekOS Project2
- GeekOS Project3
- GeekOS project0
- Bochs搭建GeekOS平台
- geekOS操作系统(1)
- geekOs操作系统实验
- geekos项目project1代码
- GeekOS project1 -- 载入可执行文件
- GeekOS源代码学习(0)
- GeekOS中的进程睡眠
- GeekOS 中的project1
- 医院健康体检系统
- android发送消息正确方式
- wTL
- android Activity中启动另一应用程序的方法,无需得到类名
- 关于OpenCV中利用函数cvConvert实现图像数据类型转换(8U->16S)
- GeekOs系统调用
- Linux设备模型分析之kset
- 每日一练 Lucene3.5 建立索引
- (Hanoi)汉诺塔java实现程序
- Android系列教程之五:Activity的生命周期
- 求大神路过指导ZOJ3597 Hit the Target!
- 第十周任务一
- ubuntu每天定时关机
- Android动画开发——Animation动画效果