首页 > 系统相关 >ARM linux 系统调用实现原理

ARM linux 系统调用实现原理

时间:2023-02-10 22:47:25浏览次数:43  
标签:调用 系统 用户 参数 内核 linux 空间 ARM

https://blog.csdn.net/u013836909/article/details/120962422 

Linux ARM系统调用过程分析(一)——Linux编程中的API函数和系统调用的关系

Linux ARM系统调用过程分析(二)——Linux系统调用流程分析

Linux ARM系统调用过程分析(三)——Linux中open系统调用实现原理

https://man7.org/linux/man-pages/man2/syscall.2.html

什么是系统调用

linux内核提供了一组用于实现系统功能(和硬件打交道)的子程序,称为系统调用。系统调用和普通库函数调用非常相似,只是系统调用由操作系统提供,运行于内核空间,而普通的函数调用由函数库或用户自己提供,运行于用户空间。

一般情况下应用程序使用的是C库的API,而不是直接通过系统调用来编程。在Unix世界,最流行的API是基于POSIX标准的。这套API适配不同的操作系统,通过系统调用实现功能,对应用程序提供统一的接口,使得应用程序无需修改就可以在不同系统上运行。

 

系统调用作为用户空间进程和硬件设备之间的一个中间层。该层主要作用有两个:

1、它为用户空间提供了一种统一的硬件的抽象接口。比如当需要读些文件的时候,应用程序就可以不去管磁盘类型和介质,甚至不用去管文件所在的文件系统到底是哪种类型。

2、系统调用保证了系统的稳定和安全。作为硬件设备和应用程序之间的中间人,内核可以基于权限和其他一些规则对需要进行的访问进行裁决。举例来说,这样可以避免应用程序不正确地使用硬件设备,窃取其他进程的资源,或做出其他什么危害系统的事情。

 

怎么实现系统调用

在Linux中,除异常和中断外,系统调用是用户空间访问内核资源的唯一手段,系统调用是通过软件指令触发中断,俗称软中断。

linux内核提供了一组函数,俗称全局系统调用表,调用号就是数组的索引。

 

 

 

以 __NR_开头的宏都是系统调用号,sys_开头的都是各系统调用号对应的函数

系统调用的流程:首先从系统调用表里,取得C库调用svc(触发中断指令)时传入的系统调用号,然后根据调用号索引找到系统调用表里相应的函数地址,最后执行它。

 

系统调用参数传递

除了系统调用号以外,大部分系统调用都还需要一些外部的参数输人。所以,在发生异常的时候,应该把这些参数从用户空间传给内核。最简单的办法就是像传递系统调用号一样把这些参数也存放在寄存器里。在x86系统上,ebx, ecx, edx, esi和edi按照顺序存放前五个参数。需要六个或六个以上参数的情况不多见,此时,应该用一个单独的寄存器存放指向所有这些参数在用户空间地址的指针。

给用户空间的返回值也通过寄存器传递。在x86系统上,它存放在eax寄存器中。接下来许多关于系统调用处理程序的描述都是针对x86版本的。但不用担心,所有体系结构的实现都很类似。

参数验证

系统调用必须仔细检查它们所有的参数是否合法有效。举例来说,与文件I/O相关的系统调用必须检查文件描述符是否有效。与进程相关的函数必须检查提供的PID是否有效。必须检查每个参数,保证它们不但合法有效,而且正确。

最重要的一种检查就是检查用户提供的指针是否有效。试想,如果一个进程可以给内核传递指针而又无须被检查,那么它就可以给出一个它根本就没有访问权限的指针,哄骗内核去为它拷贝本不允许它访问的数据,如原本属于其他进程的数据。在接收一个用户空间的指针之前,内核必须保证:

指针指向的内存区域属于用户空间。进程决不能哄骗内核去读内核空间的数据。

指针指向的内存区域在进程的地址空间里。进程决不能哄骗内核去读其他进程的数据。

如果是读,该内存应被标记为可读。如果是写,该内存应被标记为可写。进程决不能绕过内存访问限制。

内核提供了两个方法来完成必须的检查和内核空间与用户空间之间数据的来回拷贝。注意,内核无论何时都不能轻率地接受来自用户空间的指针!这两个方法中必须有一个被调用。为了向用户空间写入数据,内核提供了copy_to_user(),它需要三个参数。第一个参数是进程空间中的目的内存地址。第二个是内核空间内的源地址。最后一个参数是需要拷贝的数据长度(字节数)。

为了从用户空间读取数据,内核提供了copy_from_ user(),它和copy-to-User()相似。该函数把第二个参数指定的位置上的数据拷贝到第一个参数指定的位置上,拷贝的数据长度由第三个参数决定。

如果执行失败,这两个函数返回的都是没能完成拷贝的数据的字节数。如果成功,返回0。当出现上述错误时,系统调用返回标准-EFAULT。

注意copy_to_user()和copy_from_user()都有可能引起阻塞。当包含用户数据的页被换出到硬盘上而不是在物理内存上的时候,这种情况就会发生。此时,进程就会休眠,直到缺页处理程序将该页从硬盘重新换回物理内存。

 

标签:调用,系统,用户,参数,内核,linux,空间,ARM
From: https://www.cnblogs.com/god-of-death/p/17110533.html

相关文章

  • 嵌入式Linux—文件IO
    文件IO在Linux系统中,一切都是“文件”:普通文件、驱动程序、网络通信等等。所有的操作,都是通过“文件IO”来进行的。所以,很有必要掌握文件操作的常用接口。Linux系......
  • c语言中调用sve函数的例子
    c语言中调用sve函数(ArmCLanguageExtensionsforSVE)PDFsve.c#include<arm_sve.h>#include<stdio.h>#include<stdlib.h>#include<time.h>#defineARRAYSIZE......
  • 服役已有6年:Linux Kernel 4.9正式终止支持
    Linux Kernel4.9收到4.9.337更新,并在kernel.org上被标记为EOL,这意味着该版本系统将正式终止支持,不再收到任何维护和安全更新。而这,距离LinuxKernel4.9推出,已经过......
  • linux下查看发行版本和内核版本
    1、查看发行版本cat/etc/*_release如:cat/etc.rocky_release或用lsb_release命令 2、查看内核版本cat/proc/version  或用uname-a ......
  • Linux系统的目录结构
    在Windows下,我们的整个硬盘实际上可以被分为多个磁盘驱动器:而在Linux中,没有C盘D盘这个概念,只有一句经典的话:"在Linux世界里,一切皆文件",而所有的文件都是位于根目录下的,Lin......
  • Linux系列教程(七)——Linux常用命令之帮助和用户管理命令
    上篇博客我们介绍了​​Linux文件搜索命令​​,其中find是用的最多的也是功能最强大的文件或目录搜索命令,和另一个搜索命令locate的区别是,find命令是全盘搜索,刚创建的文......
  • linux基本功之lsof命令实战
    前言......
  • 记一次Arch Linux蓝牙问题
    在一次系统更新后,重启发现蓝牙无法使用,表现为:右上角的Bluetooth图标闪烁,设置选项里的Bluetooth在"BluetoothTurnedOff"和"NoBluetoothFound"之间来回闪烁。......
  • Linux shell system environment variables All In One
    LinuxshellsystemenvironmentvariablesAllInOnebash/zshvscodeterminalenvCommand+Shift+PdemosPS1demo.vscode/settings.json{//自定......
  • Linux Nginx企业级平滑升级完整演示,全网最全最详细!
    平滑升级到底是个什么东西呢?说白了就是在不停止公司业务或者不停止公司网站的前提下对Nginx服务进行版本的升级,而且升级的过程呢正在访问的用户是感觉不到的,他们该怎么访问......