Действительно ли это - программа или ОС, которая ответственна за установку стека

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

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

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

Что другие действия должна сделать отдельная программа, прежде чем она сможет начать выполнять свою основную функцию?

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

6
задан 16 July 2010 в 13:02
поделиться

3 ответа

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

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

1
ответ дан 17 December 2019 в 18:09
поделиться

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

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

0
ответ дан 17 December 2019 в 18:09
поделиться

Вы можете поискать формат 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]
2
ответ дан 17 December 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: