Сделать указатель стека на возвращаемый указатель mmap.(Linux, 32-битная ВМ) - PullRequest
5 голосов
/ 13 мая 2011

Я пытаюсь переместить мой указатель стека в область 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)

Ответы [ 2 ]

4 голосов
/ 13 мая 2011

Linux (или UN * X в целом) уже имеет функции для выполнения такого рода замены контекста:

Если вы используете их, вы можете заменить весь начальный набор регистров (включая указатель стека), настроив подходящий ucontext_t / struct sigcontext (uc_mcontext член ucontext_t). Вызов setcontext() затем становится своего рода расширенным longjmp().

Пример использования можно найти в статье Википедии по setcontext().

Для определения Linux ucontext_t см .:

2 голосов
/ 14 мая 2011

Таким образом, проблема была в том, что mmap растет в противоположном направлении стека (что, к сожалению, я забыл).Таким образом, чтобы назначить указатель, я просто должен был назначить (mmaped_stack + stack_size) вместо только указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...