2011-06-07 14 views
34

मैं लिनक्स कर्नेल के भीतर ढेर का एक अच्छा विवरण ढूंढ रहा हूं, लेकिन मुझे कुछ उपयोगी खोजने में आश्चर्यजनक रूप से मुश्किल लग रही है।लिनक्स स्टैक साइज

मुझे पता है कि ज्यादातर प्रणालियों के लिए ढेर 4k तक सीमित हैं, और अन्य लोगों के लिए 8k तक सीमित हैं। मुझे लगता है कि प्रत्येक कर्नेल थ्रेड/नीचे आधे का अपना ढेर होता है। मैंने यह भी सुना है कि यदि कोई बाधा बंद हो जाती है, तो यह वर्तमान थ्रेड के ढेर का उपयोग करती है, लेकिन मुझे इनमें से कोई भी दस्तावेज नहीं मिल रहा है। मैं जो खोज रहा हूं वह यह है कि स्टैक्स आवंटित किए जाते हैं, यदि उनके लिए कोई अच्छी डीबगिंग दिनचर्या है (मुझे किसी विशेष समस्या के लिए एक स्टैक ओवरफ़्लो पर संदेह है, और मैं जानना चाहता हूं कि कर्नेल को पुलिस में संकलित करना संभव है या नहीं ढेर आकार, आदि)।

+0

आप किस कर्नेल संस्करण के साथ काम कर रहे हैं? तो हमारे पास आपके लिए उपलब्ध कर्नेल डीबग कॉन्फ़िगरेशन विकल्प का बेहतर विचार है। –

+0

मुझे यह प्रतीत नहीं होता है। कार्य के लिए पर्याप्त डीबगर क्यों नहीं है? – cnicutar

+0

"तल-हिस्सों" शायद एक ही ढेर साझा करते हैं। इसके अलावा, "तल-हिस्सों" बहुत समय पहले गायब हो गए थे, अब सॉफ्टरक छोड़ दिए गए हैं। – ninjalj

उत्तर

1

प्रक्रियाओं के लिए, आप ulimit आदेश (-s विकल्प) के माध्यम से प्रक्रियाओं के ढेर आकार को नियंत्रित कर सकते हैं। धागे के लिए, डिफ़ॉल्ट स्टैक आकार बहुत भिन्न होता है, लेकिन आप pthread_attr_setstacksize() पर कॉल के माध्यम से इसे नियंत्रित कर सकते हैं (माना जाता है कि आप pthreads का उपयोग कर रहे हैं)।

उपयोगकर्तालैंड स्टैक का उपयोग करके बाधा के रूप में, मुझे कुछ हद तक संदेह है, क्योंकि उपयोगकर्तालैंड मेमोरी एक्सेस करना कर्नेल से परेशानी का एक प्रकार है, खासकर एक बाधा दिनचर्या से। लेकिन मुझे यकीन नहीं है।

32

कारण यह है कि दस्तावेज दुर्लभ है कि यह एक ऐसा क्षेत्र है जो काफी वास्तुकला-निर्भर है। कोड वास्तव में सबसे अच्छा दस्तावेज है - उदाहरण के लिए, THREAD_SIZE मैक्रो प्रति-थ्रेड कर्नेल स्टैक आकार (आर्किटेक्चर-निर्भर) को परिभाषित करता है।

स्टैक्स को alloc_thread_info_node() में आवंटित किया गया है, या उस फ़ंक्शन के लिए आर्किटेक्चर-विशिष्ट ओवरराइड (struct thread_info हमेशा स्टैक के नीचे रहता है)। struct task_struct में स्टैक पॉइंटर dup_task_struct() में अपडेट किया गया है, जिसे थ्रेड क्लोनिंग के हिस्से के रूप में जाना जाता है।

कर्नेल स्टैक के अंत में कैनरी मान STACK_END_MAGIC रखकर कर्नेल स्टैक ओवरफ़्लो की जांच करता है (तुरंत struct thread_info मेमोरी में)। पेज गलती हैंडलर में, यदि कर्नेल स्पेस में कोई गलती होती है तो यह कैनरी चेक की जाती है - उदाहरण के लिए the x86 fault handler देखें जो ओप संदेश के बाद संदेश Thread overran stack, or stack corrupted को प्रिंट करता है यदि स्टैक कैनरी को गिरफ्तार किया गया है।

बेशक यह पर सभी स्टैक ओवररन्स पर ट्रिगर नहीं होगा, केवल स्टैक कैनरी को पकड़ने वाले ही। हालांकि, अगर आपको स्टैक ओवररन का सामना करना पड़ता है तो आपको हमेशा ओप्स आउटपुट से बताने में सक्षम होना चाहिए - यही कारण है कि स्टैक पॉइंटर &threadinfo से नीचे है।

5

आप ulimit कमांड के साथ प्रक्रिया स्टैक आकार निर्धारित कर सकते हैं। मुझे अपने सिस्टम पर 8192 कीबी मिलती है:

$ ulimit -s 
8192 
+5

निम्न गुणवत्ता का उत्तर, क्योंकि प्रश्न कर्नेल के बारे में था। उद्धरण _ "लिनक्स कर्नेल के भीतर ढेर" _। – catpnosis

+2

@ माइल्स रूट मेरे खराब, मुझे लगता है कि यह कर्नेल स्टैक आकार से संबंधित है। –

+0

दरअसल लगता है कि इस का जवाब है, लेकिन ईमानदारी से मुझे cmd लाइन में प्रक्रिया ढेर आकार की तलाश में (के रूप में सवाल यह जवाब देता है) –

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