Chapter5:系统调用 ■为什么需要系统调用 ■相关数据和代码 ■例:系统调用 getuid(的实现 ■添加一个系统调用 mysyscall 再实现一个稍复杂的系统调用 边干边学— Linux内核指导
边干边学——Linux内核指导 Chapter 5: 系统调用 n 为什么需要系统调用 n 相关数据和代码 n 例:系统调用getuid()的实现 n 添加一个系统调用mysyscall n 再实现一个稍复杂的系统调用
为什么需要系统调用(1) 用户程序调用内核提供的功能 公共系统调用接口 POSIX.1 具体的系统实现 Kerne 边干边学— Linux内核指导
边干边学——Linux内核指导 为什么需要系统调用(1)
为什么需要系统调用(2) 用户空间 模式切换 内核空间 sys_ foo. 模式切换 边干边学— Linux内核指导
边干边学——Linux内核指导 为什么需要系统调用(2)
相关数据和代码 arch/1386/kernel/traps. c arch/1386/kernel/entry. S 系统调用时的内核栈 sys call table system call /ret from sys call include/linux/unistd. h 系统调用编号 宏定义展开系统调用 glibc展开系统调用 INLINE SYSCALL( ( getuid,0) 边干边学— Linux内核指导
边干边学——Linux内核指导 相关数据和代码 n arch/i386/kernel/traps.c n arch/i386/kernel/entry.S 系统调用时的内核栈 sys_call_table system_call和ret_from_sys_call n include/linux/unistd.h 系统调用编号 宏定义展开系统调用 glibc展开系统调用INLINE_SYSCALL (getuid, 0);
系统调用时的内核栈 内核栈 用户栈 向内中断 向外返回 用户空间ss 「函数返回地址 用户空间esp EfLAGS 局部变量 用户空间cs 中断前及iret 用户空间ei 可用空间 (系统调用返回)后 的esp 系统调用号 用户ss 中断后( SAVE ALL前) 及iret前 ( RESTORE ALL后)的 可用空间 陷入内核时,系统自动从当前进程的TSS(任 务状态段)中获得内核栈的SS和ESP,并完 task struct 成栈切换 内核ss 边干边学— Linux内核指导
边干边学——Linux内核指导 系统调用时的内核栈 用户空间ss 用户空间esp EFLAGS 用户空间cs 用户空间eip 系统调用号 可用空间 可用空间 eip 函数返回地址 局部变量 内核栈 用户栈 中断后(SAVE_ALL前) 及iret前 (RESTORE_ALL后)的 esp 内核ss 向外返回 向内中断 中断前及iret (系统调用返回)后 的esp 用户ss task_struct 陷入内核时,系统自动从当前进程的TSS(任 务状态段)中获得内核栈的SS和ESP,并完 成栈切换