Головоломка программирования в КМУ: как найти местоположение блока управления процессом по основанию стека - PullRequest
1 голос
/ 25 июня 2010

Я читал головоломку по программированию в CMU из книги Программирование на Expert C: глубокие секреты C Питер Ван дер Линден.

Загадка, заявленная для кодирования программы, чтобы прочитать файл чисел и вывести среднее значение. Программа должна работать как можно быстрее, и программа должна была быть написана на языке PASCAL или C.

Кажется, программист создал программу, которая фактически заняла минус три секунды. При тщательном изучении было обнаружено, что программист знает, где хранится блок управления процессом относительно основания стека. Таким образом, он создал указатель для доступа к блоку управления процессом и переписал «CPU-time-used» с очень высоким значением. Операционная система не ожидала такого высокого значения и поэтому рассматривала это высокое положительное значение как отрицательное число в схеме дополнения двух.

Теперь я хотел знать, как он это сделал. Я знаю, что с помощью этого кода мы можем найти базовый адрес стека.

int main()
{
  int i;
  printf("The base value of the stack is %#d", &i);
  return 0;
}

Я могу понять, что стек растет вниз, и основание стека будет наверху физической памяти. Таким образом, база стека будет ниже системной памяти (память ядра / адресное пространство ядра). Таким образом, он использовал стек в качестве базы. Но как он узнал, где блок управления процессом хранится в системной памяти. Кроме того, какова структура блока управления процессом.

Кто-нибудь знает об этом.

Ответы [ 2 ]

0 голосов
/ 25 июня 2010

Раньше в некоторых реализациях было так, что * nix отображал структуру пользователя в память пространства пользователя, и стек находился под ней.Сегодня это маловероятно, что это возможно.Сортировка связанных: Псевдослучайный указатель стека под Linux?

0 голосов
/ 25 июня 2010

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

Мое предложение - прочитать классическую Разбить стек для удовольствия и прибыли , чтобы получить вступление. Если эти концепции для вас новы, вы будете в восторге от их чтения и изучения некоторых действительно важных вещей.

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