Организация заголовков ядра Linux

8

Пока я читал системные вызовы, я выполнил поиск "syscalls.h", чтобы найти файл заголовка в LXR. Результаты поиска меня озадачили. Существует дюжина файлов "syscalls.h" из каталогов в каталоге "arch / _arch_name_ / include / asm". Это нормально, это специфичные для архитектуры определения или что-то еще необходимое. Вопрос в том, почему у нас есть два разных заголовка «syscalls.h» в / include / linux и / include / asm-generic?

Также я хочу узнать, для чего нужны заголовки / include / linux и для чего нужны заголовки / include / asm-generic. Как они различают друг друга? Какова логика наличия двух отдельных папок заголовка? Как они связаны друг с другом?

Спасибо

грязный немного
источник

Ответы:

1

Программное обеспечение должно быть портативным. Если вы компилируете исходные тексты на C / C ++, вам не нужно знать, используете ли вы i386 / x86_64 / arm / mips или что-то еще. Заголовки связаны таким образом, что программное обеспечение компилируется.

Все остальные заголовочные файлы существуют, потому что в них реализовано много разных стандартов, есть порты от BSD и так далее. Так многие из них исторически основаны. Откуда каждый приходит и зачем он там, имеет много разных причин и наверняка даст ответ.

И ответ для asm-generic: stackoverflow

Сообщество
источник
1

Под заголовками asm/genericподразумеваются, в основном, меры с ограничением, переносимые версии на C, пока не будет написана версия для конкретной архитектуры. Вы также обнаружите, что в некоторых случаях /usr/include/foobar.hвключает множество заголовков «внутренней реализации» и, наконец, прибегаете к части, которая исходит от ядра, часто называемого тем же. Примеры есть math.hи (более Linux-зависимые) syscall.h.

vonbrand
источник
0

arch/x86/entry/ имеет два специальных файла системного вызова:

syscalls/syscall_32.tbl и дито "64"

Системные вызовы особенные, потому что ядро ​​должно объединять ABI и API.

В общем, файлы include и другие заголовочные файлы (независимые, такие как 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.

Я сделаю макет позже ...

rastafile
источник