服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - linux的系统调用执行探究

linux的系统调用执行探究

2023-11-17 17:09未知服务器之家 Linux

arm64大约支持280个系统调用,我们平时使用的这些系统调用,到底工作原理是什么,调用后又是到哪里实现的呢,这篇文章初步了解下内核系统调用的流程,并告诉跟踪这个流程的方法。 图片 废话不多说,如上就是linux的系统调用

arm64大约支持280个系统调用,我们平时使用的这些系统调用,到底工作原理是什么,调用后又是到哪里实现的呢,这篇文章初步了解下内核系统调用的流程,并告诉跟踪这个流程的方法。

linux的系统调用执行探究图片


废话不多说,如上就是linux的系统调用关系图:

1.绝大部分用户态系统调用接口,都经过glibc库,最终到内核是sys_xx实现函数完成功能并返回用户态;

2.少量glibc不支持的API可通过其他方式直接到内核sys_xx实现函数完成功能并返回用户态;

3.存在少量系统调用glibc内部实现,但是实现流程使用内核关键函数,比如malloc;

举例说明如何跟踪

open()函数

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void main()
{
        open("xx", O_CREAT);
}

以上是open的系统调用,可以使用gcc open.c -o open命令编译成二进制。

ldd open  
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f53081a5000)

从上可知最终到系统libc库

查看libc库的open:
nm -D /lib/x86_64-linux-gnu/libc.so.6  |grep open
00000000000f7030 W open
00000000000f7030 W __open


接下来需要下载glibc库的源码,然后

git checkout glibc-2.9
vim io/open.c

int
__open (file, oflag)
     const char *file;
     int oflag;
{
  int mode;

  if (file == NULL)
    {
      __set_errno (EINVAL);
      return -1;
    }
  if (oflag & O_CREAT)
    {
      va_list arg;
      va_start(arg, oflag);
      mode = va_arg(arg, int); 
      va_end(arg);
    }
  __set_errno (ENOSYS);
  return -1;
}


如何glibc库经过初步的参数检查,会调用到内核的系统调用sys_open() ->include/linux/syscalls.h ->sys_open -> do_sys_open ->fs/open.c ->long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)

系统调用 malloc

cat test.c
#include <stdio.h>
#include <malloc.h>

void main()
{
        void *c = (void*)malloc(10);
        free(c);
}
如上
ldd test
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f53081a5000)


nm -D /lib/x86_64-linux-gnu/libc.so.6  |grep malloc
0000000000084130 T __libc_malloc
0000000000084130 T malloc

glibc源码中

find . -name malloc.c
./malloc/malloc.c


延伸 · 阅读

精彩推荐
  • LinuxLinux 中firewall的使用方法总结

    Linux 中firewall的使用方法总结

    这篇文章主要介绍了Linux 中firewall的使用方法总结的相关资料,这里提供了使用的命令帮助大家学习理解,需要的朋友可以参考下...

    追寻北极5612022-02-12
  • Linux教你在虚拟机linux操作系统中安装vmtools

    教你在虚拟机linux操作系统中安装vmtools

    很多用户在测试linux操作系统的时候喜欢用虚拟机,因为虚拟机方便而且可以同时在一台PC机上虚拟出来不同版本的linux操作系统,但是虚拟机和物理机之间...

    Linux教程网3612019-12-09
  • Linux简单实现linux聊天室程序

    简单实现linux聊天室程序

    这篇文章主要介绍了简单实现linux聊天室程序的详细代码,帮助大家了解聊天室的实现原理,感兴趣的小伙伴们可以参考一下...

    Linux教程网7402021-10-29
  • Linux9条Linux简单又实用的指令介绍

    9条Linux简单又实用的指令介绍

    今天,与大家分享的是学习Linux过程中的心得体会,下面为大家介绍9条Linux简单又实用的指令,对linux有关心的朋友们可以进来看看哦 ...

    脚本之家2802019-10-12
  • Linuxlinux 打包当前文件夹下所有文件的方法

    linux 打包当前文件夹下所有文件的方法

    下面小编就为大家分享一篇linux 打包当前文件夹下所有文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    四魂の魊8422022-03-09
  • LinuxLinux文件压缩和解压缩命令使用详解

    Linux文件压缩和解压缩命令使用详解

    在Linux系统中,我们通常使用的文件压缩命令有:bunzip2 , bzip2 , cpio , gunzip , gzip ,split(切割文件) , zgrep(在压缩文件中寻找匹配的正则表达式), zip ,unzip, tar ,...

    Linux教程网6162019-11-23
  • Linux微服务说的局限性

    微服务说的局限性

    导读 关于微服务的优势和劣势已经有过太多的讨论,不过我仍然看到很多成长型初创公司对它进行着“盲目崇拜”。冒着“重复发明轮子”的风险(Marti...

    未知742023-09-19
  • Linux在Linux上给用户赋予指定目录的读写权限

    在Linux上给用户赋予指定目录的读写权限

    在上篇文章中我们向您展示了如何在 Linux 上创建一个共享目录。这次,我们会为您介绍如何将 Linux 上指定目录的读写权限赋予用户。...

    Linux中国19592022-02-25