写在前面:出于对系统调用这一块知识的疑惑,先从网上摘录处一些经典的讲解。


操作系统负责资源管理,当应用层需要使用系统资源时,就会向内核发起系统调用。如:读取文件时发起syscall_read系统调用;建立socket时,发起syscall_socket系统调用等等;

(1)能够触发内核响应的三种操作:

内核在完成引导后,就一直处于等待各种请求的状态,以便做出响应从而实现对硬件资源的管理。

1.系统调用:基于软件中断机制(简称为“软中断”)实现,应用层对内核层发起的请求;

2.异常:如缺页异常,使虚拟地址分配到物理空间;

3.中断:一般为硬件状态改变引起内核响应,如usb设备插入等;

本文主要介绍系统调用,它是由软中断实现的。

1.首先,用户程序为系统调用设置参数。其中一个参数是系统调用编号;

2.参数设置完成后,程序执行“系统调用”指令(这是一个特殊的机器指令);在x86平台上的软中断是由int指令产生的。(不明白?);

3.系统调用指令会产生一个异常:产生一个事件,这个事件首先会导致处理器进行状态切换:用户态——>系统态(或称为内核态),然后跳转到一个新的地址执行异常处理程序,这个程序就是“系统调用处理程序”。


(2)内核空间中的实现

在linux中,每个系统调用都有一个对应的系统调用号。

当用户程序的进程执行一个系统调用时,这个系统调用号就是用来指明到底要执行哪一个系统调用。

(2.2)所有系统调用陷入内核的方式都是一样的,所以仅仅是陷入内核空间是不够的。

因此必须将系统调用号一并传给内核。

在x86上,系统调用号是通过eax寄存器传递给内核的。在陷入内核之前,用户空间就将系统调用号一并传给eax中了。这样系统调用处理程序一旦运行,就可以从eax中得到数据。arm中也是类似操作。

(2.3)

除了系统调用号,一般系统调用还需要传递一些输入参数。系统调用时,也需要把这些参数传递给内核。

最简单的方式:如传递系统调用号一样,将这些参数先存在寄存器中;x86上,ebx,ecx,edx,esi,edi按顺序存放前五个外部输入参数。

如果需要传递的参数多于六个时,可以使用一个单独的寄存器来指向存放所有这些参数在用户空间地址的指针。

(2.4)

内核记录了系统调用表中的所有已注册的系统调用,保存在sys_call_table中。

它与体系结构有关,一般在entry.s中定义。

它是一张由指向实现各种系统调用的内核函数的函数指针组成的表。


用户空间的实现:

linux下三种关系发生系统调用的方法:

1.通过glibc提供的库函数

glibc是Linux下使用的开源的标准C库,它是GNU发布的libc库。glibc为程序员提供丰富的API,出了例如字符串处理,数学运算等用户服务外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装。

好处:封装好的系统调用以API形成存在,容易理解,用户不需要知道更多的内部细节,比如chmod系统调用,我们只需要知道它的作用,不需要知道它的内部实现原理。

同时,使用API形式的系统调用,具有更好的可移植性,glibc方便移植;即使采用的不是glibc的c函数库,也只需要进行少量的修改;

2.使用syscall直接调用

glibc中没有进行封装的系统调用,比如用户私自增加的一个系统调用,这时候就需要利用glibc提供过的syscall函数直接调用(值得深入研究)

3.通过int指令陷入

实际上,用户程序通过软中断指令 int 0x80 来陷入内核态(在Intel Pentium II中又引入了sysenter指令),参数的传递是通过寄存器,eax 传递的是系统调用号,ebx、ecx、edx、esi和edi 来依次传递最多五个参数;

当系统调用返回时,返回值会存在eax中。

linux系统调用理解之摘录(1)相关推荐

  1. linux系统调用理解之摘录(3)

    Linux系统调用需要持续不断地深入理解,因此这里收集一些较好的博客,以便后续自己参考研究: (1)Linux 库函数与系统调用的关系与区别 https://www.cnblogs.com/liwei ...

  2. linux系统调用理解之摘录(2)

    原文博客 http://blog.csdn.net/gatieme/article/details/50779184 Linux系统调用的实现机制分析 本文介绍了系统调用的一些细节. 首先,分析了系统 ...

  3. Linux系统调用的实现机制分析

    [摘要]本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口有怎样的关系.然后,我们考察了内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递系统调用号和 ...

  4. Linux系统调用FAQ

    1. Linux系统调用的作用? 系统调用是操作系统为用户态运行的进程与系统内核.硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口,在应用程序和硬件之间设置一个额外层的优点包括: 1.    ...

  5. 使用 Linux 系统调用的内核命令

    探究 SCI 并添加自己的调用 M. Jones 2010 年 9 月 21 日发布 WeiboGoogle+用电子邮件发送本页面 1 系统调用就是用户空间应用程序和内核提供的服务之间的一个接口.由于 ...

  6. Linux系统调用相关概念

    目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...

  7. Linux系统调用过程分析

    参考: <Linux内核设计与实现> 0 摘要 linux的系统调用过程: 层次如下: 用户程序------>C库(即API):INT 0x80 ----->system_ca ...

  8. [Linux]Linux系统调用列表

    本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...

  9. 别出心裁的Linux系统调用学习法

    别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...

最新文章

  1. 怎么样才能快速的把淘宝店铺推广出去
  2. git中的gitgnore是什么? 码云gitee
  3. RabbitMQ操作代码封装
  4. python 替换array中的值_利用Python提取视频中的字幕(文字识别)
  5. vtigerCrm 目录结构(整理中)
  6. HTML如何消除别的块的影响,CSS清除浮动float的三种方法总结,为什么清浮动?浮动会有那些影响?...
  7. rtmp,rtsp,hLS区别
  8. 2014百度之星第一题Energy Conversion
  9. php5.2.1.1,PHP 5.2.1
  10. EPS数据导入CASS中
  11. 工作中使用BBM:消费者的“闺蜜”级顾问 凯特周智囊团
  12. 搜索引擎的原理以及倒排索引技术
  13. 中文版Cooledit2.1安装程序+插件
  14. 内网渗透中wmic的使用
  15. 9个优秀的标签云免费生成工具
  16. python飞机大战项目总结_python之基础总结(飞机大战)
  17. calfcamel 的 2333
  18. 幼儿园保育员好吗 就业前景如何
  19. R7 4800U和i7 9700K 哪个好
  20. 安卓 类微信界面实现

热门文章

  1. 图像识别中的深度学习【香港中文大学王晓刚】
  2. 《漫画算法2》源码整理-4 字符串匹配算法 RK KMP
  3. MyBatis 源码分析 - 插件机制
  4. MyBatis 源码分析系列文章导读
  5. pinpoint 安装部署
  6. 编码练习——Java-7-集合类
  7. 基于 Jenkins 快速搭建持续集成环境
  8. Java 基础复习实践 --- Hashcode Equals
  9. 旧文重发:做人、做事,做架构师——架构师能力模型解析
  10. 2015年去哪儿网Qunar面试题