Ошибка сегментации setcontext() при нормальной работе, но хорошо работает под GDB

Я пытаюсь создать проект операционной системы, который получает контекст текущего потока и сериализуется, отправляет его по сети на другой компьютер и выбирает, где поток остановился, и продолжает работу. (Так называемый thread-migrator).

Мне удалось закончить это в Linux, но когда я работаю в реальной среде, я всегда получаю ошибку сегментации, но она работала под GDB.

Это может быть связано с проблемой рандомизации адресов, потому что когда я включаю рандомизацию в GDB, это показывает, что в setcontext() есть ошибка сегментации.

Но я просто не понимаю, потому что текстовый раздел не будет рандомизирован (и я проверил значение REG_RIP в ucontext.mcontext.greps, они всегда одинаковы). Тогда в чем может быть причина того, что случайная адресация дает сбой? Стек будет устанавливаться непосредственно с помощью ucontext, что, я не думаю, что рандомизация будет проблемой.

Мой код сервера выглядит следующим образом.

bool_t migrate_1_svc(rpc_ucontext *context, void *res, struct svc_req *req)
{
  printf("Server received.\n");
  ucontext_t cont;

  // initialize the context
  getcontext(&cont);

  cont.uc_flags = context->uc_flags;

  // ucontext.stack_t
  cont.uc_stack.ss_flags = context->uc_stack.ss_flags;
  cont.uc_stack.ss_sp = context->uc_stack.ss_sp.ss_sp_val;
  cont.uc_stack.ss_size = context->uc_stack.ss_sp.ss_sp_len;

  // ucontext.mcontext_t
  memcpy(cont.uc_mcontext.__reserved1, context->uc_mcontext.__reserved1, sizeof(cont.uc_mcontext.__reserved1));
  cont.uc_mcontext.fpregs = (struct _libc_fpstate *)malloc(sizeof(struct _libc_fpstate));
  memcpy(cont.uc_mcontext.fpregs, &context->uc_mcontext.fpregs, sizeof(struct _libc_fpstate));
  memcpy(cont.uc_mcontext.gregs, context->uc_mcontext.gregs, sizeof(gregset_t));

  memcpy(&cont.uc_sigmask, &context->uc_sigmask, sizeof(__sigset_t));

  memcpy(&cont.__fpregs_mem, &context->__fpregs_mem, sizeof(struct _libc_fpstate));

  printf("Setting the context.\n");

  ucontext_t my_context;
  getcontext(&my_context);

  cont.uc_link = &my_context;

  setcontext(&cont);
  return true;
}

0 ответов

Другие вопросы по тегам