2013-02-08 11 views
8

पर उपयोगकर्ता स्थान कोड पोर्ट करना मेरे पास मुख्य रूप से सी में लिखा गया एक बड़ी प्रणाली है जो उपयोगकर्ता स्थान में चल रही थी। अब मुझे कोड को कर्नेल मॉड्यूल के रूप में संकलित करने की आवश्यकता है। इसके लिए, मुझे कम से कम कोड को फिर से लिखना चाहिए और malloc, calloc, free, printf उनके कर्नेल समकक्षों के साथ कार्यों को प्रतिस्थापित करना चाहिए, क्योंकि वे पूरी तरह से उपयोगकर्ता-स्थान फ़ंक्शन हैं। समस्या यह है कि, मेरे पास सिस्टम में उपयोग की जाने वाली कुछ कस्टम-निर्मित पुस्तकालयों का स्रोत कोड नहीं है, और उन पुस्तकालयों में उनके कार्यों के अंदर malloc आदि को कॉल किया गया है। इसलिए, मूल रूप से, मुझे पूरी लाइब्रेरी को फिर से लागू करने की आवश्यकता हो सकती है।कर्नेल स्पेस

अब सवाल: यह एक सच में गंदा हैक हो जाएगा, अगर मैं कुछ इस तरह kmalloc के चारों ओर एक आवरण के रूप में malloc के अपने खुद के कार्यान्वयन लिखना चाहते हैं,:

void *malloc(size_t size) { 
    return kmalloc(size, GFP_USER); 
} 

फिर प्रणाली को यह कार्यान्वयन लिंक कोड, जो सभी मॉड्यूल त्रुटियों में अज्ञात प्रतीक को खत्म कर देगा।

असल में मैंने सोचा कि यह एक आम समस्या होगी और कोई पहले से ही इस तरह के एक किमीलोक रैपर लिखा होगा, लेकिन अब मैं कुछ दिनों के लिए googling रहा है और कुछ भी उपयोगी नहीं मिला।

संपादित करें: ऐसा करने का कारण यह है कि जिस प्रणाली के बारे में मैं बात कर रहा हूं वह एक वास्तविक समय एप्लिकेशन VxWorks रीयलटाइम ओएस पर चल रहा था और अब हम इसे लिनक्स आरटीएआई पर इस्तेमाल करने के लिए पोर्ट करना चाहते हैं, जहां ऐप्स ज्यादातर कर्नेल में चलते हैं अंतरिक्ष। लेकिन मुझे लगता है कि उपयोगकर्ता स्थान में रीयल-टाइम होने की भी संभावना है, इसलिए, शायद मुझे माइक ने सुझाव दिया होगा कि कोड को कर्नेल और उपयोगकर्ता-स्पेस पार्ट्स में अलग करें और साझा स्मृति के साथ संवाद करें।

+0

मैंने जीसीसी के लिए [यह हैक] (http://stackoverflow.com/a/14728092/912144) देखा जो आपके लिए उपयोगी हो सकता है। – Shahbaz

+9

आम तौर पर लोग अन्य तरीकों की बजाय कर्नेल से चीज़ों को स्थानांतरित करने का प्रयास करते हैं। मेरा व्यक्तिगत अनुभव यह है कि यदि आपको लगता है कि आपको अपने प्रोग्राम का कर्नेल मॉड्यूल बनाने की आवश्यकता है, तो आप शायद इसे गलत कर रहे हैं। –

+0

@ जोआचिमपिलबोर्ग शायद उन्हें यह सोचने के लिए मिला कि यह कर्नेल स्पेस – Ulterior

उत्तर

8

मैंने इसे पहले कभी नहीं देखा है। मुझे पिछली नौकरी में कुछ ऐसा करना पड़ा था (हमारे फोन में, बिजली बचत कारणों के लिए, हमें कर्नेल से उपयोगकर्ता स्थान से कोड का एक हिस्सा पोर्ट करना था) लेकिन मैंने ऐसा किया। मैंने एक भाग लिया कोड के और इसे ले जाया गया, और उस पर एक छोटा सा हिस्सा।

  1. यह कम है कि जिस तरह से भ्रामक था (दूसरों के कोड को देख नहीं था:

    जब मैंने किया मैं उपयोगकर्ता स्थान कारणों से दो प्राथमिक लोगों की एक संख्या की वजह से कॉल कर्नेल कॉल बदल आश्चर्य की बात है कि मैं कर्नेल से "मॉलोक" क्यों बुला रहा था)

  2. malloc और kmalloc बिल्कुल वही काम नहीं करते हैं। मेरा मतलब है कि

    2a। kmalloc आपके उदाहरण में हार्डकोड किए गए flags पैरामीटर लेता है। क्या होगा यदि आप बाद में फैसला करें कि आप इसे कुछ स्थानों में बदलना चाहते हैं, न कि दूसरों को? (मान लीजिए कि आपके पास कई अलग-अलग स्थान हैं जहां आपको गतिशील स्मृति मिलती है)।

    2 बी। kmalloc आपको स्मृति को malloc जैसा नहीं देता है। malloc() आपको size_t size के रूप में पास की जाने वाली बाइट्स की संख्या देगा। दूसरी तरफ kmalloc(), कर्नेल में है और इस प्रकार सिस्टम की भौतिक स्मृति से निपट रहा है, जो केवल पृष्ठ के आकार के हिस्सों में उपलब्ध है; इस प्रकार जब आप kmalloc() पर कॉल करते हैं तो आपको केवल कुछ निश्चित पूर्वनिर्धारित, निश्चित-आकार बाइट सरणी मिलेंगे। यदि आप इसके बारे में नहीं जानते हैं, तो आप से पर एक विशेष खंड के लिए पूछ सकते हैं और इस प्रकार आपको आवश्यकतानुसार अधिक स्मृति मिलती है ... आपके कोड का एक सीधा बंदरगाह आपको इससे बचाएगा नहीं।

    2 सी। हेडर फ़ाइलों को भी बदलना है। स्पष्ट रूप से आप कर्नेल में <stdlib.h> शामिल नहीं कर सकते हैं, इसलिए सिर्फ इसलिए कि आपने मॉलोक कॉल को "लपेटा" है, फिर भी आपको हेडर फ़ाइलों को बदलने के लिए जाना होगा।

ऊपर 2 बी में मेरी बात का

त्वरित उदाहरण:

void * stuff; 
stuff = kmalloc(1,GFP_KERNEL); 
printk("I got: %zu bytes of memory\n", ksize(stuff)); 
kfree(stuff); 

आबंटित स्मृति की वास्तविक राशि दिखाने के लिए:

[90144.702588] I got: 32 bytes of memory 

वैसे भी ... तकनीकी रूप से, आप कैसे इसका वर्णन करें, ठीक काम करना चाहिए। दोनों size_t लेते हैं और void * लौटाते हैं, इसलिए इसे काम करना चाहिए; लेकिन ध्यान रखें कि कर्नेल में जितना अधिक कोड आप स्थानांतरित करते हैं, कम निर्धारिती चीजें बन जाती हैं, और malloc() < =>kmalloc() ऐसा लगता है जैसा 1: 1 जैसा नहीं है।

0

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

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