Как получить информацию о процессе?

В моем классе операционной системы мы программируем на C и переопределяем прерывание по таймеру, после чего из написанного нами прерывания по таймеру нам нужно обрабатывать 4 процесса, но нам нужно получить контекст процесса, например, указатель инструкции, сегмент данных и т. д. Как мы можем получить эту информацию от c? если нет, нужно ли нам также использовать ASM внутри кода C? Спасибо

Я использую виртуальный ящик с 32-разрядной версией Windows XP и 16-разрядной виртуальной машиной DOS


person alfjos89    schedule 12.03.2011    source источник
comment
Просмотрите некоторые из ваших вопросов и примите некоторые ответы.   -  person karlphillip    schedule 12.03.2011


Ответы (3)


Да, вам очень нужно хотя бы немного языка ассемблера. Типичной отправной точкой является pusha. Это сохраняет основные регистры общего назначения, поэтому у вас есть место для работы, не уничтожая ничего критического. Если вы поддерживаете FPU, вы, вероятно, захотите взглянуть на fsave. Вы восстанавливаете их с popa и frestore соответственно.

person Jerry Coffin    schedule 12.03.2011

Вам, вероятно, потребуется использовать ассемблерный код для сохранения/восстановления контекста, если у вас уже нет реализованных библиотечных подпрограмм, таких как getcontext/setcontext.

person Jeremiah Willcock    schedule 12.03.2011
comment
Где я могу получить библиотеку с этой функцией? - person alfjos89; 12.03.2011
comment
@ alfjos89: Обычно они находятся в вашей стандартной библиотеке C, но есть различные библиотеки сопрограмм/переключения контекста, которые вы можете загрузить и которые делают аналогичные вещи. - person Jeremiah Willcock; 12.03.2011

Я считаю, что этот метод не будет работать для EIP и EFLAGS, поскольку к ним можно получить доступ только с помощью специальных инструкций.

Я не знаю эквивалента movl для DOS 16 бит, но я думаю, что вы поняли идею.

unsigned long get_ebp() 
{
  __asm__("movl %ebp, %eax");
}

int main()
{
  printf("ebp: 0x%p\n", get_ebp());
}
person karlphillip    schedule 12.03.2011