标签:
攥写人:李鹏举 学号:20132201
( *原创作品转载请注明出处*)
( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 )
实验要求:
选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl
参考视频中的方式使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,推荐在实验楼Linux虚拟机环境下完成实验。
实验过程:
首先,选择使用的系统调用:我选择的是64号 getppid
网上找到关于该函数的使用与说明:getppid(取得父进程的进程识别码)
表头文件 #include<unistd.h>
定义函数 pid_t getppid(void);
函数说明 getppid()用来取得目前进程的 父进程识别码。
返回值 目前进程的父进程识别码。
#include<unistd.h>
main()
{
printf(“My parent ‘pid =%d\n”,getppid());
}
执行
My parent ‘pid =463
然后,进入实验楼,建立文件,利用上述例子编写c语言代码
保存,并用gcc编译 用./运行该文件,可以看到运行的结果:
运行成功,之后再修改文件,改为嵌入式汇编语句:
实验总结:
首先附上完整的代码:
c语言代码:
#include<unistd.h> main() { printf(“My parent ‘pid =%d\n”,getppid()); }
嵌入式汇编代码:
#include <unistd.h> int main() { int a=0; asm volatile( "mov $0,%%ebx\n\t" "mov $0x40,%%eax\n\t" "int $0x80\n\t" "mov %%eax,%0\n\t" :"=m"(a) ); // a = getppid(); printf("the number of pid is:%d",t); }
通过这段汇编代码可以看出程序执行的过程,其中系统调用通过软中断向内核发出明确请求。起码我看出了int $0x80 为AT&T语法的中断指令,通过中断的调用,将把调用号装入eax寄存器实现,然后实现相应的值的个改变的过程。将数值由EAX给到a中。
不过我很怀疑自己是不是哪里做得有问题,汇编的结果和C语言出来的结果有所不同,不过操作系统有不确定性,并且两次打印输出的方式有所不同,因此可能影响了结果的输出,当然也有可能是我汇编语句写的哪里不对,我会向老师、同学查证之后再做修改、完善。
实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(李鹏举)
标签:
原文地址:http://www.cnblogs.com/puputongtong/p/5299566.html