लोड करने योग्य कर्नेल मॉड्यूल के साथ लिनक्स 3.2.x में एक नया सिस्टम कॉल जोड़ना [बंद]


11

मैं लिनक्स कर्नेल 3.2.x में एक विशेष नई प्रणाली कॉल जोड़ना चाहता हूं, लेकिन एक लोडेबल कर्नेल मॉड्यूल के रूप में (जैसा कि मैं कर्नेल को बार-बार पुन: स्थापित नहीं करना चाहता)

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

जो यह है? यदि यह संभव है तो यह कैसे किया जाता है?


यह प्रश्न यहां ऑफ-टॉपिक है: यूनिक्स और लिनक्स प्रोग्रामिंग के बारे में नहीं, बल्कि उपयोग और प्रशासन के बारे में है। आपको स्टैक ओवरफ्लो पर पूछना चाहिए । इतना अस्पष्ट मत बनो: स्टैक ओवरफ्लो पर आपको मिले पदों के लिए लिंक , और समझाएं कि आपको अनिर्णायक या विरोधाभासी क्या मिला।
गिल्स एसओ- बुराई को रोकना '

2
मेरा मानना ​​है कि यह प्रश्न लिनक्स से ओएस के रूप में खुद को प्रोग्रामिंग करने की तुलना में बहुत अधिक संबंधित है। यह जानना भी काफी महत्वपूर्ण है कि हमारी प्रणाली क्षमताओं के विस्तार की क्या संभावनाएं हैं और इसकी सीमाएं क्या हैं। यह, उदाहरण के लिए, आपको समझ में आता है कि क्यों कुछ सुविधाओं को लोड करने योग्य मॉड्यूल के रूप में लागू करना संभव नहीं है और कर्नेल पैचिंग की आवश्यकता है। यह ऐसा क्यों है, यह जानने के बाद आपको सुरक्षा के कुछ विचार भी देने पड़ सकते हैं। क्या यह प्रश्न विषय पर अधिक होगा यदि ओपी केवल यह पूछेगा कि क्या यह संभव है और क्यों नहीं और इसे कैसे लागू किया जाए?
Krzysztof Adamski

1
लिनक्स कर्नेल मेलिंग लिस्ट पर कई <स्ट्रोक> लपटें </ स्ट्रोक> चर्चाएं थीं, उदाहरण के लिए reiserfs ने अपने स्वयं के syscalls का उपयोग किया था, जो कुछ मुख्य डेवलपर्स द्वारा वास्तव में प्रिय नहीं था, जिसमें लिनुस शामिल था। आपके मामले में मैं केवल ioctl()कार्य के लिए s का उपयोग करूंगा , वे आसानी से मॉड्यूलर हैं। Afaik इसे कठिन बनाने के पीछे मुख्य कारण है कि यह संभव है कि syscalls की संख्या एक अत्यधिक हार्डकोड चीज़ है और कोई भी अराजकता नहीं चाहता है कि यह तस्वीर में क्या आएगा। लेकिन समान कार्यक्षमता तक पहुंचने के लिए कई कर्नेल इंटरफेस हैं, उदाहरण के लिए sysfs, ioctls या इस तरह के।
पीटर -

जवाबों:


14

यह संभव नहीं है क्योंकि सिस्टम कॉल टेबल (कहा जाता है sys_call_table) एक स्थिर आकार सरणी है। और इसका आकार पंजीकृत syscalls की संख्या से संकलन समय पर निर्धारित किया जाता है। इसका मतलब है कि दूसरे के लिए कोई जगह नहीं है।

आप arch/x86/kernel/syscall_64.cफ़ाइल में x86 आर्किटेक्चर के लिए उदाहरण के लिए कार्यान्वयन की जांच कर सकते हैं , जहां sys_call_tableपरिभाषित किया गया है। इसका आकार बिल्कुल है __NR_syscall_max+1__NR_syscall_maxके रूप में परिभाषित किया arch/x86/kernel/asm-offsets_64.cगया है sizeof(syscalls) - 1(यह अंतिम syscall की संख्या है), जहां syscallसभी syscalls के साथ एक तालिका है।

एक संभव समाधान कुछ मौजूदा (या एक को अपदस्थ करना है अगर आपके आर्किटेक्चर में एक है, sys_setaltrootउदाहरण के लिए देखें ) आपके साथ syscall नंबर, क्योंकि इसके लिए मेमोरी में अधिक स्थान की आवश्यकता नहीं होगी। कुछ आर्किटेक्चर में syscall टेबल में छेद भी हो सकते हैं (जैसे x86 का 64 बिट संस्करण) तो आप इसका भी उपयोग कर सकते हैं।

आप इस तकनीक का उपयोग कर सकते हैं यदि आप नए syscall विकसित कर रहे हैं और सिर्फ प्रयोग करते समय रिबूटिंग से बचना चाहते हैं। आपको अपने नए सिस्टम कॉल को परिभाषित करना होगा, syscall तालिका में मौजूदा प्रविष्टि का पता लगाना होगा और फिर इसे अपने मॉड्यूल से बदलना होगा।

कर्नेल मॉड्यूल से ऐसा करना तुच्छ नहीं है क्योंकि कर्नेल sys_call_tableसंस्करण 2.6 के रूप में मॉड्यूल को निर्यात नहीं करता है (अंतिम कर्नेल संस्करण जो इस प्रतीक का निर्यात किया गया था 2.5.41)।

इसके चारों ओर काम करने का एक तरीका यह है कि sys_call_tableप्रतीक को निर्यात करने के लिए अपने कर्नेल को मॉड्यूल में बदल दें । ऐसा करने के लिए, आपको निम्नलिखित दो पंक्तियों को जोड़ना होगा kernel/kallsyms.c( उत्पादन मशीनों पर ऐसा न करें ):

extern void *sys_call_table;
EXPORT_SYMBOL(sys_call_table);

एक और तकनीक है गतिशील रूप से syscall टेबल की खोज करना। आप कर्नेल मेमोरी पर पुनरावृति करते हैं, प्रत्येक शब्द की तुलना पॉइंटर से ज्ञात सिस्टम कॉल फ़ंक्शन से करते हैं। चूंकि आपको पता है कि टेबल में इस पता syscall की भरपाई है, आप टेबल शुरुआत पते की गणना कर सकते हैं।


1

दुर्भाग्य से आप लोड करने योग्य मॉड्यूल के रूप में कर्नेल में सिस्टम कॉल नहीं जोड़ सकते। हर बार जब आप एक नया सिस्टम कॉल जोड़ते हैं तो आपको कर्नेल को संकलित करने का दर्द उठाना पड़ता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.