2010-11-12 11 views
8

मैं लिनक्स कर्नेल में एक प्रोजेक्ट कर रहा हूं और मैं जानना चाहता था कि यह checkstack.pl क्या करता है? मैंने कभी भी पर्ले का अध्ययन नहीं किया है, इसलिए कार्यक्रम को समझ नहीं सकते। यह बहुत अच्छा होगा अगर मैं लाइन द्वारा लाइन न होने पर अवधारणात्मक रूप से प्रोग्राम को समझ सकता हूं। किसी भी प्रयास की सराहना की।पर्ल: linux स्रोत में checkstack.pl क्या करता है?

स्रोत: link text

मैं थोड़ा फेरबदल मेरा अपना कोड लिखना चाहते हैं लगता है, मैं एक सी प्रोग्राम में लिख सकते हैं। मेरा मुख्य प्रश्न है: यह कोड क्यों लिखा गया है या पर्ल में लिखा जाना चाहिए?

+1

शीर्ष पर टिप्पणी बहुत आत्म-व्याख्यात्मक प्रतीत होती है: "कार्यों के ढेर उपयोग की जांच करें"। – Ether

+2

मुझे संदेह है कि पर्ल में लिखा गया एकमात्र कारण आवश्यक कई रेगेक्स के कारण है। कोड निश्चित रूप से बहुत खराब नहीं है। (उदा। यह regex में आर्किटेक्चर नाम को मैप करने के लिए/elsif वृक्ष का उपयोग करता है, जहां एक हैश बहुत आसान होगा।) – friedo

उत्तर

11

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

कर्नेल के डिस्सेप्लर से गुजरकर और 2 चीजों की तलाश करके यह तरीका है: कार्य नाम और निर्देश जो ढेर को समायोजित करते हैं। यह $funcre (qr/^$x* <(.*)>:$/) से मेल खाने वाली लाइनों की तलाश करके फ़ंक्शन नामों की तलाश करता है, और यह $re या $dre से मेल खाने वाले स्टैक समायोजन निर्देशों की तलाश करता है; उत्तरार्द्ध दो पर निर्भर करता है कि कर्नेल को किस आर्किटेक्चर के लिए संकलित किया गया था, जो कि पहला बड़ा ब्लॉक है यदि/और कथन की जांच हो रही है। $re फ़ंक्शंस की खोज करता है जो एक निश्चित राशि (कार्यों का विशाल बहुमत) द्वारा स्टैक को समायोजित करता है, और $dre फ़ंक्शंस की खोज करता है जो एक परिवर्तनीय राशि (दुर्लभ) द्वारा स्टैक को समायोजित करता है।

objdumpbinutils का हिस्सा है; objdump -d ऑब्जेक्ट फ़ाइल को अलग करने का आदेश है। इस स्क्रिप्ट का उपयोग कर्नेल (objdump -d vmlinux) को अलग करना है और आउटपुट को स्क्रिप्ट में पाइप करना है। स्क्रिप्ट का आउटपुट कर्नेल में सभी कार्यों की एक सूची है, जो सबसे बड़े स्टैक फ्रेम आकार से क्रमबद्ध है। मुझे लगता है कि स्क्रिप्ट का उद्देश्य कर्नेल रखरखाव के लिए दर्दनाक रूप से स्टैक ओवरफ्लो से बचने में सक्षम होने के लिए है, यह सुनिश्चित करने के लिए कि सबकुछ का ढेर फ्रेम जितना संभव हो उतना छोटा हो, और यह स्क्रिप्ट उन्हें सत्यापित करने की अनुमति देती है।

2

जैसा कि पहले से ही समझाया गया है कि कर्नल कोड के स्टैक उपयोग को जानने के लिए पर्ल स्क्रिप्ट का उपयोग किया जाता है, मुझे लगता है कि पर्ल का उपयोग इस तथ्य के कारण किया जाता है कि objdump -d के आउटपुट को पार्स करना इतना आसान नहीं होगा यदि सी कोड के माध्यम से किया जाता है ।

आप पहले तर्क और पिछले स्थानीय चर के पते का पता लेने के द्वारा कार्यावधि में ढेर उपयोग पा सकते हैं, तो उन्हें घटाना, की तरह कुछ:

int stack_usage_func(char i) 
{ 
    int j,k,l; 

    char buf[256]; 
    char m; 
    unsigned long stack_use = &i - &m; 
    //do all processing 
    return stack_use 
} 

समारोह की वापसी देना चाहिए आप रनटाइम स्टैक उपयोग, मैंने कोड संकलित नहीं किया है, इसलिए अगर यह संकलन त्रुटियों को देता है तो कृपया अनदेखा करें, लेकिन तर्क काम करना चाहिए।

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