Organisasi header kernel Linux

8

Ketika saya sedang membaca tentang panggilan sistem, saya mencari "syscalls.h" untuk menemukan file header di LXR. Hasil pencarian membuat saya bingung. Ada selusin file "syscalls.h" yang berasal dari direktori di bawah "arch / _arch_name_ / include / asm". Ini ok, mereka definisi arsitektur khusus atau sesuatu yang dibutuhkan. Pertanyaannya adalah mengapa kita memiliki dua header "syscalls.h" yang berbeda di bawah / include / linux dan / include / asm-generic?

Juga, saya ingin mencari tahu untuk apa header / include / linux dan untuk apa / include / header generik. Bagaimana mereka membedakan satu sama lain? Apa logika di balik memiliki dua folder header terpisah? Bagaimana mereka saling berhubungan?

Terima kasih

kotor
sumber

Jawaban:

1

Perangkat lunak harus portabel. Jika Anda mengkompilasi sumber C / C ++ Anda, maka Anda tidak perlu tahu apakah Anda menjalankan i386 / x86_64 / arm / mips atau apa pun. Header dihubungkan sedemikian rupa sehingga kompilasi perangkat lunak.

Semua file header lainnya ada karena mereka menerapkan banyak standar yang berbeda, ada port dari BSD dan sebagainya. Begitu banyak dari mereka yang berdasarkan sejarah. Dari mana masing-masing berasal dan mengapa mereka ada di sana memiliki banyak alasan berbeda dan pasti akan meniup jawaban.

Dan jawaban untuk asm-generic: stackoverflow

Komunitas
sumber
1

Header di bawah asm/genericsebagian besar dimaksudkan sebagai langkah sementara, versi portabel dalam C sampai versi arsitektur spesifik ditulis. Anda juga akan menemukan bahwa dalam beberapa kasus /usr/include/foobar.hmenyertakan banyak header "implementasi internal", dan akhirnya kembali pada bagian yang berasal dari kernel, yang sering disebut sama. Contohnya adalah math.hdan (lebih tergantung Linux) syscall.h.

vonbrand
sumber
0

arch/x86/entry/ memiliki dua file syscall khusus:

syscalls/syscall_32.tbl dan juga "64"

Syscalls spesial karena kernel harus menyatukan ABI dan API.

Secara umum, direktori include dan file header lainnya (yang independen seperti kernel / sched / sched.h) mengikuti logika hierarkis. Saya pikir keduanya membuat dan gcc berperan.

Ada penggunaan sistematis dari simbol-simbol ini untuk memastikan setiap "unit" header hanya dibaca sekali. ("pembungkus pelindung" karena terlalu banyak berselang-seling). Di sini dari 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 */

File tbl memiliki:

# 32-bit system call numbers and entry vectors

Daftar dimulai dengan:

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.

Saya akan melakukan tata letak nanti ...

rastafile
sumber