Доступ к запланированным инструкциям процесса в модуле ядра

Я хочу написать модуль ядра, который проверяет запланированные инструкции запущенного процесса. Я уже взглянул на 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,

Теперь у вас есть адрес памяти, который указывает на следующую инструкцию, которая будет выполнена процессом. Это должно быть преобразовано в физический адрес, чтобы быть полезным для вас, хотя. Это тема для другого вопроса, хотя.

Одна короткая заметка, чтобы ответить на вопрос в вашем комментарии. Инструкции не хранятся в какой-либо структуре данных, такой как связанный список. Они просто в последовательности один за другим со всеми своими операндами. Вы должны думать об этом больше как о двоичном файле, который может быть проанализирован процессором.

Другие вопросы по тегам