setcontext 和 makecontext 调用通用函数指针

Posted

技术标签:

【中文标题】setcontext 和 makecontext 调用通用函数指针【英文标题】:setcontext and makecontext to call a generic function pointer 【发布时间】:2011-02-01 00:01:54 【问题描述】:

在another question 移植代码时遇到问题:

unsigned long stack[] =  1, 23, 33, 43 ;

/* save all the registers and the stack pointer */
unsigned long esp;
asm __volatile__ ( "pusha" );
asm __volatile__ ( "mov %%esp, %0" :"=m" (esp));

for( i = 0; i < sizeof(stack); i++ )
    unsigned long val = stack[i];
    asm __volatile__ ( "push %0" :: "m"(val) );


unsigned long ret = function_pointer();

/* restore registers and stack pointer */
asm __volatile__ ( "mov %0, %%esp" :: "m" (esp) );
asm __volatile__ ( "popa" );

到 64 位平台,很多人告诉我应该使用 setcontext()makecontext() 函数集,因为 32 和 64 之间的调用转换差异位和可移植性问题。

好吧,我真的在网上找不到任何有用的文档,或者至少不是我需要实现的那种,所以,我如何使用这些函数将参数压入堆栈,调用通用函数指针,获取返回值然后恢复寄存器?

【问题讨论】:

【参考方案1】:

我终于使用 libffi 了。

【讨论】:

【参考方案2】:

***页面有一个不错的example。

这不是您正在寻找的解决方案。 makecontext 不采用数组,而是采用变量参数列表。因此,为了调用它,您需要一个将数组转换为参数列表的函数。既然这就是你想要的makecontext,当你可以使用它时,你已经解决了你的问题。

我不知道解决方案是什么,但这是一条死胡同。

【讨论】:

好的,但是如何将 ulong 值插入堆栈? 好的,但问题是 makecontext 想要函数的参数,我不知道它们的数量,它们可能是 2 个参数,也可以是 4 个......

以上是关于setcontext 和 makecontext 调用通用函数指针的主要内容,如果未能解决你的问题,请参考以下文章

使用makecontext实现用户线程

使用makecontext实现用户线程

makecontext 段错误?

异步 setContext 中的身份验证等待

测试与log

协程基础_context系列函数