扒开系统调用的三层皮(下)

一、给menuOS增加time和time-asm

  通过内核调试系统调用。将上次做的实验加入到menusOS,变成menusOS里面的两个命令。

1 int Getpid(int argc , char * argv[])

2{

3 int pid;

4 pid=getpid();

5 printf("pid=%d\n",pid);

6 return 0;

7 }

8

9 int Getpidasm(int argc , char *argv[])

10 {

11 int pid;

12 asm volatile(

13 "mov $0,%%ebx\n\t"

14 "mov $0x14,%%eax\n\t"

15 "int $0x80\n\t"

16 "mov %%eax, %0\n\t"

17 :"=m"(pid)

18 );

19 printf("pid = %d\n",pid);

20 return 0;

21 }

/*强制删除当前的menuOS*/

/*克隆一个menu*/

/*运行脚本*/

这次的menuOS支持的命令增加,增加了time和time-asm两条命令。

二、使用gdb跟踪系统调用内核函数sys_time

/*13号time对应的内核处理函数sys_time*/

/*启动到menuOS,执行time命令系统调用,停在system time函数的位置*/

如果一直按n单步执行会进入schedule函数。

sys_time返回后进入汇编代码处理gdb无法继续跟踪。

执行0x80之后cpu自动跳转到system_call.

三、系统调用在内核代码中的处理过程

1、系统调用在内核代码中的工作机制和初始化

从int 0x80触发一个系统调用到执行系统调用处理的函数sys time,到返回用户态的整个过程是很重要的。进程调度的时机非常关键。

system call系统调用的处理过程:

初始化中断向量的过程中将0x80与system call联系起来。

通过系统调用号将system call与sys_xyz联系起来。

返回用户态之前有一个调度时机,从systime退出后会跟踪到schedule。

系统调用机制的初始化:

2、简化后便于理解的system call伪代码

系统调用是特殊的中断

system call handler stub ENTRY(system_call)

RING0_INT_FRAME

ASM_CLAC     pushl_cfi %eax

SAVE_ALL              /*宏*/

GET_THREAD_INFO(%ebp)

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) /*根据系统调用号查sys_call_table表里的位置,调用处理函数*/

syscall_after_call:

movl %eax,PT_EAX(%esp)

syscall_exit:     LOCKDEP_SYS_EXIT

DISABLE_INTERRUPTS(CLBR_ANY)

TRACE_IRQS_OFF

movl TI_flags(%ebp), %ecx

testl $_TIF_ALLWORK_MASK, %ecx

jne syscall_exit_work  /*检测当前任务处理jne syscall_exit_work*/

syscall_exit_work: /*如果不处理任务就结束了*/

testl $_TIF_WORK_SYSCALL_EXIT, %ecx

jz work_pending     /*处理信号*/

TRACE_IRQS_ON

ENABLE_INTERRUPTS(CLBR_ANY)

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     /*重新调度*/

在系统调用返回之前有可能发生进程调度(call schedule)

在当前进程有信号发生进程间通讯他会处理当前进程

进程调度过程中会发生进程上下文切换

将内核抽象成很多个中断处理的集合

3、分析system_call到iret的过程

四、总结

  这次实验我学习到从int 0x80触发一个系统调用到执行系统调用处理的函数sys time,到返回用户态的整个过程。学习到了进程调度的时机非常关键。system call系统调用的处理过程是:初始化中断向量的过程中将0x80与system call联系起来。通过系统调用号将system call与sys_xyz联系起来。返回用户态之前有一个调度时机,从systime退出后会跟踪到schedule。这次课程使我对系统调用的过程有了更深的了解。

《Linux内核分析》第五周笔记 扒开系统调用的三层皮(下)的更多相关文章

  1. 《Linux内核分析》第四周笔记 扒开系统调用的三层皮(上)

    扒开系统调用的三层皮(上) 一.用户态.内核态和中断 库函数将系统调用封装起来. 1.什么是用户态和内核态 一般现代CPU都有几种不同的指令执行级别. 在高执行级别下,代码可以执行特权指令,访问任意的 ...

  2. LINUX内核分析第四周学习总结——扒开系统调用的“三层皮”

    LINUX内核分析第四周学习总结--扒开系统调用的"三层皮" 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC ...

  3. 《Linux内核分析》 第四节 扒开系统调用的三层皮(上)

    <Linux内核分析> 第四节 扒开系统调用的三层皮(上) 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com ...

  4. 《Linux内核分析》第四周:扒开系统调用的三层皮

    杨舒雯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 " 一. 用户 ...

  5. LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)

    LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...

  6. LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)

    LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...

  7. 20135327郭皓--Linux内核分析第五周 扒开系统调用的三层皮(下)

    Linux内核分析第五周 扒开系统调用的三层皮(下) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...

  8. linux内核分析第五周学习笔记

    linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  9. Linux内核分析第五周——扒开系统调用的“三层皮”(下)

    Linux内核分析第五周--扒开系统调用的"三层皮"(下) 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.1 ...

随机推荐

  1. RD340服务器安装windows2003系统

    RD340服务器安装windows2003系统云修网

  2. 探索哪个进程使磁盘I/O升高

    如果生产环境中磁盘使用率突然升高,却不知道因为哪个应用程序导致的,这个时候我们可以使用pidstat命令来查看,比如 Linux .el7.x86_64 (ip.ec2.internal) _x86_ ...

  3. July 10th, Week 29th Sunday, 2016

    Everything is good when new, but friend when old. 老朋友更醇香. When did you meet with your last friends l ...

  4. nginx配置静态资源访问

    本篇配置使用场景:本地通过浏览器访问linux上某个文件夹下的文件: 1.安装jdk及nginx步骤省略 2.进入正题 (1) 查看nginx安装路径:[root@localhost conf]# w ...

  5. webpack-dev-server 配置

    webpack.config.js 配置 var ExtractTextPlugin = require("extract-text-webpack-plugin"); var C ...

  6. hashCode相关性能优化

    学习下hashMap中用到的关于hashCode性能优化技巧.作为笔记.为之后并发深入作基础. 1.关于提高性能的hash算法 在被模的位数为2的n次方时,用位与取代效率低下的模运算.位与效率相比模运 ...

  7. [Jsoi2015]染色问题

    题目 看到这个限制条件有点多,我们就一直容斥好了 先容斥颜色,我们枚举至少不用\(i\)种颜色 再容斥列,我们枚举至少不用\(j\)列 最后容斥行,枚举至少不用\(k\)行 容斥系数显然是\((-1) ...

  8. DStream算子讲解(一)

    先把目录列好,方便有条理的进行整理

  9. linux grep 的使用

    常用的 grep 选项有:    -c 只输出匹配行的个数.    -i 不区分大小写(只适用于单字符).    -h 查询多文件时不显示文件名.    -l 查询多文件时只输出包含匹配字符的文件名. ...

  10. leetcode 51. N-Queens 、52. N-Queens II

    51. N-Queens 使用isValid判断当前的位置是否合法 每次遍历一行,使用queenCol记录之前行的存储位置,一方面是用于判断合法,另一方面可以根据存储结果输出最终的结果 class S ...