陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009
系统调用
系统调用的意义 操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用 把用户从底层的硬件编程中解放出来 极大的提高了系统的安全性 使用户程序具有可移植性 2018/12/5 嵌入式OS
API和系统调用 应用编程接口(application program interface, API)和系统调用是不同的 系统调用通过软中断向内核发出一个明确的请求 Libc库定义的一些API引用了封装例程(wrapper routine,唯一目的就是发布系统调用) 一般每个系统调用对应一个封装例程 库再用这些封装例程定义出给用户的API 2018/12/5 嵌入式OS
不是每个API都对应一个特定的系统调用。 返回值 大部分封装例程返回一个整数,其值的含义依赖于相应的系统调用 -1在多数情况下表示内核不能满足进程的请求 Libc中定义的errno变量包含特定的出错码 2018/12/5 嵌入式OS
系统调用程序及服务例程 当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。 在Linux中是通过执行arm汇编语言swi来执行系统调用的 传参: 内核实现了很多不同的系统调用,进程必须传递一个名为系统调用号的参数来指明需要调用的系统调用,arm中与swi的操作码混在一起 2018/12/5 嵌入式OS
所有的系统调用返回一个整数值。这里的返回值与封装例程返回值的约定是不同的。 正数或0表示系统调用成功结束 负数表示一个出错条件,此时这个负值将要存放在errno变量中返回给应用程序。内核没有设置或使用errno变量,封装例程在系统调用返回取得返回值之后设置这个变量 2018/12/5 嵌入式OS
系统调用处理程序也其他异常处理程序的结构类似,执行下列操作 在进程的内核态堆栈中保存大多数寄存器的内容(即保存恢复进程到用户态执行所需要的上下文) 调用名为系统调用服务例程的相应的C函数来处理系统调用 从系统调用返回 2018/12/5 嵌入式OS
应用程序、封装例程、系统调用处理程序及系统调用服务例程之间的关系 vector_swi ret_... 2018/12/5 嵌入式OS
系统调用表和系统调用 为了把系统调用号与相应的服务例程关联起来,内核利用了一个系统调用分派表(dispatch table) 参见sys_call_table的定义 calls.S 寻找sys_call_table是如何使用的 vector_swi 2018/12/5 嵌入式OS
访问进程的地址空间 系统调用服务例程需要非常频繁的读写进程地址空间的数据 基本上分别有相应的.S文件对应 2018/12/5 嵌入式OS
Thanks! The end.