系统调用如何知道包装函数将其参数放在哪里?

发布于 2024-08-26 03:44:46 字数 266 浏览 6 评论 0原文

我正在尝试在 Linux (RedHat Enterprise 8) 中实现系统调用,但我对其工作方式有点困惑。据我了解,我在用户模式下实现了一个包装器,它将系统调用号放入 eax 中,将参数放入 ebx、ecx、edx 等中,然后调用 int 0x80 来调用适当的系统调用。我的问题是,由于系统调用的编写方式与常规 C 函数类似,它如何知道哪些寄存器包含哪些参数?它是一种约定吗?或者是否有一种机制?如果有的话,它在哪里以及如何实现?

编辑:这是一项家庭作业。我知道有系统调用宏可以为我做这些事情。

I'm trying to implement a syscall in Linux (RedHat Enterprise 8) and I'm a bit confused about the way it works. From what I understand, I implement a wrapper in user mode which puts the syscall number in eax and parameters in ebx, ecx, edx, etc, and then invokes int 0x80 which calls the appropriate syscall. My question is, since a syscall is written like a regular C function, how does it know what registers contain what parameters? Is it a convention, or is there a mechanism for it, and if so where and how does it do it?

EDIT: This is a homework assignment. I know that there are syscall macros that can do this stuff for me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

幽蝶幻影 2024-09-02 03:44:46

摘自 Linux Journal 文章,第 2 页底部

由于系统调用接口完全是寄存器参数的,因此单个系统调用最多可以使用六个参数。 %eax 是系统调用号; %ebx、%ecx、%edx、%esi、%edi 和 %ebp 是用作 param0-5 的六个通用寄存器; %esp 无法使用,因为它在进入ring 0(即内核模式)时被内核覆盖。

您的 C 代码可能看起来像是在进行系统调用,但它实际上调用了 libc 中的函数。该函数确保所有参数都位于正确的寄存器中,然后执行中断。

From the Linux Journal article, bottom of page 2

Since the system call interface is exclusively register-parametered, six parameters at most can be used with a single system call. %eax is the syscall number; %ebx, %ecx, %edx, %esi, %edi and %ebp are the six generic registers used as param0-5; and %esp cannot be used because it's overwritten by the kernel when it enters ring 0 (i.e., kernel mode).

Your c code may look like it's making a system call, but it actually calls a function in libc. That function makes sure that all the arguments are in the right registers, and then does the interrupt.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文