作业四:系统调用的工作机制

系统调用的工作机制

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

系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl

  

一、前情提要

系统调用 操作系统为用户态进程与硬件设备进行交互提供了一组接口
API 应用编程接口,是一个函数定义。
系统调用通过软中断向内核发出明确的请求。(eg:sysenter)

  

操作系统提供API和系统调用的关系
Libc库定义的一些API引用封装例程(wrapper routine).
一般每个系统调用对应一个封装例程。
库再用这些封装例程定义给用户的API.

不是每个API对应一个特定系统调用

返回值:1.大部分封装例程返回一个整数,值含义依赖于相应的系统调用;
2.-1,多数情况——内核不满足进程请求。
3.Libc定义errno变量包含特定出错码

  

  

二、两种方式调用系统调用的工作过程

用户态进程——(调用)——>系统调用
CPU——(切换)———内态核执行一个内核函数
linux中,通过执行int $0x80执行系统调用的,此汇编指令产生向量为128的编程异常。
中断向量0x80与system_call绑定起来
系统调用号将xyz和sys_xyz关联起来了。
系统调用三层皮 API XYZ,中断向量system_call,中断服务程序sys_xyz

  

system_call:Linux所有系统调用的入口点。

  

传参:
1.内核实现不同系统调用
2.进程必须指明哪个系统调用,这需要传递一个名为系统调用号的参数。使用EAX寄存器传递 3.ebx,ecx,edx,esi,edi按照顺序存放前五个参数。
4.需要六个或六个以上参数时,应用一个单独的寄存器存放指向所有参数在用户空间地址的指针。
5.返回值用eax

  

寄存器传递参数限制
 1.参数长度小于或等于寄存器长度(32位);
 2.除系统调用号(EAX),参数个数不超6个( EBX,ECX,EDX,ESI,EDI,EBP)

进入内核态后,可访问所有地址空间,通过用户块内存传递数据 下面使用的是getpid的系统调用,查表得  则系统调用号是20

  

1.库函数调用系统调用的工作过程

getpid()函数功能:取得进程识别码,返回值是进程的ID
这里直接使用getpid库函数进行系统调用。
传入的参数为NULL,通过EAX传入,再通过EAX将返回值传回。

  

2.汇编代码调用系统调用的工作过程

系统调用传递第一个参数ebx,这里是null
8行,将ebx清零;
9行,将20放入EAX
11行,返回值用EAX存储
总之,int 80触发中断,找到中断向量表,从表中寻找中断向量(或中断门),通过中断向量,找到系统调用表,找到system_call JMP EAX*4+system_table

  

3.两种方式的编译运行结果分别是2999和3065.

(-14是实验出现了错误,使用了错误的系统调用号) 

4.总结部分

需要阐明自己对“系统调用的工作机制”的理解。

应用程序应该以某种方式(库函数或汇编代码)通知系统
告诉内核自己需要执行一个系统调用,希望系统切换到内核态。
内核就可以代表应用程序在内核空间执行系统调用。
通知内核的机制是靠软中断实现的:
通过引发异常将系统切换内核态执行异常处理程序(系统调用处理程序)。

  

注明“郑伟 + 参考书《内核分析与实现》 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

时间: 2024-10-07 04:59:34

作业四:系统调用的工作机制的相关文章

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

作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用API和gcc嵌入汇编的方式调用system_call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量打印在屏幕上,就必须调用printf,而printf这个函数内部就使用了write这个系统调用.操作系统之所以以system ca

Linux内核实验作业四

实验作业:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 20135313吴子怡.北京电子科技学院 [第一部分]使用库函数API来获取用户标识号.库函数为getuid() 代码如下: 编译运行之后,将用户id号1000打印输出在屏幕上. [第二部分]使用汇编方式触发系统调用来获取用户标识号.库函数依旧为getuid() 代码如下: 可以看出,打印出来的用户id和之前的一样都是1000. [第三部分]系统调用的工作机制学习总结 我认为系统调用的工作机制就是系统调用经过封装包装成为

JVM结构、GC工作机制详解

JVM结构.内存分配.垃圾回收算法.垃圾收集器. 一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时将需要的class加载到JVM中.(右图表示了从java源文件到JVM的整个过程,可配合理解. 关于类的加载机制,可以参考http://blog.csdn.net/tonytfjing/article/details/47212291) 2.执行引擎:负责执行

大数据学习之八——MapReduce工作机制

1.MapReduce的特点 软件框架.并行处理.可靠且容错.大规模集群.海量数据集 2.mapper和reducer mapper负责"分":把复杂的任务分解为若干个"简单的任务"来处理.简单的任务包含三层含义: (1)数据或计算的规模相对原任务要大大缩小: (2)就近计算原则,任务会分配到存放着所需数据的节点上进行计算: (3)这些小任务可以并行计算,彼此间几乎没有依赖关系. reducer负责对map阶段的结果进行汇总. 3.MapReduce的工作机制 (1

业余草分享面试题,JVM结构、GC工作机制详解

题外话:最近在应聘阿里2015暑期实习,感触颇多.机会总是留给有准备的人的,所以平常一定要注意知识的巩固和积累.知识的深度也要有一定的理解,不比别人知道的多,公司干嘛选你?关于JVM和GC,我相信学java的绝大部分人都听过,很多公司的面试官都爱问,一开始我也很头痛,问这么底层干什么,所以我每次面试也只是看看答案敷衍了事.最近面完阿里感觉真不能这样,知识不仅要知其然,还要知其所以然.其实弄懂了JVM和GC,对我们理解很多java知识都有帮助.网上有很多关于GC和JVM的文章,这篇博文主要是根据我

磁盘IO工作机制

磁盘IO工作机制 ref: <深入分析java web 技术内幕> by:许令波 几种访问文件的方式 文件读取和写入的 IO 操作都是调用操作系统提供的接口,因为磁盘设备是由操作系统管理的,应用程序要访问物理设备,只能通过系统调用的方式来工作.读和写分别对应 read()/write() 两个系统调用.而只要是系统调用就可能存在内核空间地址到用户空间地址的切换的问题.这是操作系统为了保护系统本身的运行安全,而将内核程序运行使用的内存空间和用户程序使用的内存空间进行隔离造成的.但是这样虽然保证了

深入分析 Java I/O 的工作机制

I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 I/O 瓶颈.本文的目的正是分析 I/O 的内在工作机制,你将了解到:Java 的 I/O 类库的基本架构:磁盘 I/O 工作机制:网络 I/O 的工作机制:其中以网络 I/O 为重点介绍 Java Socket 的工作方式:你还将了解到 NIO 的工作方式,还有同步和异步以及阻塞与非阻塞的区别,最

深入分析 Java I/O 的工作机制(转载)

声明:本文转自 http://www.ibm.com/developerworks/cn/java/j-lo-javaio/ I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 I/O 瓶颈.本文的目的正是分析 I/O 的内在工作机制,你将了解到:Java 的 I/O 类库的基本架构:磁盘 I/O 工作机制:网络 I/O 的工作机制:其中以网络 I/

MapReduce 工作机制剖析

MapReduce工作机制剖析: 1.     在集群中的任意一个节点提交MapReduce程序: 2.     JobClient收到作业后,JobClient向JobTracker请求获取一个Job ID: 3.     将运行作业所需要的资源文件复制到HDFS上(包括MapReduce程序打包的JAR文件.配置文件和客户端计算所得的输入划分信息),这些文件都存放在JobTracker专门为该作业创建的文件夹中,文件夹名为该作业的Job ID: 4.     获得作业ID后,提交作业: 5.