当前位置:首页 > CN2资讯 > 正文内容

【Linux】Linux系统调用

7小时前CN2资讯


Linux系统调用

前言

  • 操作系统——管理计算机硬件与软件资源的软件,是用户和系统交互的操作接口,为它上面运行的程序提供服务。
  • 操作系统内核——操作系统的内核,负责管理系统的进程、内存、设备驱动程序、文件和网络系统。一个内核不是一套完整的操作系统。例如Linux。
  • Linux操作系统——基于Linux内核的操作系统。通常由Linux内核、shell(特殊的应用程序,提供运行其他程序的接口)、文件系统和应用程序组成。常见的有:Redhat、Fedora、Centos、Ubuntu和Android等。

Linux的运行空间:

Linux的运行空间:内核空间+用户空间

内核空间——存放的是整个内核代码和所有内核模块,以及内核所维护的数据。

用户空间——用户程序的代码和数据。


什么是系统调用?

操作系统提供给用户程序调用系统服务(硬件设备)的一组"特殊"接口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qZHi7gvy-1654739388114)(https://zyximagestorage.oss-cn-beijing.aliyuncs.com/blogimages/image-20220608184404431.png)]

系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个信使,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间


为什么要设置系统调用?

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

与具体的硬件完全隔离,用户不需要面向具体的硬件编码,降低了开发的复杂度和难度。

  • 极大的提高了系统的安全性

将用户进程隔离,实现内核"保护",用户进程不允许访问内核数据,也无法使用内核函数。用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不允许肆意跳入内核。有了这样的内核访问路径限制,才能保证内核安全无误。

  • 使用户程序具有可移植性

对于不同平台不同硬件来说。


系统调用的实现

通过软件中断实现。

**软件中断:**它是通过软件指令触发的中断。Linux系统内核响应软件中断,从用户态切换到内核态,执行相应的系统调用。

系统调用控制程序执行软件中断的过程如下:

  • 在进程的内核态堆栈中保存大多数寄存器的内容(即保存恢复进程到用户态执行所需要的上下文)。
  • 根据用户态传递的系统调用号,确定系统调用的执行程序。
  • 调用相应的执行程序来处理系统调用。
  • 从系统调用返回。
  • 系统调用号:

    每个系统调用被赋予一个系统调用号,与具体的系统调用相关联

    系统调用表:

    内核维护系统调用表,保存系统调用函数的起始位置,系统调用号对应该系统调用在调用表中的偏移量


    执行系统调用的方法

    还有系统中断。


    GLIBC库函数

    Glibc实现操作系统提供的系统服务,即为系统调用的封装。

    • 每个特定的系统调用对应了至少一个glibc封装的库函数。
    • 多个API也可能只对应同一个系统调用。
    • 返回值-1在多数情况下表示内核不能满足进程的请求。
    • Libc中定义的errno变量包含特定的出错码。

    **示例:**更改文件权限

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <errno.h>
    #include <stdio.h>

    int main(void) {

    int rc = chmod("./test.txt",S_IWUSR | S_IWGRP | S_IWOTH);
    if (rc == -1) {
    fprintf(stderr,"chmod failed,errno=%d\n",errno);
    } else {
    printf("chmod success!\n");
    }
    return 0;
    }

    Syscall直接调用

    函数原型:

    long int syscall(long int sysno,...);

    传参说明:

    • sysno是系统调用号,唯一标识系统调用号,详见sys/syscall.h
    • …为剩余可变长的参数,为系统调用所带的参数,根据系统调用的不同,可带0~5个不等的参数,如果超过特定系统调用能带的参数,多余的参数被忽略。
    • 返回值:该函数返回值为特定系统调用的返回值,在系统调用成功之后你可以将返回值转化为特定的类型,如果系统调用失败则返回-1,错误代码存放在errno中。

    **示例:**更改文件权限

    #include <sys/syscall.h>
    #include <unistd.h>
    #include <errno.h>
    #include <sys/stat.h>
    #include <stdio.h>

    int main(void) {

    int rc = syscall(SYS_chmod, "./test.txt", S_IROTH | S_IRGRP | S_IRUSR);
    if (rc == -1) {
    fprintf(stderr,"chmod failed,errno=%d\n",errno);
    } else {
    printf("chmod success!\n");
    }
    return 0;
    }

    对比


    如何高效执行系统调用

    系统调用的次数会影响程序的执行效率。

    **示例:**调用write往文件里写数据,更改每次写的大小进行对比。

    #include <stdlib.h>
    #include <errno.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>

    //宏是直接替换,注意括号
    #define TOTAL_SIZE (1024*1024*500)
    #define BUF_SIZE 4096

    int main(int argc,char**argv) {
    char buffer[BUF_SIZE];
    const char* filename = "./write.txt";
    int fd = -1;
    int i = 0;
    memset(buffer, '8', BUF_SIZE);
    fd = open(filename, O_RDWR | O_TRUNC | O_CREAT);
    if (fd < 0) {
    fprintf(stderr,"fopen failed,reason:%s.\n exit\n",strerror(errno));
    return -1;
    }
    int num = TOTAL_SIZE / BUF_SIZE;
    for (i = 0; i < num; i++) {
    if (write(fd, buffer, BUF_SIZE) < 0) {
    fprintf(stderr,"write failed!reason:%s.\n",strerror(errno));
    }
    }
    close(fd);
    return 0;
    }

    将 BUF_SIZE 更改为 16后,每次写的量减少了,增加了系统调用的次数。

    **两次时间对比:**1-4096,2-16。

    罪魁祸首-用户态和内核态的切换

    • 保存用户进程现场
    • 合法性检查(如内存)
    • 参数传递
    • 恢复现场

    一多一少解决效率问题:


      你可能想看:

      扫描二维码推送至手机访问。

      版权声明:本文由皇冠云发布,如需转载请注明出处。

      本文链接:https://www.idchg.com/info/32247.html

      分享给朋友:

      “【Linux】Linux系统调用” 的相关文章

      Digital-VM优惠活动揭秘:享受五折折扣和稳定续费

      Digital-VM优惠概述 Digital-VM简介 Digital-VM是一家专注于提供基于KVM架构的VPS主机服务商,凭借其强大的服务器性能和丰富的网络资源,已经逐渐在市场中站稳了脚跟。如果你在寻找高可靠性、灵活配置的VPS主机,Digital-VM绝对值得一试。它在全球多个地区建立了数据中...

      QQ邮箱服务器完全指南:配置、安全性与优化技巧

      QQ邮箱服务器概述 QQ邮箱是由腾讯公司推出的一款广受欢迎的电子邮件服务。它的优势不仅在于强大的存储容量,还有丰富的功能,适合个人和企业用户使用。很多人都习惯使用QQ邮箱来发送、接收邮件,因此有必要了解其背后的邮件服务器。 在我使用QQ邮箱的过程中,发现它使用的是腾讯自家搭建的邮件服务器。这些服务器...

      探索阿什本:全球数据中心之都的科技与美食之旅

      阿什本,这个名字或许在很多人耳中听起来并不陌生。作为美国弗吉尼亚州劳登郡的一部分,它距离华盛顿特区仅34英里,恰如其分地威尔士着城市的繁华。在我踏上这片土地的那一刻,便被它的快速发展与活力所吸引。阿什本不仅是一个城市,更是全球数据中心的中心,称其为“全球数据中心之都”可谓名至实归。 在阿什本,互联网...

      甲骨文云账号如何注销:详尽步骤与注意事项

      甲骨文云账号注销流程 注销甲骨文云账号的流程其实并不复杂,但有几个关键步骤需要认真对待。整个过程主要分为几个部分,包括登录甲骨文云控制台、发起注销请求、查看注销请求状态,以及最后的等待和确认删除。 1.1 甲骨文云控制台的登录 进入甲骨文云控制台的第一步,就是要登录到你的账号。打开浏览器,访问甲骨文...

      Rndc2的线路怎么样?全面评测RackNerd洛杉矶DC02机房

      Rndc2的基本线路信息 说到Rndc2的线路,首先让我跟大家分享一下它的基本信息。这个线路的核心在于RackNerd洛杉矶DC02机房,位置恰好在美国西海岸的洛杉矶。成立于2019年的RackNerd,以其价格优势著称,给我们提供了比较便宜的美国VPS选择,最低年付大约10美元,这对于很多希望节省...

      NameSilo Coupons - 如何以低成本注册域名并享受优质服务

      NameSilo自2010年成立以来,展现出稳定且迅猛的发展态势,成为了一家备受关注的域名注册商。总部位于美国亚利桑那州,NameSilo已经成功管理超过400万个活跃域名,且在行业内占据着显著的地位。在这条领域内,NameSilo被视为全球仅有的12家顶级域名注册商之一,这无疑为其信誉奠定了坚实基...