说明
刘玉龙
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000这是上一周作业的连接 http://blog.csdn.net/u011407724/article/details/44735153
由于这次能用到,所以import一下- 实验要求
分析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之前的进程调度时机等。
总结部分需要阐明自己对“系统调用处理过程”的理解,进一步推广到一般的中断处理过程。 - 我们使用了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);
...
}
运行的结果:上图—->
图二
这里就是重点了,上面的图中和以前的课程结合一下不难看出 蹊跷。
4.接着用gdb来调试
所以说:
int 0x80可以出发系统调用system_call,
这次的作业真的感觉没有什么写的。