Я пытаюсь создать модуль e kernel, который будет использоваться программой userpace для настройки таймеров. Я реализую его как персональное устройство. Каков наилучший способ реализовать несколько таймеров в модуле ядра?Каков наилучший способ внедрения нескольких таймеров в модуле ядра
В настоящее время у меня есть один 'timer_list *', sat 'timer'. Я назначаю память из кучи каждый раз, когда получаю новый запрос на таймер, а затем использую setup_timer() и mod_timer(), чтобы каждый раз устанавливать таймер, когда я назначаю память. Но я использую только один указатель на структуру timer_list. Но моя озабоченность здесь заключается в том, что как освободить память, назначенную «таймеру», после вызова функции обратного вызова, потому что текущее значение «таймер» может не указывать на структуру, вызывающая функцию обратного вызова.
Итак, я подумал о передаче адреса структуры в качестве аргумента функции обратного вызова, а затем вызовет kfree() на этом адресе.
struct timer_list *timer;
timer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
setup_timer(timer, my_callback, (unsigend long)timer);
Моей функция обратного вызова выглядит следующим образом:
void my_callback (unsigned long data)
{
struct timer_list *timer = (struct timer_list*)data;
printk("%d\n", timer->data);
kfree(timer);
}
В этом случае я получаю ошибку сегментации при попытке печати таймера> данные говоря, что нет страницы для этого конкретного адреса. Итак, память, выделенная таймером, освобождается при вызове функции обратного вызова. В этом случае мне не нужно беспокоиться о освобождении памяти.
Кроме того, есть ли лучший способ реализовать эту вещь. Кроме того, чтобы следить за всеми таймерами (например, проверять как наличие таймера), можно ли поддерживать что-то вроде связанного списка или есть какая-то функция ядра, чтобы проверить это?
Может быть, посмотреть на http://stackoverflow.com/questions/9662193/how-to-access-kernel-space-from-user- spacein-linux. Я думаю, вам придется копировать свои данные из ядра в пространство пользователя, поскольку код пространства пользователя не может получить доступ к памяти ядра. – JimmyB
@ HannoBinder спасибо, но я действительно ничего не нашел, что отвечает на мой вопрос по ссылке, которую вы упомянули. – Poojan
Я хотел бы указать на некоторую ссылку на обмен данными между ядром и пользовательским пространством. - Глупый вопрос: Успешно ли работает kmalloc? Действительно ли адрес возвращен тем же самым, что и тот, который был передан в обратный вызов? – JimmyB