2012-09-19 28 views
7

मुझे सामान्य लिस्प में x86-64 के लिए किसी प्रकार का ring0 कर्नेल-मोड डीबगर विकसित करने में दिलचस्पी है जो कि लिनक्स कर्नेल मॉड्यूल के रूप में लोड किया जाएगा और जैसा कि मैं सामान्य प्रोग्रामिंग में सामान्य लिस्प को सी पसंद करता हूं, मुझे आश्चर्य है कि सामान्य लिस्प कार्यान्वयन इस प्रकार के प्रोग्रामिंग कार्य में फिट होगा।क्या सामान्य लिस्प में इंटेल x86-64 के लिए लिनक्स कर्नेल-मोड डीबगर लिखना व्यवहार्य है, और जिसके साथ आम लिस्प कार्यान्वयन है?

डीबगर कुछ बाहरी डिस्सेबलिंग लाइब्रेरी का उपयोग करेगा, जैसे udis86 कुछ FFI के माध्यम से। ऐसा लगता है कि सी में कर्नेल मॉड्यूल लिखना सबसे आसान है क्योंकि उन्हें सी फ़ंक्शन int init_module(void) और void cleanup_module(void) (The Linux Kernel Module Programming Guide) शामिल करने की आवश्यकता है, इसलिए कर्नेल-लैंड मॉड्यूल कोड CFFI का उपयोग करके सामान्य लिस्प कोड को सी से कॉल करेगा। विचार Rasta Ring 0 Debugger के विचार से प्रेरित 64-बिट लिनक्स के लिए एक रिंग 0 डीबगर बनाना होगा, जो केवल 32-बिट लिनक्स के लिए उपलब्ध है और पीएस/2 कीबोर्ड की आवश्यकता है। मुझे लगता है कि सबसे चुनौतीपूर्ण हिस्सा हार्डवेयर और सॉफ़्टवेयर ब्रेकपॉइंट्स और निम्न-स्तरीय वीडियो, कीबोर्ड या यूएसबी इनपुट डिवाइस हैंडलिंग के साथ वास्तविक डीबगर कोड होगा। इनलाइन असेंबली में बहुत मदद मिलेगी, ऐसा लगता है कि एसबीसीएल इनलाइन असेंबली में वीओपी (SBCL Internals: VOP) (SBCL Internals: Adding VOPs) का उपयोग करके कार्यान्वित किया जा सकता है, और यह IRC log उल्लेख करता है कि एसीएल (एलेग्रो कॉमन लिस्प), CCL (Clozure Common Lisp) और कॉर्मनसीएल में एलएपी (लिस्प विधानसभा कार्यक्रम)। एसीएल और कॉर्मनसीएल दोनों स्वामित्व हैं और इस प्रकार त्याग दिए जाते हैं, लेकिन सीसीएल (क्लोजर कॉमन लिस्प) एक विकल्प हो सकता है। स्टैंडअलोन निष्पादन योग्य बनाने की क्षमता भी एक आवश्यकता है; एसबीसीएल जो मैं वर्तमान में उपयोग कर रहा हूं, यह है, लेकिन चूंकि वे पूरी लिस्प छवियां हैं, उनका आकार काफी बड़ा है।

मेरा प्रश्न है: यह व्यवहार्य कॉमन लिस्प में इंटेल x86-64 के लिए एक ring0 कर्नेल-मोड डिबगर, सी और/या विधानसभा में लागू निम्न स्तर के कोड के साथ बनाने के लिए है, और यह है अगर है, जो आम इस प्रकार के प्रयास के लिए 64-बिट लिनक्स के सर्वोत्तम सूट के लिए लिस्प कार्यान्वयन, और यदि एक से अधिक उपयुक्त आम लिस्प कार्यान्वयन हैं तो पेशेवर और विपक्ष क्या हैं? योजना एक संभावित विकल्प भी हो सकती है, अगर यह आम लिस्प पर कुछ लाभ प्रदान करती है। मुझे अच्छी तरह से पता है कि कर्नेल मॉड्यूल का अधिकांश बहुमत सी में लिखा गया है, और मुझे सी और x86 असेंबली पता है कि सी और/या असेंबली में आवश्यक निम्न-स्तर कोड लिखने में सक्षम होना पर्याप्त है। यह लिनक्स में लिनक्स कर्नेल को पोर्ट करने का प्रयास नहीं है (देखें: https://stackoverflow.com/questions/1848029/why-not-port-linux-kernel-to-common-lisp), लेकिन लिनक्स कर्नेल मॉड्यूल को सामान्य लिस्प में लिखने की योजना है जिसे रिंग 0 डीबगर के रूप में उपयोग किया जाएगा।

+3

यह समय लगता होगा "आप शायद एक उपयोगकर्ता प्रक्रिया में तुतलाना हिस्सा चला सकते हैं और सिर्फ डीबगर से तो उससे संपर्क -

इसके अलावा, मैं पूरी तरह से खत्म हो गया असली कठिनाई एक डिबगर लिखित रूप में glossing कर रहा हूँ।। प्राप्त करने के लिए बहुत आसान होना चाहिए। –

+0

@AlexeyFrunze यह एक अच्छा विचार हो सकता है, शायद चीजों को बहुत आसान बनाता है। – nrz

+0

एक डाउनवोट, एक अपवॉट। मुझे पता होना चाहिए कि डाउनवोट क्यों? – nrz

उत्तर

2

नहीं, स्पष्ट कारण के लिए सीएल में कर्नेल मॉड्यूल को लागू करने के लिए संभव नहीं होगा कि केवल उस काम को करने के लिए आपको बहुत सारे हैक करने की आवश्यकता होगी और लिस्प भाषा प्रदान करने वाले सभी लाभों को खोने का अंत हो सकता है और आपका लिस्प कोड एस-एक्सप्रेशन में सी कोड की तरह दिखेगा।

कर्नेल से आपको जो भी कार्यक्षमता/डेटा चाहिए, उसे निर्यात करने के लिए अपने कर्नेल मॉड्यूल को लिखें और फिर ioctl या पढ़ने/लिखने के संचालन का उपयोग करके कोई भी उपयोगकर्ता मोड प्रोग्राम मॉड्यूल के साथ संवाद कर सकता है।

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

+2

+1 सी में कर्नेल मॉड्यूल कोड को लागू करना और सामान्य लिस्प में उपयोगकर्तालैंड कोड एक अच्छा विकल्प होगा। हालांकि, मुझे पता चला कि [ईसीएल (एंबेडेड कॉमन-लिस्प)] (http://ecls.sourceforge.net/) इनलाइन सी का समर्थन करता है और स्टैंडअलोन एक्जिक्यूटिव के लिए संकलित करता है, और यह किसी भी सीएल कार्यान्वयन के लिए यहां दो सबसे महत्वपूर्ण आवश्यकताएं हैं, तो मैं पहले इनलाइन सी के साथ ईसीएल कोशिश करता हूं। – nrz

+0

हैकिंग कर्नेल मॉड्यूल कोड के कुछ दिनों के बाद, ऐसा लगता है कि आम लिस्प (ईसीएल) एम्बेड करना एक कठिन काम होगा। कर्नेल कोड में केवल सी का एक सबसेट संभव है, इसलिए यदि ईसीएल सी कोड उत्पन्न करता है (जो कि एक बहुत अच्छी बात है), तो सी कोड शायद वैध कर्नेल सी कोड नहीं है। ईसीएल द्वारा उत्पादित संपादन सी ​​कोड उदा। regex के साथ एक और प्रोग्रामिंग परत बना देगा, इससे पहले कि कोड 'gcc' के साथ संकलित किया जा सके। तो 'lisp' ->' ecl' -> '.c' ->' gcc' -> '.o' -> 'ld' ->' .ko' पाइपलाइन का उदाहरण होगा। 'lisp' ->' ecl' -> '.c' ->' vim' या 'perl' ->' .c' -> 'gcc' ->' .o' -> 'ld' ->'। को पाइपलाइन। – nrz

+0

ऐसा लगता है कि ईसीएल में कुछ (प्रमुख?) परिवर्तनों के साथ ईसीएल में कर्नेल मॉड्यूल कोड लिखना संभव हो सकता है, ताकि यह वैकल्पिक रूप से कर्नेल मॉड्यूल के लिए मान्य सी कोड को आउटपुट कर सके। सी में कर्नेल मॉड्यूल और ईसीएल में उपयोगकर्तालैंड कोड लिखना बहुत आसान है, और '/ dev' और/या बंदरगाहों के माध्यम से उनके बीच संचार करें। यह पहले से ही संभव है, और यही मेरे लिए जाने का तरीका है। – nrz

3

आप ब्रैंक बेवरिज द्वारा एसबीसीएल के फाइल सिस्टम ड्राइवर के साथ काम करने पर 2 फरवरी 2008 लिस्पेन टॉक "डिंग एविल थिंग्स विद कॉमन लिस्प" पर एक नज़र डालना चाहेंगे।

Talk description & files

में उन्होंने उल्लेख है:

"एक C/C++ डीबगर सीएल में लिखा ??

पूरी तरह से आकाश में पाई अभी

लेकिन, कैसे शांत है कि हो सकता है?

कि एक खंड की ज्यादा नहीं, केवल

गंदा चाल का इस्तेमाल कर सकता सी कार्यों को बदलने के लिए स्मृति जहां पुस्तकालय लिस्प तरफ ब्रेक अंक & तो जाल संकेत सम्मिलित करने के लिए स्थित है में लिखने के लिए सक्षम होना चाहिए लिस्प कार्यों

कुछ विवरण से

अलावा करने के लिए कॉल के साथ, यह शायद कि मुश्किल नहीं है - निश्चित रूप से कुछ भी नहीं है 'नई'

गंदा चाल एक और छलांग (लिंक के बिना शाखा) एक लिस्प कॉलबैक में साथ सी कोड अधिलेखन शामिल होगा । जब लिस्प कोड वापस आता है तो यह लिंक रजिस्टर के माध्यम से सीधे मूल कॉलिंग फ़ंक्शन पर जा सकता है।

+1

+1 यह कार्य संभव है लेकिन काफी समय लगता है, भले ही डिकंपलिंग असंतोष से कहीं अधिक कठिन हो। मेरी योजना विम/पर्ल रेगेक्स मेमोरी खोजों के साथ सॉफ़्टआईस की शैली में एक नियमित असेंबली डीबगर बनाना होगा। ऐसा लगता है कि आम लिस्प में प्रमुख भाग में लिखा गया कर्नेल-मोड डीबगर संभव है, विशेष रूप से तथ्य यह है कि [ईसीएल (एंबेडेबल कॉमन-लिस्प)] (http://ecls.sourceforge.net/) इनलाइन सी का समर्थन करता है ' एफएफआई: सीलाइन सी-कोड *) 'और' (एफएफआई: सी-इनलाइन (लिस्पी-वैल्यू *)) 'विशेष रूप, इसलिए मुझे लगता है कि ईसीएल इस तरह के कार्य के लिए सबसे अच्छा आम लिस्प कार्यान्वयन में से एक होगा। – nrz