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

一、给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. Jersey常用注解解释 @DET、@PUT、@POST 、@DELETE等

    uri : ... /resource/{id} public voide method(@PathParam("id") String userId){} uri :  .../ ...

  2. 17秋 软件工程 团队第五次作业 Alpha Scrum3

    17秋 软件工程 团队第五次作业 Alpha Scrum3 今日完成的任务 杰麟:java后端学习: 世强:Android的部门基础信息模块的信息显示和对接后台: 港晨:后台管理登陆界面ui设计: 树 ...

  3. SAP CRM 自定义控制器与数据绑定

    当用户从视图离开时,视图将失去它的数据.解决这个问题,需要引入自定义控制器(Custom Controller)(译者注:SAP CRM自定义端中,不同地方的Custom Controller会翻译为 ...

  4. Python 操作 Excel,总有一个模块适合自己

    最近在写性能相关的测试脚本,脚本已经完成,最终怎么体现在报告上,要想让报告看起来漂亮些,我们是先创建一个模板(格式和公式已全部制作好),只需要性能测试完成后往对应的sheet页中填充数据,数据完成后最 ...

  5. <20180930>故障解决记录Cisco RV系列低端路由

    故障描述: 今日网络瘫痪 , 浏览器提示报 DNS出错, 故障现象: 网关能正常分配到IP但内网机器却无法上网. 其中一个WiFi设备竟然还可以通讯(聊天工具)! 故障思路和排查: 1.1 怀疑是上次 ...

  6. 描述整体程序的 app

    一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下 app.js文件 App() 函数用来注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等.object参数说明如下 ...

  7. NOIP2018 AFO记

    仿佛"距NOIP2018还剩30天"的倒计时还在昨天,没想到这一天来的这么快. 考前在机房嘻嘻哈哈打打闹闹,开玩笑说道"我要AFO了",心里暗暗发誓做好自己,不 ...

  8. Android 的窗口管理系统 (View, Canvas, WindowManager)

    http://blog.csdn.net/ritterliu/article/details/39295271 From漫天尘沙 在图解Android - Zygote 和 System Server ...

  9. Android实践--apk反编译

    版权声明:本文为博主原创文章.转载请注明出处. https://blog.csdn.net/ysjian_pingcx/article/details/25468867 Android apk反编译一 ...

  10. PHP开发小技巧②—实现二维数组根据key进行排序

    在PHP中内置了很多对数组进行处理的函数,有很多时候我们直接使用其内置函数就能达到我们的需求,得到我们所想要的结果:但是,有的时候我们却不能通过使用内置函数实现我们的要求,这就需要我们自己去编写算法来 ...