实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
如果我写的不好或者有误的地方请留言
题目自拟,内容围绕系统调用的工作机制进行;
博客中需要使用实验截图
博客内容中需要仔细分析汇编代码调用系统调用的工作过程,特别是参数的传递的方式等。
总结部分需要阐明自己对“系统调用的工作机制”的理解。
实验报告:
1.首先完成time系统调用
mytime.c是直接利用API函数
#include <stdio.h>
#include <time.h> int main()
{
time_t tt;
tt = time(NULL);
struct tm *t;
t = localtime(&tt);
printf("time:%d-%d-%d %d:%d:%d\n",t->tm_year+,t->tm_mon+,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
return ;
}
myasmtime.c是利用嵌入式汇编进行系统调用
#include <stdio.h>
#include <time.h> int main()
{
time_t tt;
struct tm *t; asm volatile(
"mov $0,%%ebx\n\t"
"mov $0xd,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(tt)
);
t = localtime(&tt);
printf("time:%d-%d-%d %d:%d:%d\n",t->tm_year+,t->tm_mon+,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
return ;
}
打印输出结果 都正确显示了当前的时间

2.接下来实现自己的系统调用
myfork.c是直接利用API
include <stdio.h>
#include <unistd.h> int main()
{
pid_t fpid;
fpid = fork();
if(fpid < )
{
printf("error in fork!\n");
}
else if(fpid == )
{
printf("i am child,process id :%d.\n",getpid());
}
else
{
printf("i am parent,process id :%d.\n",getpid());
}
return ;
}
myasmfork.c是通过嵌入式汇编
nclude <unistd.h> int main()
{
pid_t fpid; asm volatile(
"mov $0x2,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(fpid)
); if(fpid < )
{
printf("error in fork!\n");
}
else if(fpid == )
{
printf("i am child,process id :%d.\n",getpid());
}
else
{
printf("i am parent,process id :%d.\n",getpid());
}
return ;
}
实验结果都可以创建一个新的进程

3.思路都是一样的:
a.首先将中断号填入%eax
b.然后执行中断int $0x80
c.最后将结果返回到内存变量中
d.如果要传递参数 可以将参数存放在寄存器中做操作
4.需要记住的:
a.系统调用的意义:
把用户从底层的硬件编程中解放出来
极大的提高了系统的安全性
使用户程序具有可移植性
b.API和系统调用
API只是一个函数定义
系统调用通过软中断向内核发出一个明确的请求
LinbC库定义的一些API引用了封装例程
一般每个系统调用对应一个封装例程
库再用这些封装例程定义出给用户使用的API
不是每个API都对应一个特定的系统调用
5.一个很重要的东西
系统调用号
6.应用程序、封装例程、系统调用处理程序、系统调用服务例程 关系图
懒得画了 引用课件中的图

实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用的更多相关文章
- 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...
- 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...
- 20135202闫佳歆--week4 两种方式使用同一个系统调用--实验及总结
实验四 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 在这里我选择的是第20号系统调用,getpid. 1.使用库函数API: 代码如下: /* getpid.c */ #incl ...
- 通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制
作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用A ...
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call. 系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变 ...
- linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量 ...
随机推荐
- javax.el.PropertyNotFoundException错误
在J2EE项目的开发过程中,遇到了这个问题,报错如下: 错误原因为在我model里的Person类里定义了一个Name属性,但是读取属性的getter方法的,一般按照属性首字母小写来处理,所以把Nam ...
- poj 1149 最大流
题目链接:http://poj.org/problem?id=1149 #include <cstdio> #include <cmath> #include <algo ...
- hdu 3062 2-sat入门题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3062 #include <cstdio> #include <cmath> # ...
- Piotr's Ants UVa 10881
#include <cstdio> #include <cmath> #include <algorithm> #include <iostream> ...
- poj1003
题目大意:超越悬挂 你可以把卡片最远堆到距离桌子多远?如果你有一张卡片,你可以堆卡片长度的一半如果有两张卡片那么可以堆1/2+1/3=5/6,如果有n张卡片那么可以堆1/2+1/3+1/4+..... ...
- OC类方法和实例方法 及常用的for/in方法
类方法前面有+,实例方法前面有- 类方法和实例方法的区别在于,类方法不能使用实例变量. 使用类方法主要原因有: 1.类方法的使用不依赖于实例化一个对象,也就是说如果一个功能的实现不需要实例化对象,就可 ...
- 使用Xcode8的Instruments检测解决iOS内存泄露(leak)
在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原 ...
- Mongodb快速入门之使用Java操作Mongodb
[IT168 专稿]在上一篇文章中,我们学习了Mongodb的安装和初步使用,在本文中,将学习如何使用Java去编程实现对Mongodb的操作. HelloWorld程序 学习任何程序的第一步,都是编 ...
- HDU--2040
亲和数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- Rx 入门 示例
首先写一个观察者模式 public interface Watcher { public void update(String str); } public class ConcreteWatcher ...