【问题标题】:Implement my own syscalls实现我自己的系统调用
【发布时间】:2017-07-27 02:40:36
【问题描述】:

跟进this 问题。我正在编写自己的(非常基本的)标准库(使用-nostdlib gcc 选项编译)。似乎几乎所有东西的基础都是writereadcreatopenclose等。

据我了解,glibc 只是使用存根、SYSCALL_INTERNAL 宏等来提供这些功能。我没有使用 glibc,也不想变得很复杂。

我的问题。如何在没有 glibc 的情况下调用 Unix 低级函数,例如 writeread

【问题讨论】:

标签: c system glibc libc low-level


【解决方案1】:

您可以直接从汇编语言进行系统调用,例如,对于 Linux x86_64:

main.c:

long mywrite(int, const void *, unsigned long);

int main(void)
{
    char buffer[] = "Hello, world!\n";
    mywrite(1, buffer, 14);
    return 0;
}

write.S:

.global mywrite

.text

mywrite:
        push    %rbp
        mov     %rsp, %rbp
        mov     $1, %rax
        syscall
        leave
        ret

带输出:

paul@thoth:~/src/sandbox/syscall$ gcc -o sc main.c write.S
paul@thoth:~/src/sandbox/syscall$ ./sc
Hello, world!
paul@thoth:~/src/sandbox/syscall$ 

显然,这个实现没有设置errno 或类似的东西,但这与实际进行系统调用无关。在汇编中实现单个 syscall() 函数会更容易,然后有常规的 C 函数来调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2012-09-28
    • 2018-04-04
    • 2016-05-25
    • 2016-01-18
    • 2012-08-22
    相关资源
    最近更新 更多