2009-05-03 14 views
7

क्या लिनक्स कर्नेल (2.6) मॉड्यूल को संकलित करना संभव है जिसमें गैर-कर्नेल द्वारा परिभाषित कार्यक्षमता शामिल है?गैर कर्नेल हेडर समेत लिनक्स कर्नेल (2.6) मॉड्यूल संकलित करें

उदाहरण के लिए:


kernelmodule.h

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> // printk() 
// ... 
#include <openssl/sha.h> 
// ... 

Makefile

obj-m := kernelmodule.o 
all: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules 

clean: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean 
    $(RM) Module.markers modules.order 

कर्नेल मॉड्यूल मैं लिखा है और संकलित करने के लिए कोशिश कर रहे हैं में पाया कार्यक्षमता शामिल ओ की संख्या पेनस्ल में फाइलें शामिल हैं।

ऊपर प्रस्तुत मानक मेकफ़ाइल लिनक्स शीर्षकों के बाहर शामिल करने की अनुमति नहीं देता है। क्या यह कार्यक्षमता शामिल करना संभव है, और यदि ऐसा है, तो क्या आप मुझे सही दिशा में इंगित कर सकते हैं।

धन्यवाद, माइक

उत्तर

11

गिरी यूज़रस्पेस कोड का उपयोग नहीं कर सकते हैं और अकेले खड़े होने चाहिए (यानी पूरी तरह से आत्म निहित हो, कोई पुस्तकालयों), इसलिए इसे मानक हेडर लेने नहीं करता है।

यह स्पष्ट नहीं है कि उपयोगकर्ता स्पेस चुनने का प्रयास करने का क्या लाभ है। यदि वहां ऐसी चीजें हैं जो उपयोग करने के लिए मान्य होंगी (स्थिरांक, कुछ मैक्रोज़ शायद प्रदान किए गए हैं तो वे किसी भी उपयोगकर्ता स्पेस फ़ंक्शन को कॉल नहीं करते हैं), तो उन्हें डुप्लिकेट करना बेहतर हो सकता है और आपको केवल कर्नेल-संगत भागों को शामिल करना बेहतर हो सकता है।

उपयोगकर्ता के उपयोग के लिए डिज़ाइन किए गए पुस्तकालयों के साथ कर्नेल को लिंक करना संभव नहीं है - भले ही वे कोई ओएस कॉल न करें - क्योंकि कर्नेल में लिंकिंग वातावरण उन्हें नहीं उठा सकता है।

इसके बजाय, कर्नेल में उपयोग किए जाने वाले किसी भी फ़ंक्शन को पुन: संकलित करें (मान लीजिए कि वे कोई ओएस या लाइब्रेरी कॉल नहीं करते हैं - उदाहरण के लिए मॉलोक - जिस स्थिति में उन्हें किसी भी तरह संशोधित करने की आवश्यकता होगी)। अपने कर्नेल मॉड्यूल में उपयोग करने के लिए उन्हें अपनी लाइब्रेरी में शामिल करें। लिनक्स के


हाल संस्करणों विभिन्न SHA हैश सहित, वैसे भी क्रिप्टोग्राफिक कार्य शामिल - शायद आप उन में से एक के बजाय का उपयोग कर सकते हैं।


एक और विचार कर्नेल-स्पेस में क्रिप्टो करने की कोशिश करना बंद कर देगा और कोड को उपयोगकर्ता स्थान पर ले जायेगा। यूजरस्पेस कोड लिखना/डीबग/रखरखाव इत्यादि आसान है

6

मैंने उपयोगकर्ता स्पेस कोड के बिट्स ले लिए हैं जिन्हें मैंने लिखा है और इसे कर्नेल स्पेस (यानी kmalloc(), आदि का उपयोग करके परिवर्तित करने के लिए परिवर्तित किया है, यह मुश्किल नहीं है । हालांकि, आप सी के कर्नेल की समझ तक सीमित हैं, न कि उपयोगकर्ता स्थान, जो थोड़ा अलग है .. विशेष रूप से विभिन्न मानक int प्रकारों के साथ।

उपयोगकर्ता स्थान डीएसओ के खिलाफ बस लिंक करना संभव नहीं है - लिनक्स कर्नेल एकान्त है, पूरी तरह आत्मनिर्भर है। यह उपयोगकर्ता स्पेस libc, पुस्तकालयों या अन्य बिट्स का उपयोग नहीं करता है जैसा कि अन्य ने नोट किया है।

9/10 बार, आपको कर्नेल में कहीं की आवश्यकता होगी।यह बहुत संभावना है कि किसी और ने आपके लिए वही आवश्यकता में भाग लिया है जो कुछ मॉड्यूल में कुछ स्थिर कार्य करता है जो आप चाहते हैं .. बस उन्हें पकड़ो और उनका पुन: उपयोग करें।

क्रिप्टो के मामले में, जैसा कि अन्य ने कहा है, बस कर्नेल में क्या है इसका उपयोग करें। ध्यान देने योग्य एक बात, आपको उन्हें kconfig में सक्षम होने की आवश्यकता होगी जो उपयोगकर्ता इसे बनाने के दौरान चुनने के आधार पर हो सकता है या नहीं भी हो सकता है। तो, निर्भरताओं के लिए देखें और स्पष्ट रहें, आपको kconfig में कुछ प्रविष्टियों को हैक करना पड़ सकता है जो आपके मॉड्यूल का चयन होने पर इच्छित क्रिप्टो एपीआई का चयन भी कर सकते हैं। पेड़ से बाहर निकलने पर यह दर्द का थोड़ा सा हो सकता है।

तो एक ओर हमारे पास "बस कॉपी और सामान का नाम बदलने, जबकि समग्र ब्लोट जोड़ने", अन्य आप पर पर "लोगों को बताते हैं कि वे पूर्ण गिरी स्रोत होना चाहिए"। यह एक मोनोलिथिक कर्नेल के साथ आने वाले quirks में से एक है।

एक Microkernel साथ

, लगभग सब कुछ यूज़रस्पेस में चलता है, कोई कुछ ड्राइवर के लिए एक DSO से लिंक हो रहा चिंता नहीं ... यह एक गैर मुद्दा है। टिप्पणियों में कर्नेल डिज़ाइन दर्शन को फिर से शुरू करने के लिए कृपया उस कथन को एक क्यू के रूप में न लें, जो इस प्रश्न के दायरे में नहीं है।

संबंधित मुद्दे