Boost上下文实现
Boost Context implementation
我正在阅读 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) );
第一个参数是上下文栈的顶部,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之前的内存中,这是内存不足的分配。能覆盖不属于协程的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)
根据您的 CPU 体系结构,堆栈可能 向上 (向更高地址)或 向下 (向较低地址)增长地址,就像 x86 上的情况一样)。这通常通过 push
和 pop
指令修改堆栈指针的方式硬编码在指令集中。例如,x86 push
指令从 [er]?sp
.
中减去
make_fcontext
期望堆栈指针在平台所需的特定于体系结构的方向上具有足够的 space。在 x86 上,这意味着必须有可用的 space 在 指针之前,而不是之后。通过直接传递从 malloc
收到的指针,您违反了此合同。
这就是 stack_allocator
抽象存在的原因。它们 return 指向堆栈右端的指针,具体取决于体系结构。
(附带说明,我相信 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) );
第一个参数是上下文栈的顶部,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之前的内存中,这是内存不足的分配。能覆盖不属于协程的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)
根据您的 CPU 体系结构,堆栈可能 向上 (向更高地址)或 向下 (向较低地址)增长地址,就像 x86 上的情况一样)。这通常通过 push
和 pop
指令修改堆栈指针的方式硬编码在指令集中。例如,x86 push
指令从 [er]?sp
.
make_fcontext
期望堆栈指针在平台所需的特定于体系结构的方向上具有足够的 space。在 x86 上,这意味着必须有可用的 space 在 指针之前,而不是之后。通过直接传递从 malloc
收到的指针,您违反了此合同。
这就是 stack_allocator
抽象存在的原因。它们 return 指向堆栈右端的指针,具体取决于体系结构。
(附带说明,我相信 Boost.Context 目前支持的所有架构都有向下增长的堆栈。)