asm-generic
- это шаблонная версия, которую можно использовать, если вы разрабатываете новую архитектуру для ядра. Я полагаю, вы обнаружите, что на самом деле в исходном коде ядра существует множество версий unistd.h
, потому что порядок системных вызовов (и, действительно, наличие системных вызовов) варьируется в зависимости от архитектуры. Попробуйте это из корня вашей исходной иерархии ядра:
find . -name 'unistd*.h'
В частности, для x86 uapi
версия генерируется при сборке ядра. См. Makefile
и различные *.tbl
файлы в каталоге arch/x86/entry/syscalls/
. Это приводит к генерации файлов:
arch/x86/include/generated/uapi/asm/unistd_64.h
arch/x86/include/generated/uapi/asm/unistd_32.h
arch/x86/include/generated/uapi/asm/unistd_x32.h
(все они #include
d из файла-заглушки unistd.h
).
В конечном итоге создание linux-дистрибутива зависит от конкретной архитектуры, поэтому создатель дистрибутива должен скопировать правильные файлы unistd.h
в какое-то подходящее место в иерархии /usr/include
. (И, конечно, ваш libc
также должен быть скомпилирован с правильной версией, чтобы обычные системные вызовы libc
работали правильно.)
Таким образом, версия в /usr/include/asm
имела лучше , соответствующую вашему работающему ядру, иначе будет невозможно правильно сгенерировать специальный системный вызов из пользовательского процесса в вашей системе, но вы не должен использовать его в исходной иерархии ядра, потому что категорически исходная иерархия ядра никогда не опирается на заголовки пространства пользователя. В исходном коде ядра механизм индексации этой таблицы зависит от архитектуры, поскольку сама структура и порядок таблицы зависят от архитектуры, и только специфический для архитектуры код (код записи системного вызова) обычно обращается к таблице, так что только Код "должен знать" правильные индексы.
Теперь, если вы создаете новый системный вызов, вам нужно будет определить его номер во всех unistd.h
файлах для всех архитектур, в которых вы хотите, чтобы он появлялся.