system_call中断处理过程分析
ENTRY(system_call)
RING0_INT_FRAME # can't unwind into user space anyway
ASM_CLAC
pushl_cfi %eax # save orig_eax
SAVE_ALL
GET_THREAD_INFO(%ebp)
# system call tracing in operation / emulation
testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
jnz syscall_trace_entry
jae syscall_badsys
syscall_call:
call *sys_call_table(,%eax,4)
syscall_after_call:
movl %eax,PT_EAX(%esp) # store the return value
syscall_exit:
LOCKDEP_SYS_EXIT
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
# setting need_resched or sigpending
# between sampling and the iret
TRACE_IRQS_OFF
movl TI_flags(%ebp), %ecx
testl $_TIF_ALLWORK_MASK, %ecx # current->work
jne syscall_exit_work restore_all:
TRACE_IRQS_IRET
restore_all_notrace:
#ifdef CONFIG_X86_ESPFIX32
movl PT_EFLAGS(%esp), %eax # mix EFLAGS, SS and CS
# Warning: PT_OLDSS(%esp) contains the wrong/random values if we
# are returning to the kernel.
# See comments in process.c:copy_thread() for details.
movb PT_OLDSS(%esp), %ah
movb PT_CS(%esp), %al
andl $(X86_EFLAGS_VM | (SEGMENT_TI_MASK << ) | SEGMENT_RPL_MASK), %eax
cmpl $((SEGMENT_LDT << ) | USER_RPL), %eax
CFI_REMEMBER_STATE
je ldt_ss # returning to user-space with LDT SS
#endif
restore_nocheck:
RESTORE_REGS # skip orig_eax/error_code
irq_return:
INTERRUPT_RETURN
- 其中RING0_INT_FRAME是一个宏,在/arch/x86/kernel/entry_32.S文件内。展开如下:
.macro RING0_INT_FRAME
CFI_STARTPROC simple
CFI_SIGNAL_FRAME
CFI_DEF_CFA esp, *
/*CFI_OFFSET cs, -*;*/
CFI_OFFSET eip, -*
.endm
- ASM_CLAC同样是一个宏,定义在/arch/x86/include/asm/smap.h文件内。作用是加强SMAP保护的作用( Supervisor Mode Access Prevention 管理模式访问保护,intel提供了两条指令STAC和CLAC用于临时打开/关闭这个功能 )。
- 接下来将eax压栈以保存系统调用号。
- SAVE_ALL宏展开为:
.macro SAVE_ALL
cld
PUSH_GS
pushl_cfi %fs
/*CFI_REL_OFFSET fs, ;*/
pushl_cfi %es
/*CFI_REL_OFFSET es, ;*/
pushl_cfi %ds
/*CFI_REL_OFFSET ds, ;*/
pushl_cfi %eax
CFI_REL_OFFSET eax,
pushl_cfi %ebp
CFI_REL_OFFSET ebp,
pushl_cfi %edi
CFI_REL_OFFSET edi,
pushl_cfi %esi
CFI_REL_OFFSET esi,
pushl_cfi %edx
CFI_REL_OFFSET edx,
pushl_cfi %ecx
CFI_REL_OFFSET ecx,
pushl_cfi %ebx
CFI_REL_OFFSET ebx,
movl $(__USER_DS), %edx
movl %edx, %ds
movl %edx, %es
movl $(__KERNEL_PERCPU), %edx
movl %edx, %fs
SET_KERNEL_GS %edx
.endm
- 首先是将寄存器内容压栈,保存当前上下文。接着将_USER_DS内容写入DS(数据段寄存器)和ES(代码段寄存器)两个寄存器。目的是为了减少从内核态返回的开销【1】。
- 获取thread_info结构的地址,检测thread_info中的标志是否有跟踪。
- 有跟踪则执行系统跟踪的代码,然后通过将给定的系统调用号与NR_syscalls作比较以检查其有效性。
- syscall_call是整个代码的关键部分,通过传进来的系统调用号,在系统调用表sys_call_table中取对应的系统调用处理函数,表项以32位存放,所以给调用号乘以4。
- 调用结束之后,储存处理函数的返回值eax
- 在返回用户态之前先关中断。
- syscall_exit_work进行了进程调度、消息传递的工作,进程切换可导致新的中断或系统调用
- 【work_pending中判断NEED_RESCHED,由结果执行work_resched重新进行进程调度,或进入work_notifysig处理信号】
- 最后从restore开始执行退出调用的操作。

By:昆仑雪狐
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
system_call中断处理过程分析的更多相关文章
- 分析system_call中断处理过程
分析system_call中断处理过程 上周我们使用gcc内嵌汇编调用系统调用,这次我们具体分析下过程. 将getpid嵌入menuos 代码从github下载,步骤如下: 1. 增加一个函数,get ...
- 20135202闫佳歆--week5 分析system_call中断处理过程--实验及总结
week 5 实验:分析system_call中断处理过程 一.使用gdb跟踪分析一个系统调用内核函数(上周选择那一个系统调用)--getpid 复习视频: 如何实现? - 更新menu代码到最新版 ...
- 《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程 20135311傅冬菁
20135311傅冬菁 原创作品 <Linux内核分析>MOOC课程 分析system_call中断处理过程 内容分析与总结: 系统调用在内核代码中的工作机制和初始化 系统调用在用户态中 ...
- 作业五:分析system_call中断处理过程
分析system_call中断处理过程 一.MesuSO增加getpid和getpid-asm 二.使用GDB跟踪系统调用内核函数sys_getpid 分析system_call中断处理过程 使用gd ...
- 《Linux内核分析》第五周:分析system_call中断处理过程
实验 分析system_call中断处理过程 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/l ...
- Linux内核分析-分析system_call中断处理过程
姓名:江军 ID:fuchen1994 分析system_call中断处理过程 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shi ...
- Linux内核设计第五周学习总结 分析system_call中断处理过程
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用gdb跟踪分析一 ...
- Linux内核分析第五周学习总结——分析system_call中断处理过程
Linux内核分析第五周学习总结--分析system_call中断处理过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- 通过分析system_call中断处理过程来深入理解系统调用
通过分析system_call中断处理过程来深入理解系统调用 前言说明 本篇为网易云课堂Linux内核分析课程的第五周作业,上一次作业中我以2个系统调用(getpid, open)作为分析实例来分析系 ...
随机推荐
- java 选择排序
import java.util.Scanner; public class SelectionSort { public static void sort(int[] a, int n){ if(n ...
- git使用和理解之一(不含分支)
0.前言 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 工作区和暂存区: 我们写代码的地方就是工作区,代码写完后, ...
- 30 天精通 Git 版本控管
https://github.com/doggy8088/Learn-Git-in-30-days
- 【转】responseText,responseBody,responseXML差别
为了做ajax的代理,研究了下服务器端的xmlhttp和客户端ajax中的xmlhttp,做了个比较 由于我一直使用JavaScript作为Asp的教本语言,所以比较起来更清楚.服务器端的xmlhtt ...
- 第三篇:Retrofit SDK的设计思路
2016-05-08 15:24:03 Retreofit毫无疑问是一个优美的开源框架,有轻量级.耦合性低.扩展性好.灵活性高的特点,那么Retrofit的设计者们到底是怎么样做到这些的呢?我希望能够 ...
- DeepLearning之路 (五) CNN
自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN),期间配置和使用过theano和cuda-convnet.cuda-convnet2. ...
- Java中main函数只能调用同类中的静态方法?
如果想调用本类中的非静态方法可以这么来写: public class TT{ public static void main(String[] args){ TT t = new TT(); t.fu ...
- Fragment中的onKeyDown事件让Activity处理--处理特殊按键比如移动终端扫描
一些特殊按键事件需要在Activity中处理public void onKeyDown(int keyCode, KeyEvent event){ //让Activity处理 getActivity( ...
- 【解决方法】安装Win7和linux双系统后,linux报错“无法分配所提交的分区 not enough free space on disks”问题,以及win7无法启动“BootMGR image is corrupt....”问题
近日,在笔记本上重装了Win7 企业版(64位)后,想装个linux双系统,于是开始安装 centOS 6.2(光盘安装) 硬盘分了一个主分区(c盘),一个扩展分区(3个逻辑分区:d,e,f盘),然后 ...
- Android Fragment (二) 实例1
千呼万唤始出来,今天就也写一篇Frament 的简单实例.先看效果: 一看这效果,首先我们的配置资源文件:new -->android xml -->selector --> 四个图 ...