系统调用程序及服务例程 ●当用户态进程调用一个系统调用时,CPU切换到内核态并开始执 行相应的内核函数 。在Linux中是通过执行int$0x80来执行系统调用的, 这条汇编指令产生向量为128的编程异常 (回忆,trap_init中系统调用入口的初始化) 。Intel Pentium II中引入了sysenter指令(快速系统调用), 2.6已经支持(本课程不考虑这个) ●传参: 内核实现了很多不同的系统调用,进程必须指明需要哪个 系统调用,这需要传递一个名为系统调用号的参数 ●Linux使用eax寄存器传递系统调用号 1口+4四1克42在刀QC 陈香兰(xianchenoustc,edu,cn)(计算丸应【inx操许系统分折Chapter书系统码月 0 ctober24,20146/31
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 系统调用程序及服务例程 当用户态进程调用一个系统调用时,CPU切换到内核态并开始执 行相应的内核函数 在Linux中是通过执行int $0x80来执行系统调用的, 这条汇编指令产生向量为128的编程异常 (回忆,trap_init中系统调用入口的初始化) Intel Pentium II中引入了sysenter指令(快速系统调用), 2.6已经支持(本课程不考虑这个) 传参: 内核实现了很多不同的系统调用,进程必须指明需要哪个 系统调用,这需要传递一个名为系统调用号的参数 Linux使用eax寄存器传递系统调用号 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 6 系统调用 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 24, 2014 6 / 31
系统调用程序及服务例程 ●所有的系统调用返回一个整数值。 。正数或0表示系统调用成功结束 。负数表示一个出错条件 以fs/open.c::sys_open为例 asmlinkage long sys_open(const char_user *filename,int flags,int mode)(...} 。系统调用的返回值与封装例程返回值的约定不同 。内核没有设置或使用errno变量 ·封装例程在获得系统调用返回随之后设置这个变量 。当系统调用出错时,返回的那个负值被存放在errno变量中 返回给应用程序 1口4四1是42在Q0 陈香兰(xianchenoustc,edu,cn)(升算丸应Linux操件系统分析Chapter6系统码月 0 ctober24,20146/31
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 系统调用程序及服务例程 所有的系统调用返回一个整数值。 正数或0表示系统调用成功结束 负数表示一个出错条件 . 以fs/open.c::sys_open为例 . .asmlinkage long sys_open(const char __user *filename, int flags, int mode) {...} 系统调用的返回值与封装例程返回值的约定不同 内核没有设置或使用errno变量 封装例程在获得系统调用返回值之后设置这个变量 当系统调用出错时,返回的那个负值被存放在errno变量中 返回给应用程序 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 6 系统调用 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 24, 2014 6 / 31
系统调用程序及服务例程 ·系统调用处理程序也和其他异常处理程序的结构类似 ①在进程的内核态堆栈中保存大多数寄存器的内容 (即保存恢复进程到用户态执行所需要的上下文) ©调用相应的系统调用服务例程sys_xxx处理系统调用 O通过ret_from_sys_cal1()从系统调用返回 1口+4四是4P在刀00 陈香兰(xianchenoustc,edu,cn)(升算丸应Linx操件系统分析Chapter书系统码用 0 ctober24,20146/31
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 系统调用程序及服务例程 系统调用处理程序也和其他异常处理程序的结构类似 1. 在进程的内核态堆栈中保存大多数寄存器的内容 (即保存恢复进程到用户态执行所需要的上下文) 2. 调用相应的系统调用服务例程sys_xxx处理系统调用 3. 通过ret_from_sys_call()从系统调用返回 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 6 系统调用 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 24, 2014 6 / 31
应用程序、封装例程、系统调用处理程序 及系统调用服务例程之问的关系 User Mode Kernel Mode xyz(){ system_call: sys_xyz(){ xyz() sys_xyz() int Ox80 syscall_exit: itet System call Wrapper routine System call System call invocation in in libc standard handler service routine application library progra圆 4口4四是4P在刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应【inux操作系统分斯Chapter6系统调用 0 ctober24,20147/31
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 应用程序、封装例程、系统调用处理程序 及系统调用服务例程之间的关系 User Mode ... xyz() ... xyz(){ ... int 0x80 ... } Kernel Mode system_call: ... sys_xyz() ... syscall_exit: itet sys_xyz(){ ... } System call invocation in application program Wrapper routine in libc standard library System call handler System call service routine 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 6 系统调用 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 24, 2014 7 / 31
Outline 系统调用和API ② 系统调用机制的实现 ●系统调用分派表 ●系统调用处理函数system cal1 ●系统调用的参数传递 ·系统调用参数的验证 ·如何访问进程的地址空间 ●系统调用的返回 作业和pro,ject 1口t4四1是4200 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linx操作系统分新Chapter6系统玛用 0 ctober24.20148/31
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Outline . 1. 系统调用和API .2 系统调用机制的实现 系统调用分派表 系统调用处理函数system_call 系统调用的参数传递 系统调用参数的验证 如何访问进程的地址空间 系统调用的返回 .3 作业和project 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 6 系统调用 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 24, 2014 8 / 31