За установку стека отвечает программа или ОС - PullRequest
6 голосов
/ 16 июля 2010

Этот вопрос задается, потому что автор создает компилятор (src -> asm) и находится в процессе написания кода для генерации кода сборки.

Одна из первых вещейэто происходит, когда программа выполняется в операционной системе на базе Linux (любой другой ОС), когда стек настраивается и регистру SP назначается адрес памяти начала стека.

Мне было любопытноо том, лежит ли ответственность за выполнение вышеперечисленного за программу или за саму ОС.Если дело в том, что ответственность лежит на программе, то как это выполняется программой (в частности, в базовой среде Linux)?

Какие другие действия должна выполнить отдельная программа, прежде чем она сможет начать выполнение своей программы?main function?

Примеры с комментируемым кодом сборки i386 NASM приветствуются.Кроме того, любой веб-ресурс, который мог бы помочь автору в его цели, также был бы очень признателен.

Ответы [ 3 ]

2 голосов
/ 16 июля 2010

Вы можете перейти к поиску формата ELF для Linux. И PE-COFF для окон.

Это способ форматирования исполняемого файла, о котором ОС знает. В Linux у вас есть модули, отвечающие за загрузку программы, и для корректной загрузки программы используется исполняемый формат в другом.

РЕДАКТИРОВАТЬ: ключ от 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 <seidl@janed.com>
    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]
1 голос
/ 16 июля 2010

ОС установит для вас SP и поместит аргументы программы в стек.Ничего особенного ваша программа не должна настраивать для запуска.

Что касается фактического макета стека в Linux при запуске вашей программы, вы можете проверить этот документ для получения подробной информации.

0 голосов
/ 16 июля 2010

Загрузчик программ операционной системы отвечает за выделение стекового пространства исполняемым процессам.Стек - это всего лишь один сегмент памяти (посмотрите на карту ссылок), который исправляет загрузчик при загрузке программы в оперативную память для выполнения.Другие сегменты включают неинициализированную память и инициализированную память.Загрузчик также называется «перемещаемым» загрузчиком, чтобы указать, что он заботится о загрузке программы в удобное место в памяти.

При кросс-компиляции / компоновке для встроенной системы спецификация ссылки содержит кучу иинформация стека, которая используется во время загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...