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

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

3天内不再提示

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

冬至子 来源:晓亮Albert 作者:晓亮Albert 2023-09-05 17:16 次阅读

本文我将基于 ARM 体系结构角度,从 Linux 应用层例子到内核系统调用函数的整个过程来梳理一遍,讲清楚linux系统调用实现原理,这里我们以open系统调用为例来讲解。

在应用层调用 open 系统调用时,实际上调用的是 C 标准库函数,具体的代码如下:

其中,open 函数的第一个参数是要打开的文件路径,第二个参数则是打开方式(例如只读、读写等)。在这里我们使用了 O_RDONLY 参数表示只读。

在 C 标准库中,open 函数实际上是通过系统调用来完成文件的打开操作。接下来,我们来看一下系统调用的具体实现。

在 ARM 架构的 Linux 内核中,系统调用的处理流程分为以下几步:

1.应用程序通过 swi 汇编指令触发中断,将 CPU 切换到特权模式。

在 ARM 架构中,每一个系统调用都对应有一个系统调用号,比如open系统调用的号码就是5,应用程序通过 swi 指令从用户态切换到内核态,CPU进入特权模式,通过R7寄存器将中系统调用号传递给内核。下面是 open 系统调用的汇编代码示例:

2.中断处理程序根据传递的系统调用号找到对应的系统调用函数。

内核中的系统调用处理程序是通过一张系统调用表来实现的,该表包含了所有系统调用的函数指针。当中断处理程序接收到一个系统调用请求时,它会根据系统调用号查找该表,并跳转到相应的系统调用函数。在 ARM 架构中,系统调用表存储在地址为 0x9000 的内存位置上。

对于 open 系统调用,在内核中的实现代码为 sys_open() 函数,其定义在 fs/open.c 文件中。在 ARM 架构中,sys_open() 函数的函数指针存储在系统调用表的第 5 个位置上。

3.将用户空间的参数复制到内核空间,并在系统调用函数中进行相应的操作。

在 ARM 架构中,内核将用户空间和内核空间分开,以确保用户空间的数据不会被恶意程序修改。因此,在执行系统调用之前,内核需要将用户空间的数据复制到内核空间。对于 open 系统调用,它的参数包括文件名和标志,这些参数都需要从用户空间复制到内核空间。

在内核中,copy_from_user() 和 copy_to_user() 函数用于从用户空间复制数据到内核空间和从内核空间复制数据到用户空间。对于 open 系统调用,它需要从用户空间复制文件名和标志,并将它们传递给 sys_open() 函数进行处理。下面是 sys_open() 函数的代码示例:

4.将处理结果返回给用户空间,并将 CPU 切换回用户模式。

在 ARM 架构中,系统调用的返回值通过 r0 寄存器传递给应用程序。对于 open 系统调用,它的返回值为文件描述符,即打开文件的句柄。如果打开文件成功,则返回一个非负整数,表示新的文件描述符;否则,返回一个负数,表示错误代码。

在 sys_open() 函数中,如果成功打开文件,则将文件描述符安装到当前进程的文件描述符表中,并返回该文件描述符。否则,返回错误代码。下面是 open 系统调用的汇编代码示例:

最后,当处理完 open 系统调用后,中断处理程序将 CPU 切换回用户模式,将处理结果返回给应用程序。

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

    关注

    30

    文章

    5036

    浏览量

    117762
  • Linux系统
    +关注

    关注

    4

    文章

    567

    浏览量

    26923
  • ARM处理器
    +关注

    关注

    6

    文章

    346

    浏览量

    41327
  • 触发中断
    +关注

    关注

    0

    文章

    11

    浏览量

    6533
  • 函数指针
    +关注

    关注

    2

    文章

    53

    浏览量

    3737
收藏 人收藏

    评论

    相关推荐

    Linux系统调用实现与应用

    在计算机科学中,系统调用(System Call)是一种操作系统提供的服务,它允许应用程序通过软件中断的方式访问操作系统内核中的函数。这些函数提供了一系列与硬件相关的服务,例如文件
    发表于 06-14 11:46 366次阅读

    Linux内核中系统调用详解

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

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

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

    什么是Linux系统调用,包括哪些内容

    所谓系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口获得操作系统内核提供的服务。例如,用户可以通过
    发表于 08-23 11:55

    ARM linux系统调用实现原理

    大家都知道linux的应用程序要想访问内核必须使用系统调用从而实现从usr模式转到svc模式。下面咱们看看它的实现过程。
    发表于 05-30 11:24 2181次阅读

    基于linux系统实现的vivado调用VCS仿真教程

    linux系统实现vivado调用VCS仿真教程 作用:vivado调用VCS仿真可以加快工程的仿真和调试,提高效率。 前期准备:确认安
    的头像 发表于 07-05 03:30 1.1w次阅读
    基于<b class='flag-5'>linux</b><b class='flag-5'>系统</b><b class='flag-5'>实现</b>的vivado<b class='flag-5'>调用</b>VCS仿真教程

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

    Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统
    的头像 发表于 05-11 11:27 3133次阅读
    透了解<b class='flag-5'>系统</b><b class='flag-5'>调用</b>助你成为<b class='flag-5'>Linux</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>?

    Linux系统调用的技巧

    1.linux系统调用的基本原理  linux系统调用形式与POSIX兼容,也
    发表于 04-02 14:36 297次阅读

    以源代码为例,讲解ARM Linux系统调用实现原理

    大家都知道linux的应用程序要想访问内核必须使用系统调用从而实现从usr模式转到svc模式。下面咱们看看它的实现过程。
    发表于 08-12 10:42 933次阅读

    系统调用是如何实现的?

    这张图画了挺久的,主要是想让大家可以从全局角度,看下linux内核中系统调用实现。 在讲具体的细节之前,我们先根据上图,从整体上看一下
    的头像 发表于 02-20 16:46 3651次阅读
    <b class='flag-5'>系统</b><b class='flag-5'>调用</b>是如何<b class='flag-5'>实现</b>的?

    系统调用具体是如何实现

    返回给应用程序。如此才能保证系统的稳定和安全。本文采用 的实例来讲解系统调用具体是如何实现的。 系统调用
    的头像 发表于 09-29 11:10 3374次阅读

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

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

    Linux内核系统调用概述及实现原理

    本文介绍了系统调用的一些实现细节。首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系。然后,我们考察了
    的头像 发表于 05-14 14:11 1920次阅读
    <b class='flag-5'>Linux</b>内核<b class='flag-5'>系统</b><b class='flag-5'>调用</b>概述及<b class='flag-5'>实现</b>原理

    Linux中的系统调用是怎样实现

    系统调用和普通的函数调用没有本质区别,普通的函数调用一般调用的是我们自己编写的函数或者其它库函数,而系统
    的头像 发表于 02-15 11:40 1015次阅读
    <b class='flag-5'>Linux</b>中的<b class='flag-5'>系统</b><b class='flag-5'>调用</b>是怎样<b class='flag-5'>实现</b>