Cは、システムコール用のwrite()、read()、およびその他のライブラリ関数を提供します。 Linuxでライブラリを使用せずにCでシステムコールを作成するには?
答え1
野心や純度に対する強すぎる欲求は、インラインアセンブリにつながる可能性があります。たとえば、x86_64システムでは、open(2)
次のシステムコールを実行できます。
#include <sys/syscall.h>
int
linux_open(const char *pathname, unsigned long flags, unsigned long mode)
{
long ret;
asm volatile ("syscall" : "=a" (ret) : "a" (__NR_open),
"D" (pathname), "S" (flags), "d" (mode) :
"cc", "memory", "rcx",
"r8", "r9", "r10", "r11" );
if (ret < 0)
{
errno = -ret;
ret = -1;
}
return (int) ret;
}
より理解しやすいlibcのソースコードを見ることができます(例:無実)システムコールがどのように実装されているかを理解します。
答え2
システムコールを実行するには、C言語仕様に含まれていない機能の一部をCPUで実行する必要があります。システムコールは、CPUのアセンブリ言語で作成および接続するか、C関数内でいくつかのCPU関連のインラインアセンブリを使用します。
すべてのシステムコールには非常に似た設定が必要なため、これをサポートするためにさまざまなマクロがLinuxカーネルで定義されています。その結果、CPU関連のアセンブラが実際にどこから来たのかを言いにくいことが多いですが、十分に深く掘り下げれば把握できます。