LINUX.ORG.RU

[kernel] нужно получить program counter некоторых процессов

 


0

2

Собственно в ядре хочу узнать program counter (точнее нужно для x86, так что просто регистр ip прочитать) режима пользователя для некоторых потоков/процессов, которые не выполняются сейчас на CPU, по-скольку они в какой-то из очередей планировщика, их регистры должны быть как-то доступны. Может кто подскажет как это примерно сделать? Желательно с учетом необходимых блокировок, чтобы потоки не перескедулились в неподходящий момент.

Суть задачи сделать то же самое, что ptrace(GETREGS) только без блокировки.

★★

Такие вещи обычно хранятся в структуре процесса/треда. Не знаю как конкретно в линуксе называется, поищите task_struct/thread_struct.

AptGet ★★★
()

>которые не выполняются сейчас на CPU, по-скольку они в какой-то из очередей планировщика

Желательно с учетом необходимых блокировок, чтобы потоки не перескедулились в неподходящий момент.

Процесс в очереди, процесс не выполняется (обобщим до !task_running).

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

Единственная возможность препятствовать засасыванию — снятие с очереди(и последующая постановка), но это, сам понимаешь, совсем кривой способ.

ttnl ★★★★★
()

Так, ну регистры сохраняются на ядерном стеке процесса, надо теперь подумать, как аккуратно их оттуда забрать.

frey ★★
() автор топика
Ответ на: комментарий от sn1ln

А они на одной странице находятся, только стек вверху, а thread_info внизу

frey ★★
() автор топика

> ptrace(GETREGS) только без блокировки.

Ты понимаешь, что отсуствие блокировки лишает результат смысла?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

У меня специфическая задача. Мне нужно убедитья, что поток не находится в определенном регионе адресов (5 байт). Я уверен, что он больше туда попасть не может, поэтому нужно отсечь случаи, когда он там уже (если вдруг) и подождать пока он оттуда выйдет.

frey ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.