Organisation der Linux-Kernel-Header

8

Während ich Systemaufrufe las, suchte ich nach "syscalls.h", um die Header-Datei in LXR zu finden. Die Suchergebnisse haben mich verwirrt. Es gibt ein Dutzend "syscalls.h" -Dateien aus Verzeichnissen unter "arch / _arch_name_ / include / asm". Diese sind in Ordnung, es handelt sich um architekturspezifische Definitionen oder etwas anderes, das benötigt wird. Die Frage ist, warum wir zwei verschiedene "syscalls.h" -Header unter / include / linux und / include / asm-generic haben.

Außerdem möchte ich herausfinden, wofür / include / linux-Header und wofür / include / asm-generic-Header bestimmt sind. Wie unterscheiden sie sich? Welche Logik steckt hinter zwei separaten Header-Ordnern? Wie verhalten sie sich zueinander?

Vielen Dank

Dirtybit
quelle

Antworten:

1

Die Software muss portabel sein. Wenn Sie Ihre C / C ++ - Quellen kompilieren, müssen Sie nicht wissen, ob Sie i386 / x86_64 / arm / mips ausführen oder was auch immer. Die Header sind so verknüpft, dass die Software kompiliert wird.

Alle anderen Header-Dateien existieren, weil sie viele verschiedene Standards implementiert haben, es gibt Ports von BSD und so weiter. So viele von ihnen sind historisch begründet. Woher jeder kommt und warum er dort ist, hat viele verschiedene Gründe und wird sicherlich Antworten geben.

Und eine Antwort für asm-generic: Stackoverflow

Gemeinschaft
quelle
1

Die Header unter asm/genericsind meistens als Notlösung gedacht, tragbare Versionen in C, bis eine architekturspezifische Version geschrieben wird. Sie werden auch feststellen, dass in einigen Fällen /usr/include/foobar.heine Reihe von "internen Implementierungs" -Headern enthalten sind und schließlich auf einen Teil zurückgegriffen wird, der aus dem Kernel stammt und häufig als derselbe bezeichnet wird. Beispiele sind math.hund (mehr Linux-abhängig) syscall.h.

vonbrand
quelle
0

arch/x86/entry/ hat zwei spezielle Syscall-Dateien:

syscalls/syscall_32.tbl und dito "64"

Syscalls sind etwas Besonderes, da der Kernel ABI und API zusammenbringen muss.

Im Allgemeinen folgen die Include-Verzeichnisse und die anderen Header-Dateien (unabhängige wie Kernel / Sched / Sched.h) einer hierarchischen Logik. Ich denke, sowohl make als auch gcc spielen eine Rolle.

Diese Symbole werden systematisch verwendet, um sicherzustellen, dass jede Header- "Einheit" nur einmal gelesen wird. ("Schutzhüllen", weil es zu viel Kreuz geben kann). Hier von 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 */

Die tbl-Dateien haben:

# 32-bit system call numbers and entry vectors

Die Liste beginnt mit:

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.

Ich werde das Layout später machen ...

Rastafile
quelle