2010-07-16 11 views
6

सेट करने के लिए ज़िम्मेदार है, यह सवाल पूछा जाता है क्योंकि लेखक एक कंपाइलर (src -> asm) बना रहा है और असेंबली कोड उत्पन्न करने के लिए कोड लिखने की प्रक्रिया में है।क्या यह प्रोग्राम या ओएस है जो स्टैक

जब कोई प्रोग्राम लिनक्स (किसी ओएस वास्तव में) आधारित ऑपरेटिंग सिस्टम पर निष्पादित होता है तो पहली चीजों में से एक यह है कि स्टैक सेट हो जाता है और एसपी रजिस्टर को स्टैक की शुरुआत के स्मृति पते के साथ असाइन किया जाता है ।

मैं इस बारे में उत्सुक था कि उपर्युक्त करने की ज़िम्मेदारी प्रोग्राम के साथ है, या ओएस स्वयं ही है। यदि यह मामला है कि जिम्मेदारी कार्यक्रम के साथ है, तो यह कार्यक्रम द्वारा कैसे पूरा किया जाता है (विशेष रूप से, एक लिनक्स बेस पर्यावरण में)?

किसी भी व्यक्तिगत कार्यक्रम को अपने मुख्य कार्य को निष्पादित करने से पहले अन्य कार्यों को क्या करना चाहिए?

टिप्पणी के साथ उदाहरण i386 NASM असेंबली कोड की सराहना की जाती है। साथ ही, कोई भी वेब संसाधन जो लेखक को अपने लक्ष्य में मदद कर सकता है, उसकी भी बहुत सराहना की जाएगी।

+11

यह टिप्पणीकार आश्चर्य करता है कि लेखक तीसरे व्यक्ति में खुद के बारे में क्यों बात करता है। – Konerak

+0

मेरा सरल दिमाग कुछ synapse को गलती से पार किए बिना मैन्युअल मेमोरी प्रबंधन को संभाल नहीं सकता है। दुष्प्रभाव होने के बावजूद है, हे। – jimka

उत्तर

1

ओएस आप के लिए सपा की स्थापना की और स्टैक पर कार्यक्रम तर्क स्थापित करेंगे। चलाने के लिए आपके कार्यक्रम को स्थापित करने के लिए कुछ खास नहीं है।

जब आपका प्रोग्राम शुरू होता है तो लिनक्स पर वास्तविक स्टैक लेआउट के लिए, आप विवरण के लिए this document देख सकते हैं।

0

ऑपरेटिंग सिस्टम का प्रोग्राम लोडर निष्पादन योग्य प्रक्रियाओं में स्टैक स्पेस आवंटित करने के लिए ज़िम्मेदार है। स्टैक केवल एक मेमोरी सेगमेंट है (अपना लिंक मैप देखें) कि निष्पादन के लिए प्रोग्राम को लोड करते समय लोडर ठीक हो जाता है। अन्य खंडों में अनियमित स्मृति और प्रारंभिक स्मृति शामिल है। लोडर को यह संकेत देने के लिए "स्थानांतरित करने योग्य" लोडर भी कहा जाता है कि यह प्रोग्राम को स्मृति में सुविधाजनक स्थान पर लोड करने का ख्याल रखता है।

जब एक एम्बेडेड सिस्टम के लिए क्रॉस-कंपाइलिंग/लिंकिंग, लिंक स्पेक में लोड समय पर उपयोग की जाने वाली ढेर और ढेर जानकारी होती है।

2

आप लिनक्स के लिए ईएलएफ प्रारूप के बारे में खोज सकते हैं। और विंडोज़ के लिए पीई-सीओएफएफ।

वे निष्पादन योग्य प्रारूप हैं और यह ऐसा कुछ है जिसे ओएस के बारे में पता है। लिनक्स के तहत आपके पास प्रोग्राम लोड करने के लिए ज़िम्मेदार मॉड्यूल हैं और प्रोग्राम को सही तरीके से लोड करने के लिए अन्य में निष्पादन योग्य प्रारूप का उपयोग करें।

संपादित करें: glibc से एक सुराग जवाब दे:

/* 
[snip] 
%esp  The stack contains the arguments and environment: 
     0(%esp)   argc 
     4(%esp)   argv[0] 
     ... 
     (4*argc)(%esp)  NULL 
     (4*(argc+1))(%esp) envp[0] 
     ... 
        NULL 
[snip] 
*/ 
[snip] 
_start: 
    /* Clear the frame pointer. The ABI suggests this be done, to mark 
     the outermost frame obviously. */ 
    xorl %ebp, %ebp 

    /* Extract the arguments as encoded on the stack and set up 
     the arguments for `main': argc, argv. envp will be determined 
     later in __libc_start_main. */ 
    popl %esi  /* Pop the argument count. */ 
    movl %esp, %ecx  /* argv starts just at the current stack top.*/ 

    /* Before pushing the arguments align the stack to a 16-byte 
    (SSE needs 16-byte alignment) boundary to avoid penalties from 
    misaligned accesses. Thanks to Edward Seidl <[email protected]> 
    for pointing this out. */ 
    andl $0xfffffff0, %esp 
    pushl %eax  /* Push garbage because we allocate 
        28 more bytes. */ 

    /* Provide the highest stack address to the user code (for stacks 
     which grow downwards). */ 
    pushl %esp 

    pushl %edx  /* Push address of the shared library 
        termination function. */ 

[snip] 
संबंधित मुद्दे