システムコールの内容を読んだとき、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.
レイアウトは後でやります...