Boost Context实现

时间:2017-04-21 07:34:43

标签: c++ assembly boost stack boost-context

我正在阅读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-stack的顶部,boost文档的一个例子如下:

// 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));

当我在i386_elf中读取make_context的实现时,实现总是减少sp,它会使sp上的内存存储在sp内,这是malloc的内存不足。它可以覆盖不属于协程的memroy吗?

/* 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)

1 个答案:

答案 0 :(得分:2)

根据您的CPU架构,堆栈可能向上(朝向更高地址)或向下(朝向更低地址,如x86上的情况)。这通常在指令集中通过pushpop指令修改堆栈指针的方式进行硬编码。例如,x86 push指令从[er]?sp减去。

make_fcontext期望堆栈指针在平台所需的体系结构特定方向上具有足够的空间。在x86上,这意味着在指针之前必须有可用空间,而不是之后。通过直接传递您从malloc收到的指针,您违反了此合同。

这就是stack_allocator抽象存在的原因。它们返回指向堆栈右端的指针,具体取决于体系结构。

(作为旁注,我相信Boost.Context目前支持的所有架构都有向下增长的堆栈。)