2013-12-03 4 views
0

Плохо ли, что процесс должен сам создать собственный стек? Если ядро ​​не хочет этого делать.Плохо ли, что процесс должен сам создать собственный стек?

Как здесь

_start: 
    mov $stack_head, %rsp 
    jmp main 

.data 
.align 8 
stack: 
    .quad 0 
    .quad 0 
    .quad 0 
    .quad 0 
stack_head: 

или с помощью таНос системного вызова.

+1

, пожалуйста, не используйте внешние ссылки в вопросах или ответах –

+0

См. Http://stackoverflow.com/questions/994555/windows-avoid-pushing-full-x86-context-on-stack для краткого обсуждения языка прикладного программирования что делает эту масштабируемость причиной. –

+0

Я разрабатываю ядро. Ядро не хочет управлять стеком. Я хочу знать, что это не вызовет проблемы в будущем. – user2616346

ответ

1

Нет, не как таковой. Некоторые системы даже требуют этого. Но всегда лучше следовать правилам, если это возможно.


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

Хорошая и красивая идея - нет, в случае Linux или Windows, потому что это противоречит соглашениям. Также это несколько больше (ненужных) проблем.

Во многих RTOS-дисках вы должны сами устанавливать стеки.

0

Некоторые ОС требуют даже установить такой стек.

Однако malloc() не будет работать, поскольку для таких функций, как malloc(), обычно требуется указатель на уже установленный стек.

Под Linux - например, это очень плохо, потому что Linux наблюдает указатель стека и автоматически выделяет больше памяти, если это необходимо. Если вы переместите указатель стека, как это, вы, возможно, вызовете крах вашей программы.

+0

Crash? Только если вы плохо проектируете. Если у вашего приложения достаточно свободного места в стеке, приобретенного malloc или любым другим способом, это не программа. У меня есть язык программирования, который делает это, с очень маленькими выделенными кучами областями стека под Wine. Конечно, это не совсем Linux, но Wine в основном работает, позволяя вашему двоичному коду исполняться изначально (включая операции стека). Наши приложения работают отлично. –

+0

@IraBaxter: Это правда. Но при использовании стека, выделенного ОС, ОС будет автоматически изменять размер стека при необходимости (по крайней мере, при использовании Linux); это не тот случай, когда используется самораспределяемый стек, поэтому, когда стек «заполнен», тогда команда «push» вызовет сбой программы! –

+0

(«это не программа» означает «это не проблема»). Как Linux знает, что такое область стека для программы, если она не диктует ее? Как это работает с несколькими потоками (I предположим, что они также могут быть продиктованы). Как я уже говорил, если самораспределенный стек определяется компилятором, а не переполнением, никакое нажатие не может вызвать ловушку. –