Mengapa aplikasi ruang pengguna membutuhkan header kernel?

10

Saya sedang membangun kotak sibuk dan iptables untuk perangkat yang disematkan dan salah satu dependensi untuk mereka adalah header kernel.

Saya telah mencari seluruh sistem file untuk file * .ko dan tidak menemukannya. Jadi saya menyimpulkan bahwa aplikasi tidak membuat driver yang dapat dimuat (modul kernel).

Apa kasus lain untuk aplikasi ruang pengguna yang membutuhkan header kernel?

TheMeaningfulEngineer
sumber
Contoh mudah untuk muncul adalah ketika sesuatu di ruang pengguna mengeluarkan panggilan sistem.
Sami Laine
@SamiLaine Saya kira perpustakaan c akan menyediakan antarmuka untuk panggilan sistem. Jika yang Anda katakan adalah masalahnya, bukankah Anda, misalnya, harus mengimpor header kernel hanya untuk membuka soket?
TheMeaningfulEngineer
Socket (2), adalah panggilan sistem, bukan fungsi perpustakaan, jadi ya.
Sami Laine
@SamiLaine Bisakah Anda memberi contoh di mana Anda harus include <linux/*.h>membuka soket? (Saya mengincar sys / socket.h)
TheMeaningfulEngineer

Jawaban:

8

Karena program-program itu dibuat untuk menggunakan hal-hal yang didefinisikan dalam header kernel:

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 */
....

Untuk setiap alat tertentu, Anda harus membaca sumber alat dan header kernel yang relevan untuk mencari tahu apa sebenarnya.

Anda dapat melihat beberapa hal yang dikomentari untuk membuatnya mudah.

Misalnya, mkfs_vfattermasuk linux/fd.huntuk mendapatkan 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);

Anda mungkin dapat menghapus yang relevan #includedan mengawasi kesalahan kompiler untuk membuatnya lebih mudah, Anda akan mendapatkan peringatan bahwa beberapa hal tidak didefinisikan. Hal-hal itu kemungkinan berasal dari header kernel.

suprjami
sumber
2
1. Busybox dirancang untuk embedded dan sistem ringan lainnya, di mana Anda ingin memuat perpustakaan sebanyak mungkin dalam memori. Saya belum membaca sumbernya, tapi mungkin BB pada dasarnya menghindari perpustakaan dan tautan langsung ke kernel. 2. Tidak. Ini memasangkan ruang biner userspace Anda dengan versi API API , yang kompatibel dengan mundur: biner yang dikompilasi hari ini mungkin tidak berfungsi pada kernel yang lebih lama (tergantung pada simbol yang disertakan ... baca kode sumber) tetapi akan bekerja dengan kernel masa depan.
ignis
1
@suprjami ABI mematuhi standar SysV ABI, yang dapat dianggap tidak berubah; di antara hal-hal lain, SysV ABI adalah mengapa Anda dapat menautkan kernel dengan kompiler (dan versi) pilihan Anda, tidak harus sama persis dengan yang dipancarkan biner kernel.
ignis
1
... itu juga memungkinkan chroot / LXC menjadi distro yang dikirimkan dengan kernel yang berbeda. dll
ignis
1
(Untuk kejelasan: perhatikan bahwa kernel memiliki ABI eksternal , yang akan kita bahas di sini, dan ABI internal antara modul-modul kernel, yang sering mengalami perubahan dan mungkin tidak kompatibel, tetapi tidak dilihat oleh userspace dan tidak relevan ketika mengkompilasi userspace kode.)
ignis
1
(Perhatikan juga bahwa ABI = / = API. API kernel (eksternal) menyertakan simbol yang dirujuk dalam kode sumber, dan pengembang kernel telah berkomitmen untuk menjaga kompatibilitas; kecuali simbol tersebut sangat jarang digunakan dalam perangkat lunak dunia nyata, itu akan menjadi langkah yang tidak masuk akal bagi mereka untuk membuat perubahan yang tidak kompatibel, meskipun tidak ada standar pihak ketiga yang mengamanatkan seluruh API Linux dan karena itu tidak ada yang secara teknis menghambatnya.)
ignis