Я пишу небольшой драйвер ядра, который действует как приманка, отслеживая определенные c файлы в системе. Чтобы выполнить этот мониторинг, я перехватываю системный вызов do_sys_open
с использованием инфраструктуры ftrace
и записываю попытку в файл журнала вместе с отметкой времени этой попытки.
Вот функция, которая «Я» написал, чтобы получить метку времени:
static char* get_current_timestamp(void)
{
struct timespec64 now;
char* timestamp;
timestamp = kmalloc(4096, GFP_KERNEL);
ktime_get_real_ts64(&now);
unsigned int temp, year, second, minute, hour;
temp = now.tv_sec;
year = (1970 + (temp / 31556952));
second = temp%60;
temp /= 60;
minute = temp%60;
temp /= 60;
hour = temp%24;
sprintf(timestamp, "GMT %d %02d:%02d:%02d\n", year, hour, minute, second);
return timestamp;
}
Проблема в том, что когда я вызываю эту функцию из любой нормальной функции в моем драйвере, она работает отлично, но когда я вызываю ее изнутри моего хука do_sys_open
ядро вылетает.
После небольшой отладки я обнаружил, что если я закомментирую вызов ktime_get_real_ts64
из функции, все будет идти так, как задумано. По этой причине я попытался использовать getnstimeofday64
вместо этого, что также с треском провалилось. Версия ядра, на которой я сейчас работаю, - 5.3.0-28-generic
.
Есть идеи, почему это происходит, или как я могу взять метку времени в своем sys_open
хуке, не разбивая компьютер?