Они очень разные; /usr/include/linux
заголовки - это заголовки, которые использовались при компиляции стандартной C-библиотеки системы. Они принадлежат пакету библиотеки C и обновляются в стандартной версии стандартной библиотекой C. Они существуют, чтобы обеспечить ядру интерфейс userland , как это понято и "предоставлено" 1 библиотекой C.
Заголовки /usr/src/linux-headers-$(uname -r)/include/linux
используются через символические ссылки /lib/modules/$(uname -r)/build
. Они принадлежат пакетам заголовков ядра и обновляются вместе с ядром. Это подмножество заголовков ядра и достаточно системы Kbuild, необходимой для сборки модулей ядра из дерева. Эти файлы представляют собой внутреннюю часть ядра - модули должны быть скомпилированы с ними, чтобы правильно понимать объекты в памяти. Посмотрите файл Documentation/kbuild/modules.txt
ядра для некоторых деталей.
1: «Опосредовано» было моим первым выбором слова, но оно подразумевает какой-то контроль доступа, что не так. «Брокерский» подразумевает сторонний процесс, но это также не так. Обратите внимание: когда C-программа вызывает _exit()
, она на самом деле вызывает стандартную библиотеку C _exit()
wrapper , которая вызывает системный вызов exit(2)
. Интерфейс select(2)
имеет верхний предел количества файловых дескрипторов, которые можно отслеживать, и этот предел компилируется в стандартную библиотеку C. Даже если бы интерфейс ядра был расширен, библиотеку C также пришлось бы перекомпилировать.