0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

透了解系统调用助你成为Linux下编程高手

Q4MP_gh_c472c21 来源:未知 作者:胡薇 2018-05-11 11:27 次阅读

什么是系统调用?

Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。

随Linux核心还提供了一些C语言函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。

为什么要用系统调用?

实际上,很多已经被我们习以为常的C语言标准函数,在Linux平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各种系统调用是初步的要求。进一步,若想成为一名Linux下编程高手,也就是我们常说的Hacker,其标志之一也是能对各种系统调用有透彻的了解。

即使除去上面的原因,在平常的编程中你也会发现,在很多情况下,系统调用是实现你的想法的简洁有效的途径,所以有可能的话应该尽量多掌握一些系统调用,这会对你的程序设计过程带来意想不到的帮助。

系统调用是怎么工作的?

一般的,进程是不能访问内核的。它不能访问内核所占内存空间也不能调用内核函数。CPU硬件决定了这些(这就是为什么它被称作"保护模式")。系统调用是这些规则的一个例外。其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。在Intel CPU中,这个由中断0x80实现。硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统的内核--所以你就可以为所欲为。

进程可以跳转到的内核位置叫做sysem_call。这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程(或到其他进程,如果这个进程时间用尽)。

具体过程如下图所示:

如何使用系统调用?

先来看一个例子:

这是因为在time.h中实际上已经用库函数的形式实现了time这个系统调用,替我们省掉了调用_syscall1宏展开得到函数原型这一步。

大多数系统调用都在各种C语言函数库中有所实现,所以在一般情况下,我们都可以像调用普通的库函数那样调用系统调用,只在极个别的情况下,我们才有机会用到_syscall*()这几个宏。

调用性能问题

系统调用需要从用户空间陷入内核空间,处理完后,又需要返回用户空间。其中除了系统调用服务例程的实际耗时外,陷入/返回过程和系统调用处理程序(查系统调用表、存储\恢复用户现场)也需要花销一些时间,这些时间加起来就是一个系统调用的响应速度。系统调用不比别的用户程序,它对性能要求很苛刻,因为它需要陷入内核执行,所以和其他内核程序一样要求代码简洁、执行迅速。幸好Linux具有令人难以置信的上下文切换速度,使得其进出内核都被优化得简洁高效;同时所有Linux系统调用处理程序和每个系统调用本身也都非常简洁。

绝大多数情况下,Linux系统调用性能是可以接受的,但是对于一些对性能要求非常高的应用来说,它们虽然希望利用系统调用的服务,但却希望加快相应速度,避免陷入/返回和系统调用处理程序带来的花销,因此采用由内核直接调用系统调用服务例程,最好的例子就HTTPD——它为了避免上述开销,从内核调用socket等系统调用服务例程。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10981

    浏览量

    206687
  • 系统调用
    +关注

    关注

    0

    文章

    27

    浏览量

    8285

原文标题:若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux+C语言】你真的了解system接口的调用吗?

    Linux + C语言】话说,你真的了解system接口的调用吗?
    的头像 发表于 09-12 16:33 3510次阅读
    【<b class='flag-5'>Linux</b>+C语言】你真的<b class='flag-5'>了解</b>system接口的<b class='flag-5'>调用</b>吗?

    Linux内核中系统调用详解

    Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在
    发表于 08-23 10:37 615次阅读
    <b class='flag-5'>Linux</b>内核中<b class='flag-5'>系统</b><b class='flag-5'>调用</b>详解

    添加Linux系统调用与利用QEMU测试

    添加Linux系统调用与利用QEMU测试
    发表于 10-01 12:19 175次阅读
    添加<b class='flag-5'>Linux</b><b class='flag-5'>系统</b><b class='flag-5'>调用</b>与利用QEMU测试

    如何成为一名嵌入式C语言高手?

    如何成为一名嵌入式C语言高手? 嵌入式系统是当今科技领域的核心,而C语言则是嵌入式系统开发中最常用的编程语言之一。
    发表于 03-25 14:12

    如何成为一名嵌入式C语言高手?

    如何成为一名嵌入式C语言高手? 嵌入式系统是当今科技领域的核心,而C语言则是嵌入式系统开发中最常用的编程语言之一。
    发表于 04-07 16:03

    练成Linux系统高手教程

    练成Linux系统高手教程─────打开那神秘  看着别人操作那满屏幕的洋文,不可思议,那肯定是一个Linux高手,其实你也能
    发表于 08-10 11:17

    请问如何成为嵌入式高手

    成为嵌入式高手的技能清单和升级线路图第一部分:Linux平台搭建与环境熟悉了解linux系统;区
    发表于 08-30 11:28

    Linux怎么调用系统底层驱动的

    ,但是你要学习内核,你首先要会用Linux,知道Linux是如何操作,继而才能了解Linux怎么调用系统
    发表于 11-05 07:20

    什么是Linux系统编程

    什么是Linux系统编程Linux系统编程也叫Linux的高级
    发表于 12-23 07:30

    LinuxC语言编程入门教程

    编程风格等。u3000u3000Linux 作为一个优秀的操作系统,一项非常重要的功能就是支持系统调用尤其是支持C语言的
    发表于 09-22 06:56

    Linux系统调用及用户编程接口API分析

    在搭建起嵌入式开发环境之后,从本章开始,读者将真正开始学习嵌入式Linux的应用开发。由于嵌入式Linux是经Linux裁减而来的,它的系统调用
    发表于 10-18 17:14 1次下载

    了解各种系统调用助你成为一名Linux编程高手

    Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在
    的头像 发表于 05-14 11:10 3121次阅读
    <b class='flag-5'>了解</b>各种<b class='flag-5'>系统</b><b class='flag-5'>调用</b><b class='flag-5'>助你</b><b class='flag-5'>成为</b>一名<b class='flag-5'>Linux</b>下<b class='flag-5'>编程</b><b class='flag-5'>高手</b>

    什么是系统调用?为什么要用系统调用?

    实际上,很多已经被我们习以为常的C语言标准函数,在Linux平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各
    的头像 发表于 06-01 08:44 1.5w次阅读
    什么是<b class='flag-5'>系统</b><b class='flag-5'>调用</b>?为什么要用<b class='flag-5'>系统</b><b class='flag-5'>调用</b>?

    如何区分xenomai、linux系统调用/服务

    对于同一个POSIX接口应用程序,可能既需要xenomai内核提供服务(xenomai 系统调用),又需要调用linux内核提供服务(linux
    的头像 发表于 05-10 10:28 1683次阅读

    Linux系统调用的具体实现原理

    文我将基于 ARM 体系结构角度,从 Linux 应用层例子到内核系统调用函数的整个过程来梳理一遍,讲清楚linux系统
    的头像 发表于 09-05 17:16 752次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>系统</b><b class='flag-5'>调用</b>的具体实现原理