当前位置: 首页 > 面试题库 >

Assembly中系统调用的返回值是多少?

路和悌
2023-03-14
问题内容

当我尝试研究内核的系统调用的返回值时,我会找到描述它们的表,以及需要放入不同的寄存器中才能使它们工作的表。但是,我找不到任何文档说明它从系统调用中获得的返回值是
什么 。我只是在不同的地方发现我收到的将在EAX寄存器中。

TutorialsPoint:

结果通常在EAX寄存器中返回。

汇编语言循序渐进:使用Linux编程 Jeff Duntemann的书在其程序中多次陈述:

  • 查看EAX中sys_read的返回值

  • 复制sys_read返回值以安全保存

我没有任何网站解释此返回值。有互联网资源吗?或者有人可以向我解释这个价值观?


问题答案:

C是Unix系统编程的语言,因此所有文档均以C表示。然后,在任何给定平台上都有C接口与asm之间细微差异的文档,通常在手册页的Notes部分中。

sys_read表示原始系统调用(与libc包装器函数相对)。read系统调用的内核实现是称为的内核函数sys_read()。您不能使用call指令来调用它,因为它在内核中,而不是库中。但是人们仍然在谈论“调用sys_read”以区别于libc函数调用。但是,read即使您指的是原始系统调用(特别是当libc包装器没有执行任何特殊操作时),也可以说出来,就像我在此答案中所做的那样。

还要注意,syscall.h定义常量时应SYS_read使用实际的系统调用号码。(您在EAX int 0x80syscall指令前输入的值)。

Linux系统调用的返回值(在EAX/RAXx86上)或者是成功的非负值,或一个负的错误代码。例如,-EFAULT如果您传递了无效的指针。

syscalls(2)手册页中记录了此行为。

实际上, -1到-4095表示错误,其他表示成功。glibc的通用syscall(2)包装器使用以下序列: cmp rax, -4095/jaeSYSCALL_ERROR_LABEL,显然可以保证所有Linux系统调用都符合未来的要求。有趣的情况包括:mmap有效地址[可以设置符号位,但必须进行页面对齐];getpriority内核ABI将-20..19返回值范围映射到1..40,然后libc对其进行解码。有关解码系统调用错误返回值的相关答案中的更多详细信息。

更新,是的,对于所有的系统调用,都可以保证在Linux运行的所有体系结构上的错误范围都是-4095..
-1有关更多详细信息,请参见[AOSP非显而易见的syscall()实现。(将来,不同的体系结构可能会为MAX_ERRNO使用不同的值,但可以保证现有拱门(如x86-64)的值与Linux保持内核ABI稳定的不中断用户空间策略的一部分相同。

要查找特定平台常数的实际数值,您需要在#defined所在的位置找到C头文件。有关详细信息,

每个sys调用的返回值的含义在第2节的手册页中都有介绍,例如read(2)。(sys_read这是glibc
read()函数非常薄的包装程序的原始系统调用。)大多数手册页都有用于返回值的整个部分。例如

返回值

成功后,将返回读取的字节数(零表示文件末尾),并且文件位置以该数字前移。如果此数目小于请求的字节数,这不是错误;例如,这可能是因为当前
实际可用的字节较少(可能是因为我们接近
文件末尾,或者因为我们正在从管道或终端
读取),或者因为read()被a中断了。信号。另请参阅注释。

如果出错,则返回-1,并正确设置errno。在这种情况下,未指定文件位置(如果有)是否
更改。

需要注意的是最后一段描述glibc的包装如何解码值,并设置errno到-EAX如果原始系统调用的返回值是负的,所以errno=EFAULT和返回-1如果原始系统调用返回-EFAULT

整个章节列出了所有可能read()返回的错误代码,以及它们的特殊含义read()。(POSIX标准化了大多数这种行为。)

我不确定glibc到底在哪里解码的返回值mmap(2),而返回值不是带符号的类型。它可能使用与通用syscall包装器相同的方法(检查unsigned value
> -4096UL),但是每个系统调用的特定包装器没有实际在寄存器之间对arg进行改组并调用该函数的开销。

我在glibc源代码树中没有看到它;大概它埋在某些宏层下。



 类似资料:
  • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

  • 问题内容: 我希望此函数返回ajax调用是否成功。有什么办法可以做到吗?我下面的代码无法做到这一点。 问题答案: 不幸的是,您不能将值返回给包装异步回调的函数。取而代之的是,您从AJAX请求进行的成功回调会将数据和控制权移交给另一个函数。我在下面演示了这个概念: myFunction的定义: 回调函数定义: 调用myFunction:

  • 5.3. 多返回值 在Go中,一个函数可以返回多个值。我们已经在之前例子中看到,许多标准库中的函数返回2个值,一个是期望得到的返回值,另一个是函数出错时的错误信息。下面的例子会展示如何编写多返回值的函数。 下面的程序是findlinks的改进版本。修改后的findlinks可以自己发起HTTP请求,这样我们就不必再运行fetch。因为HTTP请求和解析操作可能会失败,因此findlinks声明了2

  • Java方法系统。identityHashCode(…)当我使用this引用在内部调用某个对象时,与在同一个对象的变量引用上调用它相比,它返回的值是不同的。 而测试... 而输出。。。 什么会导致这种情况发生?有问题的真实对象是一个Hibernate实体,但我已经将上述测试直接添加到代码中,并且在特定场景中显示了相同的行为。为什么一个对象使用this关键字显示的身份哈希码与对其自身的引用不同?我还

  • 我正在开发一个基于OpenLayers、Geoserver、Java和JavaScript的网络应用程序。 用户需要在地图上选择一个区域,该部分必须作为图像下载。我尝试使用Ajax访问WMS- http://localhost:8080/geoserver/wms?request=GetMap 结果,我得到了除基础底图之外的所有必需图层。也有办法得到底图吗? 是否有其他方法满足此要求?

  • 本文向大家介绍C++系统调用是什么,你用过哪些系统调用相关面试题,主要包含被问及C++系统调用是什么,你用过哪些系统调用时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1)概念: 在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供了用户程序与操作系统之间的接口(即系统调用是用户程序和内核交互的