Kullanıcı alanı uygulamaları neden çekirdek başlıklarına ihtiyaç duyuyor?


10

Ben gömülü bir aygıt için meşgul kutusu ve iptables inşa ediyorum ve onlar için bağımlılıklardan biri çekirdek başlıkları vardır.

Tüm dosya sistemini * .ko dosyaları için aradım ve hiçbiri bulamadım. Bu yüzden uygulamaların yüklenebilir sürücüler (çekirdek modülleri) oluşturmadığı sonucuna vardım.

Kullanıcı alanı uygulamasının çekirdek üstbilgileri gerektirmesi için başka durumlar nelerdir?


Gelmesi kolay bir örnek, kullanıcı alanındaki bir şeyin bir sistem çağrısı yayınlamasıdır.
Sami Laine

@SamiLaine c kütüphane sistem çağrıları için arayüz sağlayacak tahmin ediyorum. Eğer söylüyorsanız, örneğin, sadece bir soket açmak için çekirdek başlıklarını içe aktarmanız gerekmez mi?
TheMeaningfulEngineer

Soket (2), bir sistem çağrısıdır, kütüphane işlevi değildir, bu yüzden evet.
Sami Laine

@SamiLaine include <linux/*.h>Bir soket açmanız gereken yere bir örnek verebilir misiniz ? (Ben sys / socket.h hedefliyordum)
TheMeaningfulEngineer

Yanıtlar:


8

Çünkü bu programlar çekirdek başlıklarında tanımlanan şeyleri kullanmak için oluşturulmuştur:

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

Her bir belirli araç için, tam olarak ne olduğunu bulmak için aracın kaynağını ve ilgili çekirdek başlığını okumanız gerekir.

Bunu kolaylaştırmak için birkaç şeyin yorumlandığını görebilirsiniz.

Örneğin, mkfs_vfatiçerir linux/fd.halmak için 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);

Muhtemelen ilgili olanı kaldırabilir ve #includekolaylaştırmak için derleyici hatalarını izleyebilirsiniz, bazı şeylerin tanımlanmadığı konusunda uyarılar alırsınız. Bunlar muhtemelen çekirdek başlıklarından gelir.


2
1. Busybox, bellekte mümkün olduğunca az kütüphane yüklemek istediğiniz gömülü ve diğer hafif sistemler için tasarlanmıştır. Kaynağı okumadım, ama muhtemelen BB temelde kütüphaneleri kaldırıyor ve doğrudan çekirdeğe bağlanıyor. 2. Hayır. Kullanıcı alanınızın ikili dosyasını çekirdek API'sinin geriye dönük olarak uyumlu bir sürümü ile çiftler : bugün derlenen bir ikili dosya daha eski bir çekirdek üzerinde çalışmayabilir (sembollere bağlı olarak ... kaynak kodunu oku) gelecekteki çekirdeklerle çalışın.
ignis

1
@suprjami ABI, değişmemesi makul olarak kabul edilebilecek standart SysV ABI'ye uyar; diğer şeylerin yanı sıra, SysV ABI, çekirdeğe karşı derleyicinizle (ve sürümünüzle) bağlantı kurabilmenizdir, çekirdek ikilisini yayınlayanla aynı olmayabilir.
ignis

1
... aynı zamanda / LXC'yi farklı bir çekirdeğe sahip bir dağıtım haline getirmeyi de mümkün kılar. vb.
ignis

1
(Açıklık için: Çekirdeğin burada tartıştığımız harici bir ABI'sine ve sık ve muhtemelen uyumsuz değişikliklere uğrayan çekirdek modülleri arasında dahili bir ABI'ye sahip olduğunu, ancak kullanıcı alanı tarafından görülmediği ve kullanıcı alanını derlerken alakasız olduğunu unutmayın. kod.)
ignis

1
(Ayrıca ABI = / = API olduğunu unutmayın. Çekirdek (harici) API'si kaynak kodunda belirtilen sembolleri içerir ve çekirdek geliştiricileri uyumluluğu korumaya karar vermiştir; semboller gerçek dünya yazılımında çok nadir kullanılmadıkça, . Onlar için mantıksız bir hareket hiçbir üçüncü taraf standart görev Linux API bütün ve bu nedenle hiçbir şey teknik olarak Engeller bunu) ancak uyumsuz değişiklikler yapmak
IGNIS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.