Linux内核分析 笔记五 扒开系统调用的三层皮(下) ——by王玥
(一)给MenuOs增加time和time-asm命令
- 更新menu代码到最新版
- 在main函数中增加MenuConfig
- 增加对应的Ttime和TimeAsm函数
- make rootfs


(二)使用gdb跟踪系统调用内核函数sys_time
1.sys_time返回后进入汇编代码处理gdb无法继续跟踪
2.执行0x80之后执行system_call对应的代码

3.entry32.s中system_call 不是一个函数,只是一段汇编代码的起点,gdb不能跟踪它。

(三)系统调用在内核代码中的处理过程
1.系统调用在内核代码中的工作机制和初始化
- 系统调用的工作机制:
通知内核的机制是靠软中断实现的:在x86系统上预定义的软中断是中断号128,通过int$0x80指令触发该中断,这条指令会触发一个异常导致系统切换到内核态并执行128号异常处理程序,即system_call().
- 系统调用机制的初始化:

2.简化后便于理解的system_call伪代码
1.系统调用其实就是一个特殊的中断
2.伪代码如下:

3.代码分析:
# system call handler stub
ENTRY(system_call)            #系统调用处理入口(内核态)
    RING0_INT_FRAME         # can't unwind into user space anyway
    ASM_CLAC
    pushl_cfi %eax          # save orig_eax #保存eax,也就是调用号
    SAVE_ALL              # 保存寄存器
    GET_THREAD_INFO(%ebp) # 获取thread_info结构中ebp的值
                    # system call tracing in operation / emulation
    testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)   # 检测是否由系统跟踪
    jnz syscall_trace_entry     # 有系统跟踪则先去执行
    cmpl $(NR_syscalls), %eax   # 比较输入的系统调用号 是否大于 最大的系统调用号
    jae syscall_badsys          # 大于 则无效,退出
syscall_call:
    call *sys_call_table(,%eax,4) # 在系统调用表中的调用相应的服务例程,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
syscall_exit_work:
    testl $_TIF_WORK_SYSCALL_EXIT, %ecx
    jz work_pending     # 测试是否退出前还有工作要处理,如果有的话跳转到work_pending
    TRACE_IRQS_ON       # 开启系统中断跟踪
    ENABLE_INTERRUPTS(CLBR_ANY)  # could let syscall_trace_leave() call
    # 允许中断   # schedule() instead
    movl %esp, %eax
    call syscall_trace_leave
    jmp resume_userspace   # 恢复用户空间
END(syscall_exit_work)
work_pending:
    testb $_TIF_NEED_RESCHED, %cl  # 是否有需要继续调度的相关信号
    jz work_notifysig     # 跳转到处理信号相关的代码处
work_resched:
    call schedule     # 时间调度, 进程调度的时机在这里处理
    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
    andl $_TIF_WORK_MASK, %ecx    # is there any work to be done other  是否还有其他工作要处理
                    # than syscall tracing?
    jz restore_all      #如果没有的话就恢复中断上下文,也就是恢复进入之前保存的寄存器相关内容
    testb $_TIF_NEED_RESCHED, %cl
    jnz work_resched
work_notifysig:        # deal with pending signals and
                       # notify-resume requests
#ifdef CONFIG_VM86
    testl $X86_EFLAGS_VM, PT_EFLAGS(%esp)
    movl %esp, %eax
    jne work_notifysig_v86        # returning to kernel-space or
                                  # vm86-space
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 << 8) | SEGMENT_RPL_MASK), %eax
    cmpl $((SEGMENT_LDT << 8) | USER_RPL), %eax
    CFI_REMEMBER_STATE
    je ldt_ss           # returning to user-space with LDT SS
#endif
restore_nocheck:
    RESTORE_REGS 4          # skip orig_eax/error_code
irq_return:
    INTERRUPT_RETURN
4.流程图:

- 在系统调用返回之前,可能发生进程调度,进程调度里就会出现进程上下文的切换
- 进程间通信可能有信号需要处理
Linux内核分析 笔记五 扒开系统调用的三层皮(下) ——by王玥的更多相关文章
- LINUX内核分析第四周——扒开系统调用的三层皮
		LINUX内核分析第四周--扒开系统调用的三层皮 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course ... 
- 20135327郭皓--Linux内核分析第四周 扒开系统调用的三层皮(上)
		Linux内核分析第四周 扒开系统调用的三层皮(上) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ... 
- linux内核分析 第四周 扒开系统调用的三层皮(上)
		一.用户态.内核态和中断处理过程 系统调用是用户通过库函数方式:库函数帮我们把系统调用封装起来. 内核态:高级别执行,可以使用特权指令,访问任意的物理地址. 用户态:低级别执行,代码范围受到限制. C ... 
- #Linux第四周学习总结——扒开系统调用的三层皮(上)
		Linux第四周学习总结--扒开系统调用的三层皮(上) 一.用户态.内核态和中断 系统调用通过库函数. 1.用户态和内核态 区分(不同的指令执行级别): 用户态:在相应的低执行状态下,代码的掌控范围受 ... 
- Linux内核及分析 第四周 扒开系统调用的三层皮(上)
		实验过程 选择20号系统调用getpid(取得进程识别码) 在网上查询getpid函数的C语言代码以及其嵌入式汇编语句 C语言代码: #include <stdio.h> #include ... 
- 20135337朱荟潼 Linux第四周学习总结——扒开系统调用的三层皮(上)
		朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 知识点梳理 一.用 ... 
- Linux内核分析——第五章  系统调用
		第五章 系统调用 5.1 与内核通信 1.系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: (1)为用户空间提供了一种硬件的抽象接口 (2)系统调用保证了系统的稳定和安全 ( ... 
- 《Linux内核分析》第五周笔记 扒开系统调用的三层皮(下)
		扒开系统调用的三层皮(下) 一.给menuOS增加time和time-asm 通过内核调试系统调用.将上次做的实验加入到menusOS,变成menusOS里面的两个命令. 1 int Getpid(i ... 
- LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)
		LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ... 
随机推荐
- cobaltstrike3.8服务器搭建及使用
			参考链接: https://www.ezreal.net/archives/166.htmlhttp://blog.cobaltstrike.com/category/cobalt-strike-2/ ... 
- Beta冲刺! Day3 - 砍柴
			Beta冲刺! Day3 - 砍柴 今日已完成 晨瑶:追查进度:确定推荐算法 昭锡:查看Note模块的处理逻辑.查找主页UI的解决方案 永盛:数据库的大量整合和新建,备份和还原:完成部分新的逻辑 立强 ... 
- span 文本内容超过宽度自动换行
			span{word-break:normal; width:auto; display:block; white-space:pre-wrap;word-wrap : break-word ;over ... 
- PC端和移动APP端CSS样式初始化
			CSS样式初始化分为PC端和移动APP端 1.PC端:使用Normalize.css Normalize.css是一种CSS reset的替代方案. 我们创造normalize.css有下面这几个目的 ... 
- Jedis使用管道优化批量输出插入的效率
			Jedis连接池: package com.daxin.jedis_datastructure; /** * * @author daxin * * @email leodaxin@163com * ... 
- 模板题Pollard_Rho大数分解  A - Prime Test POJ - 1811
			题意:是素数就输出Prime,不是就输出最小因子. #include <cstdio> #include<time.h> #include <algorithm> ... 
- mocha测试框架-truffle
			https://mochajs.org/ 学习网址: https://www.jianshu.com/p/9c78548caffa https://www.jb51.net/article/10646 ... 
- ethereum/EIPs-160 EXP cost increase
			eip title author type category status created 160 EXP cost increase Vitalik Buterin Standards Track ... 
- 3902-luogu 最长不下降子区间
			题目 现有数列A1,A2,…An ,修改最少的数字,使得数列严格单调递增. 依旧是书上的题 但是书上的范围比较小 而 lg上的数据范围很大 按书上的 方法 是会超时 只能过一半的数据 但是 算法思路还 ... 
- 这款 WordPress商用插件 0day 漏洞满满,且已遭利用
			Wordfence 安全研究员发布报告称,WordPress 商用插件 Total Donations 受多个 0day 漏洞的影响,且这些漏洞已遭利用. 这些严重的漏洞影响所有已知的 Total D ... 
