Доступ к запланированным инструкциям процесса в модуле ядра
Я хочу написать модуль ядра, который проверяет запланированные инструкции запущенного процесса. Я уже взглянул на Linux Kernel Process Management, который объясняет, как перебирать процессы.
struct task_struct *task;
for_each_process(task) {
/* this pointlessly prints the name and PID of each task */
printk("%s[%d]\n", task->comm, task->pid);
}
Но как только я овладеваю task_struct
как мне добраться до инструкции? Я предполагаю, что мне нужно сначала найти счетчик программ, чтобы увидеть, какие инструкции будут выполнены в следующий раз.
Какой член task_struct
мне нужно проверить, чтобы в конечном итоге по инструкции? И в каком виде struct
типа они хранятся?
Спасибо за вашу помощь. Я не настолько опытен в программировании ядра.
1 ответ
Я предполагаю, что это продолжение вашего последнего вопроса. Вы правы, что через task_struct
Вы можете получить доступ к счетчику программ процессов (также называемому указателем инструкций на x86). Я отвечу за x86, поскольку вы указали, что вы заинтересованы в поиске инструкций, специфичных для этого набора инструкций.
Вы должны посмотреть в файле arch/x86/include/asm/processor.h
, Он содержит довольно много вспомогательных макросов и функций, поэтому вам не нужно изобретать велосипед. Один из тех, которые наиболее вероятно будут вам интересны, это task_pt_regs(task)
, Этот макрос даст вам все значения регистра, связанные с данной задачей. Эти значения содержатся в struct pt_regs
, Вы можете увидеть определение этой структуры в arch/x86/include/asm/ptrace.h
, Член, который вас интересует, unsigned long ip
,
Теперь у вас есть адрес памяти, который указывает на следующую инструкцию, которая будет выполнена процессом. Это должно быть преобразовано в физический адрес, чтобы быть полезным для вас, хотя. Это тема для другого вопроса, хотя.
Одна короткая заметка, чтобы ответить на вопрос в вашем комментарии. Инструкции не хранятся в какой-либо структуре данных, такой как связанный список. Они просто в последовательности один за другим со всеми своими операндами. Вы должны думать об этом больше как о двоичном файле, который может быть проанализирован процессором.