Как получить информацию о процессе? - PullRequest
1 голос
/ 12 марта 2011

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

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

Ответы [ 3 ]

2 голосов
/ 12 марта 2011

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

0 голосов
/ 12 марта 2011

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

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

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

int main()
{
  printf("ebp: 0x%p\n", get_ebp());
}
0 голосов
/ 12 марта 2011

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

...