Linux内核作业之扒开系统调用的三层皮(下)

  1. 说明
    刘玉龙
    原创作品转载请注明出处
    《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    这是上一周作业的连接 http://blog.csdn.net/u011407724/article/details/44735153
    由于这次能用到,所以import一下

  2. 实验要求
    分析system_call中断处理过程
    使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推荐在实验楼Linux虚拟机环境下完成实验。
    根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图,撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下:
    题目自拟,内容围绕系统调用system_call的处理过程进行;
    博客内容中需要仔细分析system_call对应的汇编代码的工作过程,特别注意系统调用返回iret之前的进程调度时机等。
    总结部分需要阐明自己对“系统调用处理过程”的理解,进一步推广到一般的中断处理过程。
  3. 我们使用了sysinfo这个库函数API。
    下面的三张实验图显示了我们已经成功的使用gdb调试跟踪到了sysinfo这个系统调用(函数名为sys_sysinfo),但是随后使用next命令继续调试时,显然无法再继续调试了,因为不能直接使用gdb来对使用汇编代码编写的system_call进行调试和追踪。对test.c进行改写,增加mkdir1(c语言实现),mkdir2(嵌入式汇编实现)。具体代码如下:
    代码:::
#include <sys/stat.h>
#include <sys/types.h>

...

int mkdir1(int argc, const char * argv[]) {
    // insert code here...
    int intr;
    mode_t mode=S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;


   intr=mkdir("temp",mode);


    if(intr==-1)
    {
    printf("directory create Fail!intr=%d\n",intr);
    return -1;
    }

    printf("the actual number of bytes %d \n",intr);

  return 0;
}

int mkdir2(int argc, const char * argv[]) {
    // insert code here...
    int intr;
    mode_t mode=S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;

    asm volatile ("int $0x80"
                  : "=a" (intr)
                  : "a" (39), "b" ("temp-asm"), "c" (mode)
                  : "memory");


    if(intr==-1)
    {
    printf("directory create Fail!intr=%d\n",intr);
    return -1;
    }

    printf("the actual number of bytes %d \n",intr);

  return 0;
}

int main()
{
    ...

    MenuConfig("mkdir","create a directory",mkdir1);
    MenuConfig("mkdir-asm","create a directory(asm)",mkdir2);
    ...
}

运行的结果:上图—->
5.1
图二
这里写图片描述
这里就是重点了,上面的图中和以前的课程结合一下不难看出 蹊跷。
4.接着用gdb来调试
这里写图片描述
所以说:
int 0x80可以出发系统调用system_call,
这次的作业真的感觉没有什么写的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值