Linuxカーネルヘッダーの構成

Linuxカーネルヘッダーの構成

システム コールについて読んでいるときに、LXR のヘッダー ファイルを見つけるために「syscalls.h」を検索しました。検索結果に困惑しました。「arch/_arch_name_/include/asm」の下のディレクトリから「syscalls.h」ファイルが 12 個あります。これらは問題ありません。アーキテクチャ固有の定義か、他に必要なものです。問題は、/include/linux と /include/asm-generic の両方に 2 つの異なる「syscalls.h」ヘッダーがあるのはなぜかということです。

また、/include/linux ヘッダーと /include/asm-generic ヘッダーの目的を知りたいです。これらはどのように区別されるのでしょうか? 2 つの別々のヘッダー フォルダーが存在する理由は何ですか? これらはどのように相互に関連しているのでしょうか?

ありがとう

答え1

以下のヘッダーは、asm/generic主に暫定的な措置として意図されており、アーキテクチャ固有のバージョンが書かれるまでの C の移植可能なバージョンです。また、場合によっては、/usr/include/foobar.h多数の「内部実装」ヘッダーが含まれており、最終的にはカーネルから提供される部分 (多くの場合、同じと呼ばれます) に頼ることになります。例としては、math.hおよび (より Linux 依存)がありますsyscall.h

答え2

ソフトウェアは移植可能でなければなりません。C/C++ ソースをコンパイルする場合、i386/x86_64/arm/mips などを実行しているかどうかを知る必要はありません。ヘッダーはソフトウェアがコンパイルされるような方法でリンクされます。

他のすべてのヘッダー ファイルは、さまざまな標準が実装されているため存在し、BSD からの移植などもあります。その多くは歴史的なものです。それぞれのヘッダー ファイルがどこから来たのか、なぜそこにあるのかについてはさまざまな理由があり、答えはきっと見つからないでしょう。

asm-generic に対する回答:スタックオーバーフロー

答え3

arch/x86/entry/2 つの特別な syscall ファイルがあります。

syscalls/syscall_32.tbl 同じく「64」

カーネルは ABI と API を統合する必要があるため、システムコールは特別です。

一般的に、インクルード ディレクトリとその他のヘッダー ファイル (kernel/sched/sched.h のような独立したファイル) は階層的なロジックに従います。make と gcc の両方が役割を果たしていると思います。

これらのシンボルは、すべてのヘッダー「ユニット」が 1 回だけ読み取られることを保証するために体系的に使用されています。(交差が多すぎる可能性があるため、「保護ラッパー」と呼ばれます)。以下は引用ですinclude/linux/mm.h:

    #ifndef _LINUX_MM_H
    #define _LINUX_MM_H

    #include <linux/errno.h>

    #ifdef __KERNEL__

    ...  (#includes)
    ...  (ext. decl. etc., the whole mm.h)

    #endif /* __KERNEL__ */
    #endif /* _LINUX_MM_H */

tbl ファイルには次の内容が含まれます。

# 32-bit system call numbers and entry vectors

リストは次で始まります:

0    i386    restart_syscall    sys_restart_syscall       __ia32_sys_restart_syscall
1    i386    exit               sys_exit                  __ia32_sys_exit
2    i386    fork               sys_fork                  __ia32_sys_fork
3    i386    read               sys_read                  __ia32_sys_read




#
# 64-bit system call numbers and entry vectors
#
# The format is:
# <number> <abi> <name> <entry point>
#
# The __x64_sys_*() stubs are created on-the-fly for sys_*() system calls
#
# The abi is "common", "64" or "x32" for this file.

レイアウトは後でやります...

関連情報