分析system_call中断处理过程

一、先在实验楼的虚拟机中MenuOs增加utsname和utsname-asm指令。

具体实现如下:

1、克隆最新新版本的menu,之后进入menu

2、进入test.c,完成之后make rootfs,使系统自动编译自动运行

3.设置分割点,用gdb追踪

4.设置断点

二、然后开始使用gdb追踪系统调用内核函数sys_time

1、设置断点sys_time

2.继续执行,系统会启动到menuos,执行time命令(可发现此命令执行到一半卡住了),可以看到出现了一个断点

3.继续单步执行,直到出现return i

4.设置断点(system_call),继续执行可发现time有返回

三、系统调用分析

系统调用时用户态进入内核态的唯一入口,常用的系统调用有:

    控制硬件:如read/write调用;

    设置系统状态或读取内核数据——getpid()、getpriority()、setpriority()、sethostname();

    进程管理:fork()、clone()、execve()、exit()等。

  • sys_call代码分析
     push1 %eax                   /*将系统调用号压栈*/
     SAVE_ALL
     cmp1$(NR_syscalls),%eax     /*检查系统调用号*/
     jb nobadsys
     mov1 $(-ENOSYS), 24(%esp)    /*堆栈中的eax设置为-ENOSYS,作为返回值*/
     jmp ret_from_sys_call      nobadsys:
     call *sys_call_table(, %eax, 4) #调用系统调用表中调用号为eax的系统调用例程。
     mov1 %eax,EAX(%esp)             #将返回值存入堆栈中
     jmp ret_from_sys_call

分析:

     首先将系统调用号(eax)和可以用到的所有CPU寄存器保存到相应的堆栈中(由SAVE_ALL完成);

     对用户态进程传递过来的系统调用号进行有效检查(eax是系统调用号,它应该小于NR_syscalls),如果是合法的系统调用,再进一步检测该系统调用是否正被跟踪。根据eax中的

系统调用号调用相应的服务例程。

     服务例程结束后,从eax寄存器获得它的返回值,并把这个返回值存放在堆栈中,让其位于用户态eax寄存器曾存放的位置。然后跳转到ret_from_sys_call(),终止系统调用程序的

执行。
  • save_all代码分析
     #define save_all
cld;
push1 %es;
push1 %ds;
push1 %eax;
push1 %ebp;
push1 %edi;
push1 %esi;
push1 %edx;
push1 %ecx;
push1 %ebx;
mov1 $(__KERNEL_DS),%edx;
mov1 %edx, %ds;
mov1 %edx,%es;

分析:

         SAVE_ALL将寄存器的参数压入到核心栈中(这样内核才能使用用户传入的参数)。因为子啊不同特权级之间控制转换时,INT指令不同于CALL指令,它不会将外层堆栈的参数

自动拷贝到内层堆栈中。所以在调用系统调用时,必须把参数指定到各个寄存器中。

四、从system_call开始到iret结束之间的整个过程,可以用流程图表示如下:

五、总结

  • 在系统调用返回之前,可能会发生进程调度(call_schedule),其中可能还会发生中断上下文的切换和进程上下文的切换;

  • 在当前进程的时候,有些信号可能需要处理。

  • 内核可以抽象成是很多种不同的中断处理过程的集合

Linux内核分析第六次作业的更多相关文章

  1. LINUX内核分析第六周学习总结——进程的描述和进程的创建

    LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  2. Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质

    原文:Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质 Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方 ...

  3. LINUX内核分析第六周学习总结——进程的描述与创建

    LINUX内核分析第六周学习总结--进程的描述与创建 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc ...

  4. linux内核分析第六周学习笔记

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

  5. Linux内核分析实验六

    Linux内核分析实验六 进程控制块PCB——task_struct(进程描述符) 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_s ...

  6. Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程

    Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  7. Linux内核分析第六周学习总结:进程的描述和进程的创建

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 ...

  8. "Linux内核分析"第六周实验报告

    张文俊 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1.进程的描述 ...

  9. 【MOOC EXP】Linux内核分析实验六报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的描述和进程的创建 知识点梳理: ...

随机推荐

  1. Codeforces 1100 F - Ivan and Burgers

    F - Ivan and Burgers 思路:线性基+贪心,保存线性基中每一位的最后一个 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #p ...

  2. C# 实现邮件收取发送功能

    .Net调用QQ邮箱发送邮件   话说网上发送邮件的代码很多,但是我由于不细心,导致拿别人的代码发送邮件老是失败,今天就说说几个要注意的地方吧!!! ? 1 2 3 4 5 6 7 8 9 10 11 ...

  3. http content-type 与 java后端处理

    http中的常用的content-type有: application/x-www-form-urlencoded;charset=UTF-8  传递表单类数据 application/json;ch ...

  4. 如何从零开始在github上新建项目

    准备工作: (1)安装git: Git-2.16.1-64-bit.exe (2)新建一个文件夹grpc007,作为本地git仓库 (3)进入到grpc007目录,右键/打开git bash.使用gi ...

  5. Qt-Designer打不开

    安装Qt后双击桌面的Designer没有反应,解决办法就是将安装路径里的qwebengineview.dll文件后缀名加个".bak".

  6. Ubuntu安装vsftpd并通过xftp连接

    1.在ubuntu中安装xftp: sudo apt-get update sudo apt-get install vsftpd sudo service vsftpd restart 2.防火墙添 ...

  7. Win10系列:C#应用控件基础13

    Image控件 开发Windows应用商店应用时,除了在界面中显示文字信息以外,还可以加入图片来配合说明及增加美观度.使用Image控件能够实现显示图片的功能,开发者可以根据需求使图片按照不同的方式显 ...

  8. 201621123075 week8-集合

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 indexOf中对 ...

  9. java通过StringToKenizer获取字符串中的单词根据空格分离-简写版

    public class StringToKenizer { public static void main(String[] args) { String strin = "Hello J ...

  10. python之路--迭代器和生成器

    迭代: 迭代器协议: 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...