Linuxカーネルヘッダファイルの設定

Linuxカーネルヘッダファイルの設定

システムコールの内容を読んだとき、LXRはヘッダファイルを見つけるために「syscalls.h」を検索しました。検索結果が私を混乱させました。 「arch/_arch_name_/include/asm」の下のディレクトリには、12個以上の「syscalls.h」ファイルがあります。大丈夫です。アーキテクチャ固有の定義またはその他の必要事項です。問題は、/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つの特別なシステムコールファイルがあります。

syscalls/syscall_32.tbl そしてディト「64」

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

通常、インクルードディレクトリやその他のヘッダファイル(kernel / sched / sched.hなどのスタンドアロンファイル)は階層論理に従います。私はmakeとgccの両方が重要な役割を果たしていると思います。

各ヘッダー「単位」が一度だけ読み取られるように、これらのシンボルを体系的に使用します。 (十字形が多すぎる可能性があるため、「保護包装紙」)。ここから来ます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.

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

関連情報