实现我自己的系统调用
Implement my own syscalls
问题的跟进。我正在编写自己的(非常基本的)标准库(使用 -nostdlib
gcc 选项编译)。似乎几乎所有东西的底数都是write
、read
、creat
、open
、close
等
据我了解,glibc 只是使用存根、SYSCALL_INTERNAL
宏等来提供这些功能。我没有使用 glibc,我不想变得很复杂。
我的问题。如何在没有 glibc 的情况下调用 Unix 低级函数,例如 write
和 read
?
您可以直接从汇编语言进行系统调用,例如,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 , %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 函数调用它会更容易。
-nostdlib
gcc 选项编译)。似乎几乎所有东西的底数都是write
、read
、creat
、open
、close
等
据我了解,glibc 只是使用存根、SYSCALL_INTERNAL
宏等来提供这些功能。我没有使用 glibc,我不想变得很复杂。
我的问题。如何在没有 glibc 的情况下调用 Unix 低级函数,例如 write
和 read
?
您可以直接从汇编语言进行系统调用,例如,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 , %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 函数调用它会更容易。