Для назначения класса мы пишем специальный системный вызов, который извлекает определенную информацию о существующем дереве процессов. Системный вызов по большей части работает нормально и получает соответствующую информацию. Однако некоторые обрабатывают его, вылетая с сообщением об ошибке «Невозможно обработать разыменование нулевого указателя ядра по виртуальному адресу [адрес]». Чего я не понимаю, так это того, что я проверяю, является ли указатель NULL, прежде чем получить к нему доступ, и, тем не менее, он все равно не работает.
Пример: в приведенном ниже коде current_process - действительный указатель на task_struct, а k_buf действителен
printk("Setting parent process\n");
parent_process = current_process->real_parent;
printk("Parent process set\n");
if (parent_process != NULL) {
printk("Parent process is not null and getting pid\n");
k_buf[i].parent_pid = parent_process->pid;
} else {
k_buf[i].parent_pid = 0;
}
printk("Done with parent process\n");
При запуске программа печатает:
Setting parent process
Parent process set
Parent process is not null and getting pid
Done with parent process
пару раз, а затем
Setting parent process
Parent process set
Parent process is not null and getting pid
перед тем, как выдать ошибку и войти в панику ядра.
Что такое Я делаю не так? Есть какие-нибудь мысли?
РЕДАКТИРОВАТЬ:
На данный момент я закомментировал приведенный выше код, чтобы я мог продолжить работу над остальной частью системного вызова. Когда я пытаюсь получить доступ к pid дочернего процесса (снова после пары успешных попыток), он выдает ошибку «Не удается обработать запрос ядра на подкачку по виртуальному адресу». Насколько я понимаю, у меня есть правильные блокировки для чтения этих данных. Однако есть ли что-то еще, что мне нужно сделать, чтобы проверить память перед тем, как получить к ней доступ?