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

如果我写的不好或者有误的地方请留言

  1. 题目自拟,内容围绕系统调用的工作机制进行;

  2. 博客中需要使用实验截图

  3. 博客内容中需要仔细分析汇编代码调用系统调用的工作过程,特别是参数的传递的方式等。

  4. 总结部分需要阐明自己对“系统调用的工作机制”的理解。

实验报告:

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代码中嵌入汇编代码两种方式使用同一个系统调用的更多相关文章

  1. 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...

  2. 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)

    使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...

  3. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  4. LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...

  5. Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...

  6. 20135202闫佳歆--week4 两种方式使用同一个系统调用--实验及总结

    实验四 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 在这里我选择的是第20号系统调用,getpid. 1.使用库函数API: 代码如下: /* getpid.c */ #incl ...

  7. 通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制

    作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用A ...

  8. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call. 系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变 ...

  9. linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量 ...

随机推荐

  1. POJ 2376 贪心

    题意:FJ希望它的牛做一些清洁工作.有N只牛和T个时间段,每只牛可以承担一段时间内的工作.FJ希望让最小数量的牛覆盖整个T,求出其数量.若无法覆盖整个T,则输出-1. 分析:首先要注意T表示T个时间段 ...

  2. 第一节:Scrapy开源框架初探

       Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.  具体开发流程如下:   一.确定待抓取网站 当您需要从某 ...

  3. Intellij调试debug

    先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试. IDE下方出现Debug视图,红色的箭头指 ...

  4. 协议系列之HTTP协议

    什么是HTTP\HTTPS HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.HTTP协议用于从WWWserver传输超文本到本地浏览器的传输协议,它能使浏览 ...

  5. Android抓包工具Fiddler抓取数据

    1.手机端设置 2.Fiddler设置监听 Tools/Fiddler options 是否允许监听到https(Fiddler默认只抓取http格式的),首次点击会弹出是否信任fiddler证书和安 ...

  6. Jinja2模版语言自定义filter的使用

    Jinja2模版语言,自带有一些filter,能够在前端的模版中控制数据按照相应的方式显示.比如以下两种filter,分别能在前端控制数字的近似精度显示和根据字符串长度补齐: round(value, ...

  7. Error parsing XML: not well-formed (invalid token) 报错+R文件消失解决的方法

    xml报错: 这个xml文件上右键source ->format 注意:res下的文件名称不能大写 R文件消失: 在攻克了其它问题的情况下(或者其它问题还没解决先凝视掉) 手动删除gen pro ...

  8. HDU--2040

    亲和数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  9. jsp页面禁用缓存

    问题:为什么禁用JSP页面缓存 就是为了得到实时信息 怎样禁用JSP页面缓存 1.在JSP页面设置 <meta http-equiv="pragma" content=&qu ...

  10. linux 调试

    strace gdb tcpdump valgrind perf