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

姓名:李冬辉

学号:20133201

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

系统调用有关内容

1、什么是系统调用 :操作系统为用户态进程与硬件设备进行交互提供了一组接口。

2、用户态、内核态、中断和系统调用打交道的方式是通过库函数的方式,库函数将系统调用给封装起来了

3、linux系统下如何区分内核态与用户态

在内核态:cs:eip可以是任意的地址,4G的内存地址空间

在用户态:cs:eip只能访问0x00000000—0xbfffffff的地址空间

4、系统调用的三层皮:xyz、system_call和sys_xyz

第一层:API

第二层:中断向量对应的

第三层:系统调用有不同种类的服务程序

5、系统调用的意义:

(1)把用户从底层的硬件编程中解放出来

(2)极大地提高了系统的安全性

(3)使用户程序具有可移植性

API与系统调用

应用编程接口(application program interface, API)和系统调用是不同的。

  • API只是一个函数定义
  • 系统调用通过软中断向内核发出一个明确的请求

Libc库定义的一些API引用了封装例程(wrapper routine,唯一目的就是发布系统调用)。

  • 一般每个系统调用对应一个封装例程
  • 库再用这些封装例程定义出给用户的API

Libc库定义的一些API引用了封装例程(wrapper routine,唯一目的就是发布系统调用)

  • 一般每个系统调用对应一个封装例程
  • 库再用这些封装例程定义出给用户的API

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

  • API可能直接提供用户态的服务
  • 一个单独的API可能调用几个系统调用
  • 不同的API可能调用了同一个系统调用

返回值

  • 大部分封装例程返回一个整数,其值的含义依赖于相应的系统调用
  • -1在多数情况下表示内核不能满足进程的请求

应用程序、封装例程、系统调用处理程序、系统调用服务例程之间的关系

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

选出系统调用号为64的系统调用sys_getppid(),该系统调用用于返回当前进程的父进程进程号数

函数getppid()是glibc对系统调用sys_getppid的封装,用于获取当前进程的父进程的进程号。sys_getppid系统调用号为64.在用户态时候,如果用户调用了getppid(),系统会产生一中断,进入到了内核态执行sys_getppid。getppid()的功能是返回当前进程的父进程的ID,它本身是不能完成的,必须请求操作系统服务即sys_getppid,让操作系统把当前进程的ID告诉给getppid()。

实验截图:

总结:

系统调用的工作机制:

1、应用程序在用户态调用API。

2、API函数将自己对应的系统调用号以及从应用程序得到的参数保存到寄存器中,并触发软中断,使应用程序陷入内核态。

3、system_call()函数根据传入的系统调用号在系统调用列表中查找对应的内核函数,/3、根据寄存器中保存的参数调用该内核函数。

4、内核函数执行完毕之后将执行结果存放到eax寄存器中。

5、中断处理程序执行完毕之后返回,将应用程序带回用户态。

6、被调用的API在最后阶段返回eax中的值并结束API调用。

转载于:https://www.cnblogs.com/petede/p/5278770.html

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

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

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

  2. 在易语言代码中嵌入汇编/机器码

    在易语言代码中嵌入汇编/机器码                    --"置入代码"的使用方法简介 作者:liigo 原文链接:http://blog.csdn.net/liig ...

  3. JavaScript概述和HTML中嵌入JavaScript的三种方式

    "成功没有捷径,脚踏实地一步一个脚印,该来的总会来,不好高骛远,不急功近利,付出总会有回报,不管处于哪个阶段,都要一步一个脚印,踏实的走好每一步!" 目录 01.JavaScrip ...

  4. Java中HashMap遍历的两种方式

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

  5. sh执行文件 参数传递_详解shell中脚本参数传递的两种方式

    方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${ ...

  6. WCF中的ServiceHost初始化两种方式

    在宿主程序中初始化ServiceHost有直接写代码和使用配置文件两种方式.使用ServiceHost首先要引用System.ServiceModel 命名空间. 1 代码方式 using(Servi ...

  7. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  8. Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  9. WCF中的ServiceHost初始化两种方式(宿主)

    在宿主程序中初始化ServiceHost有直接写代码和使用配置文件两种方式.使用ServiceHost首先要引用System.ServiceModel 命名空间. 1 代码方式 using(Servi ...

最新文章

  1. 一个具体的例子学习Java volatile关键字
  2. [云炬创业基础笔记]第六章商业模式测试14
  3. mysql实现日志系统_基于Hadoop/CloudBase/MySQL的日志分析系统的设计与实现
  4. python基本字符_Python基本字符串,基础,之
  5. Docker容器的root用户
  6. python函数调用语句_Python函数定义和函数调用
  7. 圆周移位是怎么移的_想烟道移位,师傅却连连摆手:小区烟道都是统一的,咋能随便改...
  8. UNIX环境高级编程之第4章:文件和文件夹-习题
  9. webrtc 渲染_WebRTC 开发(六)摄像头采集与视频渲染分析
  10. Spring3中的mvc:interceptors标签配置拦截器
  11. 百度云网盘批量复制文件,在线复制到每个文件夹中PC版
  12. 良心推荐:12个免费学习网站,赶紧收藏
  13. mysql文件夹搬家_Mysql 静态文件搬家 注意事项
  14. [工作报告]转载:程序员绩效总结_年终总结怎么写?
  15. 分词器以及ik中文分词器
  16. 瓦力部署系统部署java_Walle瓦力部署系统
  17. Yotta企业云盘容量与安全兼得
  18. html mailto 乱码,outlook会议乱码
  19. uniapp h5 web-view不显示公众号文章
  20. Python 用pyinstaller打包python程序,生成的exe文件过大问题

热门文章

  1. 哈工大计算机组织与体系结构实验二_小猿关注 | 计算机学院组织开展“新生入学实验室安全教育”主题活动...
  2. 通过nginx反向代理解决跨域
  3. 如何将多个excel表格合并成一个_如何将一个视频分割成多个片段
  4. 时区 java 巴黎,关于时区:Java没有有关所有IANA时区的信息
  5. jquery-file-upload限制文件上传大小和文件个数
  6. mysql 额外内存池_MySQL探秘(三):InnoDB的内存结构和特性
  7. python 模块路径搜索_Python模块搜索路径问题
  8. java 字符转换为数字_JAVA中使用字符串转换为数字
  9. freemarker处理EL表达式
  10. springBoot集成多数据源mybatisPlus(自动切换数据源)