2011-11-05 22 views
10

मुझे यह जानकारी कहीं भी नहीं मिल रही है। जहां भी मैं देखता हूं, मुझे चीजें मिलती हैं कि जब आप "मुख्य" (जो भी आपका प्रवेश बिंदु है) मारा जाता है, जो कार्यक्रम तर्क और पर्यावरण होगा, लेकिन जो मैं ढूंढ रहा हूं वह यह है कि सिस्टम कैसे स्थापित होता है switch_to मैक्रो के साथ सहयोग करने के लिए ढेर। पहली बार कार्य को स्विच करने के लिए, इसे EFLAGS, EBP, जीसीसी द्वारा सहेजे गए रजिस्टरों और "tsk-> thread-> esp" द्वारा इंगित स्टैक पर शेड्यूल() फ़ंक्शन से वापसी पता होना आवश्यक होगा, लेकिन मैं यह नहीं समझ सकता कि कर्नेल इस ढेर को कैसे सेट करता है, क्योंकि यह सामान्य उद्देश्यों के रजिस्टरों को सहेजने देता है (इनलाइन असेंबली के आउटपुट पैरामीटर का उपयोग करके)।प्रक्रिया निर्माण पर लिनक्स प्रक्रिया कर्नेल स्टैक स्थिति क्या है?

मैं केवल x86 पीसी का जिक्र कर रहा हूं। मैं अपने छोटे कर्नेल के लिए लिनक्स शेड्यूलर/प्रोसेस सिस्टम का शोध कर रहा हूं, मैं लिखने की कोशिश कर रहा हूं (और कोशिश कर रहा हूं), और मैं जो खो रहा हूं उसके चारों ओर अपना सिर नहीं ले सकता। मुझे पता है कि इस तथ्य से मुझे कुछ याद आ रहा है कि मेरे कंप्यूटर पर स्लेकवेयर चल रहा है इस तथ्य का एक प्रमाण है कि शेड्यूलर काम करता है: पी

संपादित करें: ऐसा लगता है कि मैंने इसे बुरी तरह से लिखा है। मैं इस बात की जानकारी देख रहा हूं कि कार्य कर्नेल स्टैक सेटअप नहीं है कि कैसे कार्य उपयोगकर्ता कार्य सेटअप है। अधिक विशेष रूप से, स्टैक जो tsk-> thread-> esp इंगित करता है, और वह "switch_to" स्विच करता है।

+0

ऐसा लगता है कि आपके यहां दो अलग-अलग प्रश्न हैं - 1) प्रक्रिया init पर स्टैक स्थिति और 2) एक आईआरक्यू में कर्नेल 'अनुसूची() '। आपको शायद इन प्रश्नों में से एक को एक नए प्रश्न के रूप में पोस्ट करना चाहिए और उनमें से एक को यहां रखना चाहिए; इस तरह आप प्रत्येक प्रश्न पर ध्यान केंद्रित जवाब प्राप्त करेंगे। स्टैक ओवरफ़्लो पर, प्रत्येक प्रश्न के लिए एक अलग प्रश्न शुरू करना बिल्कुल ठीक है। –

+0

ठीक है, करेंगे! मैंने यहां लंबे समय तक उत्तर/प्रश्न पढ़े हैं, लेकिन कभी पोस्ट नहीं किया! टिप के लिए धन्यवाद :) ठीक है, मैं लगभग 5 मिनट में होगा। मुझे इंतजार करना है: पी – Caleb1994

उत्तर

6

एक नई प्रक्रिया के लिए प्रारंभिक कर्नेल स्टैक copy_thread() में सेट है, जो एक आर्क-विशिष्ट फ़ंक्शन है। x86 संस्करण, उदाहरण के लिए, इस तरह से शुरू होती है:

int copy_thread(unsigned long clone_flags, unsigned long sp, 
unsigned long unused, 
struct task_struct *p, struct pt_regs *regs) 
{ 
    struct pt_regs *childregs; 
    struct task_struct *tsk; 
    int err; 

    childregs = task_pt_regs(p); 
    *childregs = *regs; 
    childregs->ax = 0; 
    childregs->sp = sp; 

    p->thread.sp = (unsigned long) childregs; 
    p->thread.sp0 = (unsigned long) (childregs+1); 

    p->thread.ip = (unsigned long) ret_from_fork; 

p->thread.sp और p->thread.ip नया थ्रेड के कर्नेल ढेर सूचक और अनुदेश सूचक क्रमशः रहे हैं।

ध्यान दें कि यह वहाँ नहीं जगह किसी सहेजे गए %eflags, %ebp आदि करता है, क्योंकि जब निष्पादन की एक नव निर्मित धागे पहले स्विच किया गया है, यह (ret_from_fork पर क्रियान्वित इस जहां एक नया के लिए करने के लिए __switch_to() रिटर्न है बाहर शुरू होता है धागा), जिसका अर्थ है कि यह switch_to() दिनचर्या के दूसरे भाग को निष्पादित नहीं करता है।

+0

धन्यवाद! यही वह है जिसकी तलाश में मैं हूं! मैं copy_thread में देखने के लिए कभी अनुमान लगाया नहीं होगा। – Caleb1994

+0

@ कालेब 1 9 4 9: यह समझ में आता है जब आपको याद है कि निष्पादन के सभी नए धागे लिनक्स पर मौजूदा क्लोनिंग करके बनाए जाते हैं। मैंने अंत में एक और अनुच्छेद जोड़ा है जो सहायक हो सकता है। – caf

+1

इससे बहुत मदद मिली! मेरा छोटा कर्नेल अब कांटा() और उपज() प्रकार कॉल का समर्थन करता है :) आपकी मदद के लिए बहुत बहुत धन्यवाद! – Caleb1994

2

प्रक्रिया निर्माण पर ढेर की स्थिति X86-64 SVR4 ABI पूरक (AMD64, यानी x86-64 64 बिट मशीनों के लिए) में वर्णित है। 32 बिट्स इंटेल प्रोसेसर के बराबर शायद ABI i386 है। मैं दृढ़ता से Assembly HOWTO पढ़ने की भी अनुशंसा करता हूं। और निश्चित रूप से, आपको शायद प्रासंगिक लिनक्स कर्नेल फ़ाइल को पढ़ना चाहिए। है, जो की स्थापना की है कि गिरी बस libc स्टार्टअप कोड को नियंत्रण स्थानांतरित करने से पहले प्रदर्शन का वर्णन "एक लिनक्स/i386 ELF द्विआधारी की स्टार्टअप राज्य":

+0

ये पृष्ठ ** निष्पादन शुरू होने के बाद ** स्टैक की स्थिति का वर्णन करते हैं। ** समस्या ** ** निष्पादन से पहले ** स्टैक की स्थिति है। यानी जब कर्नेल ढेर स्थापित कर रहा है।मेरी एकमात्र समस्या यह तथ्य है कि लिनक्स सामान्य उद्देश्य रजिस्टरों को सहेजने के लिए संकलक छोड़ देता है (जो ढेर पर सहेजा जाता है), लेकिन जिस तरह से इन्हें बचाया जाता है, वह संकलक के आधार पर भिन्न हो सकता है, इसलिए मैं इस बात पर उलझन में हूं कि सिस्टम सेट कैसे प्रारंभिक ढेर ऊपर। मैंने कोड को देखा है, लेकिन मुझे नहीं पता कि प्रक्रिया कहां भर जाती है। यह मशीन अबास्ट्रक्शन के पीछे कहीं छिपा हुआ है। – Caleb1994

+0

ढेर निष्पादन से पहले मौजूद नहीं है। तो मुझे समझ में नहीं आता कि आप क्या चाहते हैं। कर्नेल एबीआई दस्तावेज में वर्णित प्रारंभिक प्रक्रिया स्टैक का निर्माण कर रहा है। –

+0

शायद आप भूल गए कि कर्नेल और उपयोगकर्ता-स्थान के ढेर अलग हैं? –

2

गूगल के लिए "लिनक्स ढेर लेआउट प्रक्रिया स्टार्टअप" this लिंक देता है।

+0

क्या यह 'निष्पादन' के बाद ही राज्य है? – osgx

+0

हां, यह आपकी प्रक्रिया के पहले निर्देश को निष्पादित करने से ठीक पहले राज्य है। –

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