Чому додаткам для простору користувачів потрібні заголовки ядра?


10

Я будую зайнятий ящик і iptables для вбудованого пристрою, і однією з залежностей для них є заголовки ядра.

Я шукав у всій файловій системі файли * .ko і не знайшов жодного. Отже, я зробив висновок, що програми не створюють жодних завантажуваних драйверів (модулів ядра).

Які ще випадки, коли для програми для користувальницького простору потрібні заголовки ядра?


Простий приклад - це коли щось у користувальницькому просторі видає системний виклик.
Самі Лайн

@SamiLaine Я б здогадався, що бібліотека c надасть інтерфейс для системних викликів. Якби те, що ви говорите, було так, чи не, наприклад, вам не довелося б імпортувати заголовки ядра просто для того, щоб відкрити сокет?
TheMeaningfulEngineer

Socket (2) - це системний виклик, а не функція бібліотеки, так що так.
Самі Лайн

@SamiLaine Чи можете ви навести приклад, коли потрібно include <linux/*.h>відкрити сокет? (Я мав на меті sys / socket.h)
TheMeaningfulEngineer

Відповіді:


8

Оскільки ці програми побудовані для використання речей, визначених у заголовках ядра:

busybox-1.22.1]$ egrep -RHn '^#include <linux'
modutils/modutils-24.c:194:#include <linux/elf-em.h>
include/fix_u32.h:17:#include <linux/types.h>
libbb/loop.c:11:#include <linux/version.h>
console-tools/openvt.c:23:#include <linux/vt.h>
console-tools/kbd_mode.c:23:#include <linux/kd.h>
console-tools/showkey.c:19:#include <linux/kd.h>
util-linux/blockdev.c:36:#include <linux/fs.h>
util-linux/mkfs_ext2.c:50:#include <linux/fs.h>
util-linux/mkfs_vfat.c:28:#include <linux/hdreg.h> /* HDIO_GETGEO */
util-linux/mkfs_vfat.c:29:#include <linux/fd.h>    /* FDGETPRM */
....

Для кожного конкретного інструменту вам потрібно буде прочитати джерело інструменту та відповідний заголовок ядра, щоб зрозуміти, що саме.

Ви можете бачити кілька речей, коментованих для полегшення.

Наприклад, mkfs_vfatвключає в себе , linux/fd.hщоб отримати FDGETPRM:

$ egrep -RHn FDGETPRM util-linux/mkfs_vfat.c
util-linux/mkfs_vfat.c:29:#include <linux/fd.h>    /* FDGETPRM */
util-linux/mkfs_vfat.c:351:         int not_floppy = ioctl(dev, FDGETPRM, &param);

Ви, ймовірно, можете видалити відповідні #includeта спостерігати за помилками компілятора, щоб спростити їх, ви отримаєте попередження про те, що деякі речі не визначені. Ці речі, ймовірно, походять із заголовків ядра.


2
1. Busybox призначений для вбудованих та інших легких систем, де ви хочете завантажити якомога менше бібліотек у пам'ять. Я не читав джерела, але, ймовірно, BB в основному є кроком до бібліотек і посилається безпосередньо на ядро. 2. Ні. Він поєднує ваш двійковий простір користувачів з версією API ядра , яка сумісна назад: двійкове скомпільоване сьогодні може не працювати на більш старому ядрі (залежно від символів, що входять ... читайте вихідний код), але буде робота з майбутніми ядрами.
ignis

1
@suprjami ABI підкоряється стандарту SysV ABI, який можна обґрунтовано вважати, що він не змінюється; серед іншого, SysV ABI - це те, чому ви можете зв’язати ядро ​​зі своїм компілятором (і версією) на вибір, не обов'язково тим самим, який випромінював бінарне ядро.
ignis

1
... це також дозволяє chroot / LXC в дистрибутив, який постачається з іншим ядром. пр.
ignis

1
(Для наочності: зверніть увагу, що ядро ​​має зовнішній ABI , про який ми тут і обговорюємо, і внутрішній ABI між модулями ядра, який зазнає частих і, можливо, несумісних змін, але він не бачиться в просторі користувачів і не має значення при компілюванні простору користувачів код.)
ignis

1
(Також зауважте, що API ABI = / = API) (зовнішній) API ядра включає символи, на які посилається у вихідному коді, і розробники ядра зобов'язалися підтримувати сумісність; якщо символи дуже рідко використовуються в реальному програмному забезпеченні, це було б нерозумний хід вносити несумісні зміни, хоча жоден сторонній стандарт не мандатирує весь API Linux і тому нічого технічно це не перешкоджає.)
ignis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.