实验者:江军

ID:fuchen1994

实验描述:

    1. 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl

    2. 参考视频中的方式使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,推荐在实验楼Linux虚拟机环境下完成实验。

    3. 根据本周所学知识分析系统调用的工作过程,撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下:

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

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

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

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

 实验过程:

1.知识总结

系统调用:是操作系统为用户态进程与硬件设备进行交互提供的一组接口。Linux操作系统实现一般是:硬件层面->Linux内核->系统调用(服务层次)->应用程序。

库函数:库函数是为了使人们编程更加方面而预先写好常用的函数封装起来,对外提供接口。系统调用是相对高级的服务,如果由用户直接使用可能不是很方便,那么我们可以事先封装系统调用为API,提供给编程人员使用。系统调用是内核态,库函数是用户态,但一般库函数更符合开发需求。库函数中的API不一定全部是系统调用,有些是直接向用户态提供服务,不需要系统调用。

系统调用的执行过程:

API->SYSTEM_CALL->SYS_XXX  其中system_call是运行在内核态的,是所有系统调用在内核的入口点,他在开始的时候保存用户态进程的执行上下文,结束后回复用户态进程的执行上下文,中间通过传入的系统调用号调用对应的中断服务程序。(中断:从用户态进入内核态)   sys_xxx是对应的系统调用封装例程。

2.开始实验

首先,选择系统调用,这里为了实现方便,我选择了getpid

    i386    getpid            sys_getpid

然后,我们打开实验楼的实验环境,编写程序

编译执行

然后我们开始编写汇编代码版本的

执行

代码分析

#include <stdio.h>
#include <unistd.h> int main(void){
pid_t tt;
asm volatile(
"movl $0x14, %%eax\n\t" //将系统调用号赋给eax寄存器
"int $0x80\n\t" //执行系统调用
"movl %%eax, %0\n\t" //将系统调用执行后的返回值赋给变量tt
:"=m"(tt)
);
printf("%u\n",tt);
return ; }

总结:对系统调用机制的理解

系统调用是用户态进程访问硬件的一种方式,它通过中断(int 0x80)由用户态进入内核态。

当一个用户态程序进行系统调用的时候,CPU进入内核态并执行内核函数

系统调用的过程:函数库提供的封装函数接口(API)->system_call(是所有系统调用的入口),这个入口会根据系统调用号(eax入栈),调用对应的系统调用例程

系统调用最多使用6个寄存器作为参数(除eax外)-ebx,ecx,edx,esi,edi,ebp,如果超过6个参数,寄存器中将会保存一个指向内核态可以操作的一块的内存,参数保存在内存上面。

LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. Linux内核分析-两种方式使用同一个系统调用

    实验部分 根据系统调用表,选取一个系统调用.我选得是mkdir这个系统调用,其系统调用号为39,即0x27 由于mkdir函数的原型为 int mkdir (const char *filename, ...

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

    原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...

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

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

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

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

随机推荐

  1. 论文笔记——Factorized Convolutional Neural Networks

    1. 论文思想 将3D卷积分解为spatial convolution in each channel and linear projection across channels. (spatial ...

  2. Ubuntu 14.04 安装adobe flash player

    参考: How to install flash payer in Ubuntu 14.04 LTS? [duplicate] Ubuntu 14.04 安装adobe flash player 32 ...

  3. 【Python】【上下文管理器】

    """#[备注]#1⃣️try :仅当try块中没有异常抛出时才运行else块.#2⃣️for:仅当for循环运行完毕(即for循环没有被break语句终止)才运行els ...

  4. python 打包成tar包

    def make_targz(output_filename, source_dir): with tarfile.open(output_filename, "w:gz") as ...

  5. jekins 插件离线安装

    官网插件地址:http://updates.jenkins-ci.org/download/plugins/ 系统管理->插件管理->高级 选择一个下载好的插件,然后点击上传即可 然后就会 ...

  6. spring boot打jar包发布

    artifactId 是即将打包的包的名称 version 是即将打包的版本号 packaging 是即将打包的格式,这里讲的是jar包 终端输入命令: mvn clean install 然后在ta ...

  7. 转载:oracle RAC集群启动和关闭

    http://www.cnblogs.com/yhfssp/p/8184761.html oracle 11G RAC集群启动和关闭: 1.停止数据库 $srvctl stop database –d ...

  8. Qt_DLL_4_MFC

    1.下载地址: https://github.com/qtproject/qt-solutions 2. ZC: 做用于MFC的DLL的时候,app的创建 只能是在 主线程中,不然的话 就会报错... ...

  9. 雷林鹏分享:C# 属性(Property)

    C# 属性(Property) 属性(Property) 是类(class).结构(structure)和接口(interface)的命名(named)成员.类或结构中的成员变量或方法称为 域(Fie ...

  10. English trip -- MC(情景课)3 D

    xu言: have a nice weekend... sentences How many people are there in you family? they are 3 people in ...