操作系统原理,系统调用,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB
一、系统调用:操作系统功能调用,用户在编程时可以调用的操作系统功能。 1、系统调用是操作系统提供给编程人员的唯一接口,使CPU状态从用户态陷入内核态。 2、每个操作系统都提供几百种系统调用,例如进程控制,进程通信pipe,文件使用IO,目录操作,设备管理,信息维护等。
二、系统调用/库函数/API/内核函数的调用关系
三、系统调用机制的设计 1、中断异常机制支持系统调用服务的实现 2、使用特殊指令:陷入指令(防管指令)引发异常,完成用户态到内核态的切换 3、每个系统调用都事先给定一个编号(功能号)作为系统调用号,系统调用可能有参数(编译器参与将代码中的系统调用转换为系统调用号) 4、系统调用表存放系统调用服务例程的入口地址
四、系统调用号实例: #define __NR_exit 1 #define __NR_fork 2 #define __NR_read 3 等
五、将用户程序的参数传递给内核的方法(用户程序参数无法直接推入系统调用栈): 1、陷入指令的自带参数,但是长度有限,还要携带系统调用功能号,只能自带有限的参数 2、通过通用寄存器传递参数,使用操作系统和用户程序都能访问的寄存器,但寄存器的个数会限制传递参数的数量。 3、在内存中开辟专用堆栈区来传递参数
六、系统调用的执行过程: 1、CPU执行到特殊的陷入指令128号,int $0x80 2、中断异常机制,触发硬件保护现场,通过查中断向量表将CPU控制权转给系统调用总入口程序。 3、系统调用总入口程序:保存现场,将参数保存在内核堆栈,通过差系统调用表吧控制权转交给相应的系统调用处理例程或内核函数 4、执行系统调用例程 5、恢复现场,返回用户程序
七、Linux系统调用执行流程
1、用户态下调用c库的库函数,比如write() 2、封装后的write()先做好参数传递工作,然后使用int 0x80指令产生一次异常 3、CPU通过0x80号在IDT(中断描述符表)中找到对应的服务例程system_call()并调用 4、system_call()将参数保存在内核栈,根据系统调用号索引系统调用表,找到系统调用程序入口,如system_write() 5、system_write()执行完后,通过ret_from_sys_call()例程返回用户程序
八、不同操作系统下的PCB 1、Linux下为task_struct 2、windows下为:ERPOCESS,KPROCESS,PEB
|