Повышение контекста реализации

Я читаю реализацию boost fcontext.

Прототип функции make_fcontext

typedef void* fcontext_t;
fcontext_t BOOST_CONTEXT_CALLDECL make_fcontext( void * sp, std::size_t size, void (* fn)( intptr_t) );

Первый аргумент является вершиной стека контекста, пример из расширенного документа выглядит следующим образом:

// context-function
void f(intptr);// creates a new stack
std::size_t size = 8192;
void* sp(std::malloc(size));

// context fc uses f() as context function
// fcontext_t is placed on top of context stack
// a pointer to fcontext_t is returned
fcontext_t fc(make_fcontext(sp,size,f));

Когда я читаю реализацию make_context в i386_elf, реализация всегда уменьшает sp, она создает контекстное хранилище в памяти до sp, который находится вне памяти из malloc. Может ли он перезаписать мемрои, не принадлежащие сопрограмме?

/* first arg of make_fcontext() == top of context-stack */
movl  0x4(%esp), %eax

/*decrease the adress of sp here*/
/* reserve space for first argument of context-function
rax might already point to a 16byte border */
leal  -0x8(%eax), %eax

/* shift address in EAX to lower 16 byte boundary */
andl  $-16, %eax

/* reserve space for context-data on context-stack */
/* size for fc_mxcsr .. EIP + return-address for context-function */
/* on context-function entry: (ESP -0x4) % 8 == 0 */
leal  -0x20(%eax), %eax

/* third arg of make_fcontext() == address of context-function */
movl  0xc(%esp), %edx
movl  %edx, 0x18(%eax)

/* save MMX control- and status-word */
stmxcsr  (%eax)
/* save x87 control-word */
fnstcw  0x4(%eax)

0

Решение

В зависимости от архитектуры вашего процессора, стек может расти снизу вверх (в сторону более высоких адресов) или вниз (в сторону более низких адресов, как в случае с x86). Это обычно жестко запрограммировано в инструкции, установленной push а также pop инструкции изменяют указатель стека. Например, x86 push инструкция вычитает из [er]?sp,

make_fcontext ожидает, что указатель стека будет иметь достаточно места в специфическом для архитектуры направлении, необходимом платформе. На x86 это означает, что должно быть свободное место до указатель, а не после. Передав указатель, который вы получили от malloc Вы прямо нарушаете этот договор.

Вот почему stack_allocator абстракции существуют. Они возвращают указатели, указывающие на правый конец стека, в зависимости от архитектуры.

(Как примечание, я полагаю, что все архитектуры, в настоящее время поддерживаемые Boost.Context, имеют стеки, растущие вниз.)

2

Другие решения

Других решений пока нет …