Я читал головоломку по программированию в 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;
}
Я могу понять, что стек растет вниз, и основание стека будет наверху физической памяти. Таким образом, база стека будет ниже системной памяти (память ядра / адресное пространство ядра). Таким образом, он использовал стек в качестве базы. Но как он узнал, где блок управления процессом хранится в системной памяти.
Кроме того, какова структура блока управления процессом.
Кто-нибудь знает об этом.