搜索
首页系统教程LINUXSyscall系统调用Linux内核跟踪

Syscall系统调用Linux内核跟踪

Feb 12, 2024 pm 09:21 PM
linuxlinux教程linux系统linux命令外壳脚本嵌入式linuxlinux入门linux学习

在Linux用户空间中,我们常常需要调用系统调用。下面我们以Linux2.6.37版本为例,跟踪一下read系统调用的实现。不同版本的Linux系统调用实现可能会有所不同。

Syscall系统调用Linux内核跟踪

在一些应用程序中,我们可以看到如下定义:

scssCopy code
#define real_read(fd, buf, count ) (syscall(SYS_read, (fd), (buf), (count)))

实际上,真正调用的是系统函数syscall(SYS_read),即sys_read()函数。在Linux2.6.37版本中,该函数是通过几个宏定义实现的。

Linux系统调用(SCI,system call interface)实际上是一个多路汇聚以及分解的过程,汇聚点是0x80中断入口点(X86系统结构)。也就是说,所有系统调用都从用户空间中汇聚到0x80中断点,同时保存具体的系统调用号。当0x80中断处理程序运行时,将根据系统调用号对不同的系统调用分别处理,即调用不同的内核函数进行处理。

引起系统调用的途径有两种:

(1)int $0×80,这是老式Linux内核版本中引起系统调用的唯一方式。

(2)sysenter汇编指令

在Linux内核中,我们可以使用下列宏定义来进行系统调用。

SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
    struct file *file;
    ssize_t ret = -EBADF;
    int fput_needed;

    file = fget_light(fd, &fput_needed);
    if (file) {
        loff_t pos = file_pos_read(file);
        ret = vfs_read(file, buf, count, &pos);
        file_pos_write(file, pos);
        fput_light(file, fput_needed);
    }

    return ret;
}

其中SYSCALL_DEFINE3的宏定义如下:

#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)

##的意思就是宏中的字符直接替换,
如果name = read,那么在宏中__NR_##name就替换成了__NR_read了。 NR##name是系统调用号,##指的是两次宏展开.即用实际的系统调用名字代替”name”,然后再把__NR…展开.如name == ioctl,则为__NR_ioctl。

#ifdef CONFIG_FTRACE_SYSCALLS
#define SYSCALL_DEFINEx(x, sname, ...)                \
    static const char *types_##sname[] = {            \
        __SC_STR_TDECL##x(__VA_ARGS__)            \
    };                            \
    static const char *args_##sname[] = {            \
        __SC_STR_ADECL##x(__VA_ARGS__)            \
    };                            \
    SYSCALL_METADATA(sname, x);                \
    __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
#else
#define SYSCALL_DEFINEx(x, sname, ...)                \
    __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
#endif

不管是否定义CONFIG_FTRACE_SYSCALLS宏,最终都会执行 下面的这个宏定义:

__SYSCALL_DEFINEx(x, sname, VA_ARGS)

#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS

#define SYSCALL_DEFINE(name) static inline 
long SYSC_##name

#define __SYSCALL_DEFINEx(x, name, ...)                    \
    asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));        \
    static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__));    \
    asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__))        \
    {                                \
        __SC_TEST##x(__VA_ARGS__);                \
        return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__));    \
    }                                \
    SYSCALL_ALIAS(sys##name, SyS##name);                \
    static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))

#else /*
 CONFIG_HAVE_SYSCALL_WRAPPERS */

#define SYSCALL_DEFINE(name) asmlinkage 
long sys_##name
#define __SYSCALL_DEFINEx(x, name, ...)                    \
    asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))

#endif /*
 CONFIG_HAVE_SYSCALL_WRAPPERS */

最终会调用下面类型的宏定义:

asmlinkage long sys##name(__SC_DECL##x(VA_ARGS))
也就是我们前面提到的sys_read()系统函数。
asmlinkage通知编译器仅从栈中提取该函数的参数。所有的系统调用都需要这个限定词!这和我们上一篇文章quagga中提到的宏定义,有异曲同工之妙。

也就是宏定义中的下面代码:

struct file *file;
    ssize_t ret = -EBADF;
    int fput_needed;

    file = fget_light(fd, &fput_needed);
    if (file) {
        loff_t pos = file_pos_read(file);
        ret = vfs_read(file, buf, count, &pos);
        file_pos_write(file, pos);
        fput_light(file, fput_needed);
    }

    return ret;

代码解析:

  • fget_light() :根据 fd 指定的索引,从当前进程描述符中取出相应的 file 对象(见图3)。
  • 如果没找到指定的 file 对象,则返回错误
  • 如果找到了指定的 file 对象:
  • 调用 file_pos_read() 函数取出此次读写文件的当前位置。
  • 调用 vfs_read() 执行文件读取操作,而这个函数最终调用 file->f_op.read() 指向的函数,代码如下:

if (file->f_op->read)
ret = file->f_op->read(file, buf, count, pos);

  • 调用 file_pos_write() 更新文件的当前读写位置。
  • 调用 fput_light() 更新文件的引用计数。
  • 最后返回读取数据的字节数。

到此,虚拟文件系统层所做的处理就完成了,控制权交给了 ext2 文件系统层。

以上是Syscall系统调用Linux内核跟踪的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:良许Linux教程网。如有侵权,请联系admin@php.cn删除
Linux与Windows的典型用例是什么?Linux与Windows的典型用例是什么?May 03, 2025 am 12:01 AM

LinuxIsideAlforCustomization,开发和ServerManagement,WhileWindowSexcelSineAsofuse,SoftWareCompatibility andgaming.linuxoffershighighighighignfigurabilityfordefordeerserersandserserservervevendingservervevelicersandervervevelopservervevelopservervevelopsetups,whereaswindowspprovidesaprovidesauser-frovideslyinlyintellyintlyintellyinterfrignlyInterFaroffacorDofroardOaforportort

Linux和Windows之间的用户帐户管理有什么区别?Linux和Windows之间的用户帐户管理有什么区别?May 02, 2025 am 12:02 AM

Linux和Windows在用户账户管理上的主要区别在于权限模型和管理工具。Linux使用基于Unix的权限模型和命令行工具(如useradd、usermod、userdel),而Windows采用自己的安全模型和图形用户界面(GUI)管理工具。

Linux的命令行环境如何使其比Windows更安全?Linux的命令行环境如何使其比Windows更安全?May 01, 2025 am 12:03 AM

Linux'scommandlinecanbemoresecurethanWindowsifmanagedcorrectly,butrequiresmoreuserknowledge.1)Linux'sopen-sourcenatureallowsforquicksecurityupdates.2)Misconfigurationcanleadtovulnerabilities.Windows'commandlineismorecontrolledbutlesscustomizable,with

如何在Linux中自动制作USB驱动器安装如何在Linux中自动制作USB驱动器安装Apr 30, 2025 am 10:04 AM

本指南说明了如何在Linux的启动下自动安装USB驱动器,从而节省了时间和精力。 步骤1:确定您的USB驱动器 使用LSBLK命令列出所有块设备。 您的USB驱动器可能会标记为 /dev /sdb1, /dev /sdc1等

2025年,最佳Linux,Windows和Mac的最佳跨平台应用程序2025年,最佳Linux,Windows和Mac的最佳跨平台应用程序Apr 30, 2025 am 09:57 AM

跨平台应用程序已彻底改变了软件开发,从而在Linux,Windows和MacOS等操作系统上实现了无缝功能。 这消除了根据您的设备切换应用程序的需求,提供一致的体验

2025年AI和机器学习的最佳Linux工具2025年AI和机器学习的最佳Linux工具Apr 30, 2025 am 09:44 AM

人工智能(AI)正在迅速改变许多部门,从医疗保健和金融到艺术和音乐等创意领域。 Linux具有开源性,适应性和性能功能,已成为首要的Platfo

5最佳轻巧的Linux发行版,不带GUI5最佳轻巧的Linux发行版,不带GUIApr 30, 2025 am 09:38 AM

寻找没有图形用户界面(GUI)的快速,最小和高效的Linux分布? 轻巧,无GUI-Linux发行版非常适合较旧的硬件或服务器和嵌入式系统(例如服务器和嵌入式系统)。他们消耗较少的res

如何在Redhat发行中安装葡萄酒10.0如何在Redhat发行中安装葡萄酒10.0Apr 30, 2025 am 09:32 AM

Wine 10.0稳定版发布:在Linux上运行Windows应用更上一层楼 Wine,这款开源免费的应用程序,让Linux用户能够在Unix/Linux类操作系统上运行Windows软件和游戏,迎来了10.0稳定版的发布!此版本已提供源代码和二进制包下载,支持Linux、Windows和Mac等多种发行版。 这一版本凝聚了一年的辛勤工作和超过8600项改进,带来了诸多令人兴奋的提升。主要亮点包括: 增强对蓝牙设备的支持。 提升对HID输入设备的支持。 优化了32位和64位应用程序的运行性能。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。