system-calls相关内容

`read` 和 `sysread` 有什么区别?

read 和 sysread 有非常相似的文档.两者有什么区别? 解决方案 关于 read: read 支持 PerlIO 层. read 适用于任何 Perl 文件句柄[1]. 读取缓冲区. read 以 8 KiB 的固定大小块的形式从系统获取数据[2]. read 如果可用数据少于请求的数据,则可能会阻塞[3]. 关于sysread: sysread 不支持 ..
发布时间:2021-12-10 18:17:15 其他开发

MacOS 程序集的 64 位系统调用文档

我找不到在 MacOS 上编写 64 位程序集的好文档. 64 位 SysV ABI 在 A 部分中说明了以下内容.2.1 和 这篇SO帖子引用了它: 系统调用是通过 syscall 指令完成的.内核破坏注册 %rcx 和 %r11. 从系统调用返回,寄存器 %rax 包含系统调用.-4095 和 -1 之间的值表示错误,它是 -errno. 这两句话在 Linux 上没问 ..
发布时间:2021-12-06 20:56:16 其他开发

汇编中系统调用的返回值是什么?

当我尝试研究内核系统调用的返回值时,我找到了描述它们的表,以及我需要在不同的寄存器中放入什么才能让它们工作.但是,我没有找到任何说明什么是我从系统调用中获得的返回值的文档.我只是在不同的地方发现我收到的将在 EAX 寄存器中. 教程要点: 结果通常在 EAX 寄存器中返回. Assembly Language Step-By-Step: Programming with Linu ..
发布时间:2021-12-03 13:42:55 服务器开发

为什么 x86-64 Linux 系统调用会修改 RCX,该值是什么意思?

我正在尝试使用 sys_brk 系统调用在 linux 中分配一些内存.这是我尝试过的: BYTES_TO_ALLOCATE equ 0x08节.text全局_start_开始:mov rax, 12mov rdi, BYTES_TO_ALLOCATE系统调用mov rax, 60系统调用 事情是按照 linux 调用约定我期望返回值在 rax 寄存器(指向分配的内存的指针)中.我在 gdb ..
发布时间:2021-12-03 13:17:10 服务器开发

malloc/free 是系统调用还是 libc 提供的库例程?

如果 malloc/free 在 libc 中作为库例程实现,那么它是在 sbrk 系统调用或 mmap 系统调用之上实现的,还是其他什么? 一般来说,sys/syscall.h 中声明的函数是否包含目标机器中的所有系统调用? 解决方案 malloc 和 free 是标准的 C 库函数,由每个 C 实现来实现. C 标准仅定义了这些函数的行为方式以及对它们的预期行为.如何实现它 ..
发布时间:2021-12-03 13:16:51 服务器开发

如何在内联汇编中通过 syscall 或 sysenter 调用系统调用?

在x86 Linux下如何直接使用sysenter/syscall实现系统调用?有人可以提供帮助吗?如果能把amd64平台的代码也展示一下就更好了. 我知道在 x86 中,我们可以使用 __asm__(" movl $1, %eax \n"" movl $0, %ebx \n"" 呼叫 *%gs:0x10 \n"); 间接路由到 sysenter. 但是我们如何直接使用 sysen ..
发布时间:2021-12-03 13:03:28 服务器开发

如何编写信号处理程序来捕获 SIGSEGV?

我想编写一个信号处理程序来捕获 SIGSEGV.我使用 保护一块内存以供读或写 char *buffer;字符 *p;字符一个;int pagesize = 4096;mprotect(缓冲区,页面大小,PROT_NONE) 这可以保护从缓冲区开始的 pagesize 字节内存免受任何读取或写入. 其次,我尝试读取内存: p = 缓冲区;a = *p 这将生成一个 SIGSEGV, ..
发布时间:2021-12-02 08:19:32 服务器开发

32 位 Linux 上的 Syscall 或 sysenter?

从 MS‑DOS 开始,我就知道使用中断进行系统调用.在旧论文中,我看到引用 int 80h 在 Linux 上调用系统函数.很长一段时间以来,我知道 int 80h 已被弃用,取而代之的是 syscall 指令.但我无法在我的 32 位机器上运行. 问题 syscall 指令只能在 64 位平台上使用吗?32 位 Linux 不使用 syscall 吗? 样本测试 在我的 ..
发布时间:2021-11-26 14:21:14 服务器开发

将存储在 EDX:EAX 中的 64 位数字打印到标准输出

我有一个很大的 64 位数字存储在 EDX:EAX 中,分别为 21C3677C:82B40000.我正在尝试将数字作为十进制 2432902008176640000 打印到控制台.是否有系统调用可以让我完成此操作? 解决方案 这里是一个如何用 printf 打印 64 位数字的例子.此代码适用于 YASM. segment .data格式数据库“数字 %ld", 0x0a, 0 ;pr ..
发布时间:2021-11-26 14:17:21 其他开发

汇编系统调用无效

我想用以下内容打印 AAAA: BITS 32;;写;推送 0x41414141;流行 ecx ;移动 eax, 4 ;write 是 32 位 Ubuntu 的系统调用 4移动 ebx, 1 ;标准输出mov edx, 4 ;整数 0x80 ;;出口;移动 eax, 1 ;移动 ebx, 0 ;整数 0x80 ; 然而,一旦组装和链接此代码只退出,没有错误,有什么问题? 解决方案 快 ..
发布时间:2021-11-26 14:06:09 其他开发

什么是更好的“int 0x80"?或“系统调用"在 Linux 上的 32 位代码中?

我研究了 Linux 内核,发现对于 x86_64 架构,中断 int 0x80 不能用于调用系统调用1. 对于 i386 架构(32 位 x86 用户空间),哪个更可取:syscall 或 int 0x80,为什么? 我使用 Linux 内核版本 3.4. 脚注 1:int 0x80 在某些情况下在 64 位代码中确实有效,但从不推荐.如果在 64 位代码中使用 32 位 in ..
发布时间:2021-11-26 14:01:15 服务器开发

程序集执行/bin/bash (x64)

我是 asm 的新手,我正在尝试对/bin/bash 执行系统调用.但是我目前遇到以下问题: 我的代码适用于第一个参数长度小于 8 个字节的任何 execve 调用,即“/bin/sh"或“/bin/ls": .section .data名称:.string "/bin/sh".section .text.globl _start_开始:#execve 的第三个参数,设置为 NULL异或 ..
发布时间:2021-11-25 07:44:54 C#

32 位 Linux 上的 Syscall 或 sysenter?

从 MS‑DOS 开始,我就知道使用中断进行系统调用.在旧论文中,我看到引用 int 80h 在 Linux 上调用系统函数.很长一段时间以来,我知道 int 80h 已被弃用,取而代之的是 syscall 指令.但我无法在我的 32 位机器上运行. 问题 syscall 指令只能在 64 位平台上使用吗?32 位 Linux 不使用 syscall 吗? 样本测试 在我的 ..
发布时间:2021-11-24 23:06:07 服务器开发

将存储在 EDX:EAX 中的 64 位数字打印到标准输出

我有一个很大的 64 位数字存储在 EDX:EAX 中,分别为 21C3677C:82B40000.我正在尝试将数字作为十进制 2432902008176640000 打印到控制台.是否有系统调用可以让我完成此操作? 解决方案 这里是一个如何用 printf 打印 64 位数字的例子.此代码适用于 YASM. segment .data格式数据库“数字 %ld", 0x0a, 0 ;pr ..
发布时间:2021-11-24 23:02:37 C#

汇编系统调用无效

我想用以下内容打印 AAAA: BITS 32;;写;推送 0x41414141;流行 ecx ;移动 eax, 4 ;write 是 32 位 Ubuntu 的系统调用 4移动 ebx, 1 ;标准输出mov edx, 4 ;整数 0x80 ;;出口;移动 eax, 1 ;移动 ebx, 0 ;整数 0x80 ; 然而,一旦组装和链接此代码只退出,没有错误,有什么问题? 解决方案 快 ..
发布时间:2021-11-24 22:52:23 C#

什么是更好的“int 0x80"?或“系统调用"在 Linux 上的 32 位代码中?

我研究了 Linux 内核,发现对于 x86_64 架构,中断 int 0x80 不能用于调用系统调用1. 对于 i386 架构(32 位 x86 用户空间),哪个更可取:syscall 或 int 0x80,为什么? 我使用 Linux 内核版本 3.4. 脚注 1:int 0x80 在某些情况下在 64 位代码中确实有效,但从不推荐.如果在 64 位代码中使用 32 位 in ..
发布时间:2021-11-24 22:47:41 服务器开发

如何在ARM64中实现系统调用?

我正在使用 arm64 汇编代码,我想使用 svc 指令实现系统调用.我在网上找不到任何可用的 arm64 系统调用实现.另外,我找不到 arm64 的系统调用列表.还解释了实现. 解决方案 可以将x0中的六个参数传递给x5,返回值保存在x0. 为了给出汇编代码片段,这是来自 Android Bionic 的 libc 实现.write 的三个参数已经在 x0-x2 中.系统调用号在 ..
发布时间:2021-11-17 22:43:07 其他开发

可以将超过七个参数传递给arm linux中的系统调用吗?

在arm linux(EABI)中,系统调用号在r7中传递,参数可以在r0-r6寄存器中传递 下表来自 (syscall(2))显示用于传递系统调用的寄存器参数. arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7 注释─────────────────────────────────────────────────────────────────── ..
发布时间:2021-11-17 22:41:17 服务器开发

ARM-OABI 上 syscall() 的实现.什么是“svc #0x900071"?

我了解到系统调用号是作为 ARM OABI(旧应用程序二进制接口)上的“svc(或 swi)"指令的直接操作数传递的.立即数操作数为“0x900000+(系统调用次数)" 例如,发出EXIT系统调用如下. svc #0x900001 @ sys_exit 我对 syscall() 函数的实现感到好奇,因为 sycall() 将系统调用号作为其参数.我猜 syscall() 的二进制代码不能轻易 ..
发布时间:2021-11-17 22:24:53 服务器开发