उपयोगकर्ता स्थान एप्लिकेशन को कर्नेल हेडर की आवश्यकता क्यों है?


10

मैं एक एम्बेडेड डिवाइस के लिए व्यस्त-बॉक्स और iptables का निर्माण कर रहा हूं और उनके लिए निर्भरता में से एक कर्नेल हेडर हैं।

मैंने * .ko फ़ाइलों के लिए संपूर्ण फ़ाइल सिस्टम खोजा है और कोई भी नहीं मिला है। इसलिए मैंने निष्कर्ष निकाला कि ऐप कोई लोड करने योग्य ड्राइवर (कर्नेल मॉड्यूल) नहीं बना रहे हैं।

कर्नेल हेडर की आवश्यकता के लिए यूजर स्पेस एप्लिकेशन के लिए अन्य मामले क्या हैं?


एक आसान उदाहरण के साथ आने के लिए है जब उपयोगकर्ता अंतरिक्ष में कुछ सिस्टम कॉल जारी करता है।
सामी Laine

@SamiLaine मुझे लगता है कि सी लाइब्रेरी सिस्टम कॉल को इंटरफ़ेस प्रदान करेगी। यदि आप जो कह रहे हैं वह मामला था, तो क्या आप, उदाहरण के लिए, सिर्फ एक सॉकेट खोलने के लिए कर्नेल हेडर आयात नहीं करना होगा?
सुंदर अंगरक्षक

सॉकेट (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. बिजीबॉक्स को एम्बेडेड और अन्य हल्के प्रणालियों के लिए डिज़ाइन किया गया है, जहां आप संभव के रूप में स्मृति में कम पुस्तकालयों को लोड करना चाहते हैं। मैंने स्रोत नहीं पढ़ा है, लेकिन शायद बीबी मूल रूप से पुस्तकालयों को दरकिनार कर रही है और सीधे कर्नेल के खिलाफ लिंक करती है। 2. नहीं। यह आपके यूजरस्पेस बाइनरी को कर्नेल एपीआई के एक संस्करण के साथ द्विआधारी देता है, जो पीछे की ओर संगत है: एक बाइनरी संकलित आज एक पुराने कर्नेल पर काम नहीं कर सकता है (शामिल प्रतीकों के आधार पर ... स्रोत कोड पढ़ें) लेकिन होगा भविष्य की गुठली के साथ काम करें।
इग्निस

1
@suprjami ABI मानक SysV ABI का पालन करता है, जिसे यथोचित रूप से परिवर्तन नहीं माना जा सकता है; अन्य बातों के अलावा, SysV ABI है कि आप कर्नेल को अपनी पसंद के संकलक (और संस्करण) के साथ लिंक कर सकते हैं, जरूरी नहीं कि वही जो कर्नेल बाइनरी उत्सर्जित हो।
इग्निस

1
... यह भी एक विकृत है कि एक अलग कर्नेल के साथ भेज दिया में / LXC chroot संभव बनाता है। आदि
इग्निस

1
(स्पष्टता के लिए: ध्यान दें कि कर्नेल में एक बाहरी ABI है , जिसके बारे में हम यहां चर्चा कर रहे हैं, और कर्नेल मॉड्यूल के बीच एक आंतरिक ABI , जो अक्सर और संभवतः असंगत परिवर्तनों से गुजरता है, लेकिन यह उपयोगकर्ताओं द्वारा नहीं देखा जाता है और उपयोगकर्ताओं के संकलन के दौरान अप्रासंगिक है। कोड।)
इग्निस

1
(यह भी ध्यान दें कि एबीआई = / = एपीआई। कर्नेल के (बाहरी) एपीआई में स्रोत कोड में संदर्भित प्रतीक शामिल हैं, और कर्नेल डेवलपर्स ने संगतता बनाए रखने के लिए प्रतिबद्ध किया है; जब तक कि प्रतीकों को शायद ही कभी वास्तविक विश्व सॉफ्टवेयर में उपयोग नहीं किया जाता है, यह होगा; उनके लिए एक अनुचित कदम असंगत परिवर्तन करने के लिए, हालांकि किसी तीसरे पक्ष के मानक जनादेश लिनक्स एपीआई की पूरी और इसलिए कुछ भी नहीं तकनीकी रूप से यह बाधा उत्पन्न)।
IGNIS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.