Я пытаюсь переместить мой указатель стека в область mmap, чтобы имитировать переключение контекста, но каким-то образом код ниже всегда дает ошибку сегментации:
C:
struct savectx {
void *regs[JB_SIZE];
};
struct savectx* initctx=(struct savectx*)malloc(sizeof(savectx));
void *newsp;
if ((newsp=mmap(0,STACK_SIZE,PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS,0,0))==MAP_FAILED){
perror("mmap failed");
}
initctx->regs[4]=newsp;
restorectx(initctx,0);
x86:
restorectx:
movl 4(%esp),%ecx /*Move jump buffer addr to ecx */
movl 8(%esp),%eax /*Longjmp return value */
movl (JB_SP*4)(%ecx),%esp /*JB_SP is defined to be 4,*/
Сбой программы на последней строке сборки.
Для malloc я знаю, что мне, возможно, придется добавить 0x000f0000 к указателю, но как насчет mmap? Или как нам настроить стек в соответствии с местоположением mmapp-ed.
(man-страница для mmap: http://linux.die.net/man/3/mmap, скомпилирована с GCC в Ubuntu)