2012-11-30 15 views
6

बदलना मैं एक अलग syscall तालिका के साथ अपना खुद का कस्टम कर्नेल बनाना चाहता था। (एक ही सिस्कोल लेकिन अलग-अलग स्थिति/संख्याओं में)लिनक्स कर्नेल सिस्टम कॉल नंबर

मैं कर्नेल 3.2.2 9 पर काम कर रहा था।

1) चाप में syscall स्थिति बदलने/86/कर्नेल/syscall_table_32.S

2) चाप में syscall मैक्रो नंबर बदलने/86:

गिरी बदलने काफी आसान था /include/asm/unistd_32.h

3) संकलन और नया कर्नेल

मैं syscalls के आसपास बंद कर स्थापित करने: sys_opensys_read के स्थान और नंबर ले लिया है, और इसके विपरीत।

मुझे लगा कि अगर मैं संशोधित कर्नेल हेडर के साथ glibc संकलित करता हूं, तो मेरे पास एक चलने वाली प्रणाली हो सकती है, लेकिन दुर्भाग्य से, यह पर्याप्त नहीं था और मेरा सिस्टम बूट नहीं होगा।

क्या मुझे कुछ याद आ रही है? चलने वाली प्रणाली के लिए मुझे और क्या करने की ज़रूरत है?


चरणों मैं ले लिया है कर रहे हैं:

1) निर्माण और मेरे सवाल

2 में वर्णित) कर्नेल स्थापित करने नया कर्नेल हेडर निकालने make headers_install INSTALL_HDR_PATH=[path]

3) निर्माण का उपयोग कर पैरामीटर --with-headers=[path/include]

4) के साथ glibc 4) मैंने फ़ाइल सिस्टम को बाहरी रूप से एक्सेस करने के लिए एक लाइव सीडी का उपयोग किया नई glibc स्थापित करते हैं, make install install_root=[the original file system] (ताकि प्रणाली स्थापित दौरान तोड़ नहीं होगा) का उपयोग कर

मुझे आशा है कि नई glibc ठीक से बनाया गया था, लेकिन मुझे यकीन नहीं कर रहा हूँ।

उसके बाद, जब सिस्टम बूट, बूट (initrafms) खोल स्क्रीन में बंद हो जाता है: मुझे लगता है मैं initrd के पुनर्निर्माण की जरूरत है, लेकिन मैं कैसे नई syscall तालिका के अनुसार यह संकलन करते हैं?

+0

कृपया विषय-संबंधी प्रश्नों को बंद न करें, खासकर जब उनके पास उत्थान और उत्तर हों। –

+0

ऐसा क्यों करेगा? –

+0

@ जोनासविएलिकी किसी ने "मददगार" से पहले इसे प्रश्न से संपादित किया, यह समझाया गया कि यह एक नया सिस्कोल जोड़ने के लिए स्कूल के असाइनमेंट के बाद प्रयोग था। संदिग्ध उपयोगिता के दौरान, यहां पर किए गए परिवर्तन निश्चित रूप से ध्यान देते हैं कि चीजें कैसे काम करती हैं और कई निर्भरताएं हैं। ऐसी प्रणाली को हैक करना जो कोई भी निर्भर करता है, चीजों को सीखने का एक शानदार तरीका हो सकता है। स्पष्टीकरण के लिए –

उत्तर

0

सिस्टम कॉल नंबर स्कैम्बलिंग वास्तव में चोट पहुंचाने जा रहा है। आपको कम से कम अपने सिस्टम और आपके initrd (यदि आप एक का उपयोग करते हैं) पर सभी स्थिर रूप से जुड़े बाइनरी का पुनर्निर्माण करने की आवश्यकता होगी।

+0

और गतिशील रूप से निर्माण अनुप्रयोगों में स्टार्टअप कोड एक या दो सिस्कोल (जैसे बाहर निकलें (2)) –

+0

@tmyklebu क्या आपको लगता है कि 'glibc' नई प्रणाली पर काम करने के लिए संकलित किया जा सकता है, इसे संकलित करने के लिए नई प्रणाली का उपयोग करके whitout? और यदि हां, तो ऐसा करने के लिए किए जाने वाले सामान्य कदम क्या हैं? – assafmo

+0

@tmyklebu मैं एक न्यूनतम कामकाजी प्रणाली चाहता था, इसलिए मैं केवल आवश्यक स्थिर रूप से जुड़ी बाइनरी का पुनर्निर्माण करूंगा, लेकिन क्या आप मुझे नई प्रणाली के लिए initrd को पुनर्निर्माण करने के लिए कोई भी नेतृत्व दे सकते हैं? – 4x6hw

0

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

आप पहली बार एक स्थिर हैलो-वर्ल्ड प्रकार के प्रोग्राम के साथ इनिट को प्रतिस्थापित करने पर विचार कर सकते हैं ताकि यह सत्यापित किया जा सके कि आपका कर्नेल उपयोगकर्तास्थान का समर्थन कर सकता है; फिर आधुनिक लिनक्स उपयोगकर्तास्पेस मैच की सभी जटिलताओं को बनाने के विवरण देखें।

+0

मैंने प्रक्रिया को बेहतर तरीके से वर्णन करने के लिए प्रश्न संपादित किया और जब बूट विफल हो जाता है – 4x6hw

0

आपको पैनसिक डंप के मैसेज को पढ़ने और हमें कैनेल घबराहट दिखाने के लिए सीखना पड़ा। इस जानकारी के बिना, लोग शायद आपकी मदद कर सकते हैं या आपको उपयोगी सुझाव प्रदान कर सकते हैं।

1

आपको सब कुछ पुनर्निर्माण करना होगा। यहां तक ​​कि यदि आपकी सभी बाइनरी गतिशील रूप से जुड़ी हुई हैं, तो यह संभव है कि पुरानी सिस्कोल बाइनरी में रेखांकित हों क्योंकि सी के कई कार्य केवल return syscall(__NR_somecall,...) हैं।

आप मैन्युअल रूप से कर सकता है, लेकिन यह toolchains सीधे रखने के लिए जब तक आप buildroot, आदिवासी या इसी तरह की तरह एक क्रॉस compilable toolchain का उपयोग मुश्किल हो सकता है। जो भी सबसे अच्छा सूट आपको पसंद करते हैं (मुझे रॉब लैंडली के आदिवासी - http://landley.net/aboriginal/)

फिर अपने initrd को बनाने के लिए बस पुराने zz, bz, xz} cat oldinit.rd | ​​cpio -id का उपयोग करके पुराने का विस्तार करें; आरएम oldinit.rd। पुराने कर्नेल मॉड्यूल, libs और binaries को नए और cpio के साथ बदलें और इसे वापस संपीड़ित करें (cpio को -H newc विकल्प की आवश्यकता है) ... या अब आप अपने कर्नेल को पुनर्निर्माण कर सकते हैं और उस निर्देशिका में initramfs को इंगित कर सकते हैं, लेकिन अनुशंसा नहीं करेंगे कि अगर आपके initrd को अक्सर बदलना पड़ सकता है जैसे कि उदाहरण के लिए यदि आप एक पूरी नई सिस्कल संरचना का परीक्षण कर रहे थे और बहुत कुछ डीबग करना चाहते थे।

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