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

一、给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. 类的反射_reflex

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为j ...

  2. for(var i=1;i<=3;i++){ setTimeout(function(){ console.log(i); },0); };答案:4 4 4。

    看面试题时,发现了一道较为经典的面试题,代码如下 for(var i=1;i<=3;i++){ setTimeout(function(){ console.log(i); },0); }; / ...

  3. JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配

    Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.newarray.anewarray和mu ...

  4. Django之views

    一 URL补充 二 Views试图函数 一 URL补充 1 MTV模型 2  django建立流程(用命令版) (1)django-admin startproject projectname (2) ...

  5. python第四十八课——类函数和对象函数

    5.类函数和对象函数 类函数:在定义函数的上面一行书写@classmethod,特点:没有self 有cls 对象函数:定义在class中的普通的def函数 演示类函数和对象函数的定义使用: 总结: ...

  6. window10+linux双系统安装

    参考教程 安装Windos U盘制作 启动UltraISO,点击“文件”菜单下的“打开”按钮,打开已准备好的ISO镜像文件,如JINHU_SYSTEM_TOOL_2009.iso 刻录U盘过程.点击菜 ...

  7. day15 Python风湿理论之函数即变量

    eg1.定义foo门牌号,调用foo函数,打印,再找bar门牌号,找不到,报错 def foo(): print('from foo') bar() foo() 结果:报错 from foo Trac ...

  8. ftp、ssh

    ftp.ssh都是网络传输的协议,两者一般用来访问服务器,支持ftp的服务器称为ftp服务器,支持ssh的服务器称为ssh服务器. 说白了就是不同的访问方式,ssh更加安全,有相应的密匙 https: ...

  9. Ubuntu sudo apt-get 安装下载更新软件包命令详解

    sudo apt-get install package                    安装软件包sudo apt-get install package - - reinstall 重新安装 ...

  10. Zephyr的Shell

    1 前言 通过Shell可以跟子系统打交道,子系统也可以提供很多接口供外部设置和读取信息. 下面就Shell的Kconfig配置.Shell的使用以及如何新建一个Shell命令展开. 可以说Shell ...