GlibcのようなプログラムがLinuxカーネルヘッダーを必要とするのはなぜですか? Linux APIはsyscallを介して提供され、muslなどの他のlibc実装はこれらのヘッダーを必要としません。
Glibcが特別な理由は何ですか?
Syscallは、呼び出しメカニズムを除いて、通常の関数呼び出しと同じです。通常のC関数呼び出しと同様に、呼び出された関数が期待するパラメーターとタイプ、および戻り値を知る必要があります。例として、struct stat
へのポインタをパラメータとして受け取るstat
システムコールを見てください。カーネルとユーザースペースのコードは、データがどのように構造化されているかについて合意する必要があり、これの型定義の最も信頼のおけるソースはカーネルです。
現在、カーネルAPIには安定性が保証されているため、これらのデータ型が変更されることはめったにありません。したがって、Muslの開発者は、カーネルヘッダーに依存するよりも、手動で編集した定義のコピーを維持する方が簡単であることに気付きました。 Muslソースコードには、たとえば、ファイルArch/x86_64/bits/syscall.h.in
に独自のシステムコール番号のリストが含まれています。