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


8

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

また、/ include / linuxヘッダーとは何か、/ include / asm-genericヘッダーとは何かを知りたいです。彼らはどのようにお互いを区別しますか?2つの別個のヘッダーフォルダーを使用する背後にあるロジックは何ですか?それらはどのように互いに関係していますか?

ありがとう

回答:


1

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

他のすべてのヘッダーファイルは、さまざまな標準が実装されているため存在し、BSDからのポートなどがあります。それらの多くは歴史的に基づいています。それぞれがどこから来たのか、なぜそれらが存在するのかには、さまざまな理由があり、確実に答えが返ってきます。

そしてasm-genericの答え:stackoverflow


1

下のヘッダーasm/genericは、アーキテクチャ固有のバージョンが作成されるまでのCでの移植可能なバージョンである、一時的な対策として主に意図されています。また、場合によって/usr/include/foobar.hは、「内部実装」ヘッダーが多数含まれている場合があり、最終的にカーネルからのパーツ(通常は同じと呼ばれる)にフォールバックします。例はmath.hand(さらにLinuxに依存)syscall.hです。


0

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

syscalls/syscall_32.tbl そしてdito "64"

カーネルはABIとAPIを一緒にする必要があるため、syscallは特別です。

一般に、インクルードディレクトリと他のヘッダーファイル(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.

後でレイアウトします...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.