欢迎使用CSDN-markdown编辑器

分析system_call中断处理过程

一、实验要求

  1. 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推荐在实验楼Linux虚拟机环境下完成实验。
  2. 根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图,撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

二、实验步骤(尚未完成,后期继续完善)

  1. 打开实验楼的虚拟机系统,进入LinuxKernel文件夹中的menu,修改其中的test.c代码,将上周实验中的系统调用函数以子函数的形式加入进去,并相应的添加主函数。
    这里写图片描述

这里写图片描述
这里写图片描述
2. 使用make rootfs进行编译,启动内核
这里写图片描述
3. 内核能够正常启动,help命令能够正常使用,但是调用getppid以及getppid_asm的时候,会出现以下问题,导致系统挂机。
这里写图片描述
4. 通过查询网络,得知这种信息一般都是由内存访问越界造成的,不管是用户态程序还是内核态程序访问越界都会出core, 并在系统日志里面输出一条这样的信息。这条信息的前面分别是访问越界的程序名,进程ID号,访问越界的地址以及当时进程堆栈地址等信息,比较有用的信息是 最后的error number. 以上错误的处理办法我仍在摸索

三、实验分析

  1. 目前由于未能调试成功,故先对实验相关原理进行分析:
    (1)系统调用systemcall:Linux内核系统调用是指所有的操作系统在其内核里都有一些内建的函数,这些函数可以完成一些系统级别的功能。
    (2)这些函数代表了从用户空间到内核空间的一种转换,例如调用getppid函数,则会在内核空间调用sys_getppid
  2. 系统调用过程:
    (1)通过软件中断0x80,系统会跳转到一个预设的内核空间地址,它指向了系统调用处理程序(不要和系统调用服务例程相混淆),即在arch/i386/kernel/entry.S文件中使用汇编语言编写的system_call函数。很显然,所有的系统调用都会同一跳转到这个地址进而执行system_call函数
    (2)软中断指令int 0x80执行时,系统调用号会被放进eax寄存器,同时,sys_call_table每一项占用4个字节。这样,system_call函数可以读取eax寄存器获得当前系统调用的系统调用号,将其乘以4的偏移地址,然后以sys_call_table为基址,基址加上偏移地址所指向的内容即是应该执行的系统调用服务例程的地址。
    (3)除了传递系统调用号到eax寄存器,假如需要,还会传递一些参数到内核,比如write系统调用的服务例程原型为: 调用write系统调用时就需要传递文件描述符fd、要写进的内容buf以及写进字节数count等几个内容到内核。ebx、ecx、edx、esi以及edi寄存器可以用于传递这些额外的参数。
    (4)注:系统调用通过软中断0x80陷进内核,跳转到系统调用处理程序system_call函数,并执行相应的服务例程,但由于是代表用户进程,所以这个执行过程并不属于中断上下文,而是处于进程上下文。
  3. 流程图
    这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值