5 系统调用.ppt_第1页
5 系统调用.ppt_第2页
5 系统调用.ppt_第3页
5 系统调用.ppt_第4页
5 系统调用.ppt_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、4 系统调用,沈峰,为什么采用系统调用?,有时用户程序需要与系统进行交互,如需要存取其它内存空间或执行其它特权操作等。 例如,如果用户程序想写屏幕,它就需要存取显示存储器,而显示存储器是位于用户进程的存储空间之外的; 如果用户程序想执行特权操作,如I/O指令(I/O指令需要OS内核来执行,用户程序是无权操作的)。,系统调用是什么?,操作系统因此提供了一系列的系统调用,这些调用是一些用于实现用户程序需求的例程。但是,这些例程是运行在受保护的内存中的,因此需要OS提供特殊的机制来使用它们。,GeekOS中的系统调用,INT90 在应用程序端把参数放置到寄存器中 在内核端重新获取应用程序端传递进来的

2、参数 调用对应的函数: Sys_xxx 返回结果或错误代码 使用 g_CurrentThread 获取当前运行的进程,GeekOS中的系统调用,在GeekOS中为了使用系统调用,用户程序需要使用int指令发送一个处理器中断。GeekOS提供了一个中断号0X90的中断处理者(参见trap.c line41),这个中断处理者例程就是Syscall_Handler trap.c 中static void Syscall_Handler(struct Interrupt_State* state),Trap.c,System call handler. Syscall_Handler uint_t s

3、yscallNum = state-eax; state-eax = g_syscallTablesyscallNum(state); Initialize handlers for processor traps. void Init_Traps(void) Install_Interrupt_Handler(0X90, ,Syscall_Handler(struct Interrupt_State* state),此函数检查寄存器eax中的当前值,然后调用适当的系统例程来响应系统调用请求.eax中的值称为系统调用号。 接受系统请求的例程接收到了调用者传递过来的保存在结构体Interrupt

4、_State中的调用者的上下文,因此通用寄存器(ebx,ecx,edx)可用于用户程序与中断处理者例程之间相互传递数据。,系统调用的例程,所有系统调用的例程都定义在 src/geekos/syscall.c中: Sys_Null, Sys_Exit, 等. 通常系统调用的例程都执行如下工作: (1)抽取用户程序传递过来的所有参数。这些参数保存在寄存器中,并由用户程序的上下文传递给系统调用例程。这些参数可以通过如下方式获得:state-ebx, state-ecx等。 (2)实现特定系统调用的逻辑功能 (3) 返回结果或适当的错误代码,在从系统调用例程返回之前,必须使用恢复用户进程上下文使得用户

5、程序能够继续从它离开处继续执行。指向用户程序上下文(保存在内核堆栈中)的指针实际上就是传递给Syscall_Handler的参数。 Syscall_Handler(struct Interrupt_State* state),从用户线程引发系统调用的流程:,在Src/user/shell.c 输入用户程序名称时的调用流程: Spawn_Single_Command() process.c中的函数Spawn_With_Path Process.c中的Spawn_Program,而Spawn_Program是通过Syscall.h中的宏DEF_SYSCALL定义的。 在Shell中输入shell命

6、令时的调用流程 如输入pid时:Get_PID- Process.c中Get_PID也是通过DEF_SYSCALL定义的。,Process.c,/* System call wrappers */ DEF_SYSCALL(Exit, SYS_EXIT,int,(int exitCode), int arg0 = exitCode;, SYSCALL_REGS_1) DEF_SYSCALL(Get_PID,SYS_GETPID,int,(void),SYSCALL_REGS_0),Syscall.h 系统调用功能号,enum SYS_NULL, /* Null (no-op) system ca

7、ll */ SYS_EXIT, /* Exit system call */ SYS_PRINTSTRING, /* Print string system call */ SYS_GETKEY, /* Get key system call */ SYS_SETATTR, /* Set screen attribute system call */ SYS_GETCURSOR, /* Get current cursor position */ SYS_PUTCURSOR, /* Put current cursor position */ SYS_SPAWN, /* Spawn proce

8、ss system call */ SYS_WAIT, SYS_GETPID, /* Get pid (process id) system call */ SYS_KILL, /* Kill a process */ SYS_PS, ;,Syscall.c的主要功能,system call handler functions 各类系统调用函数的具体实现代码。 Global table of system call handler functions 各类系统调用函数名称组成的一个全局数组。 Number of system calls implemented. 已经实现了的系统调用个数。,各

9、类系统调用函数名称组成的一个全局数组,const Syscall g_syscallTable = Sys_Null, Sys_Exit, Sys_PrintString, Sys_GetKey, Sys_SetAttr, Sys_GetCursor, Sys_PutCursor, Sys_Spawn, Sys_Wait, Sys_GetPID, Sys_Kill, Sys_PS, ;,添加新的系统调用命令需要修改如下文件,SrcuserShell.c (如果增加shell命令,需要修改此文件)。 IncludelibsProcess.h ,srclibc process.c includeGeekosSyscall.h ,srcGeekos Syscall.c,SrcGeekosSys_GetPID函数的功能,返回当前正在运行进程的 PID,用户应用程序的编写,应用程序保存在srcuser目录下。 编写应用程序之后,在Makefile文件第112行添加上自己的应用程序文件名 示例: src/user/hello.c #include #include #include int main( int argc , char * argv ) Print (Hello wor

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论