2013-10-09 2 views
0

Я пытаюсь создать модуль 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); 
} 

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

Кроме того, есть ли лучший способ реализовать эту вещь. Кроме того, чтобы следить за всеми таймерами (например, проверять как наличие таймера), можно ли поддерживать что-то вроде связанного списка или есть какая-то функция ядра, чтобы проверить это?

+0

Может быть, посмотреть на http://stackoverflow.com/questions/9662193/how-to-access-kernel-space-from-user- spacein-linux. Я думаю, вам придется копировать свои данные из ядра в пространство пользователя, поскольку код пространства пользователя не может получить доступ к памяти ядра. – JimmyB

+0

@ HannoBinder спасибо, но я действительно ничего не нашел, что отвечает на мой вопрос по ссылке, которую вы упомянули. – Poojan

+0

Я хотел бы указать на некоторую ссылку на обмен данными между ядром и пользовательским пространством. - Глупый вопрос: Успешно ли работает kmalloc? Действительно ли адрес возвращен тем же самым, что и тот, который был передан в обратный вызов? – JimmyB

ответ

1

В некотором роде вы должны отслеживать все свои таймеры. Вы можете использовать, например, list (см. list.h) ваших ожидающих таймеров. Затем вы можете зациклиться на своем списке, чтобы проверить, не истечет ли какой-либо таймер и освободить его память (и удалить из списка). Вы можете сделать это, прежде чем выделять новый таймер.

timer_list не освобождается автоматически, потому что вы можете перепрограммировать его с mod_timer()

+0

Это помогает! В этом случае я не знаю, почему я получаю ошибку сегментации, когда пытаюсь освободить 'timer_list', используя kfree() – Poojan

+0

Это зависит от того, где вы используете' kfree() '. В вашем примере вы отключите память 'timer_list' во время использования.Вероятно, это не ошибка 'kfree()', но что-то, что использует память 'timer_list' после того, как вы сделали' kfree() ' – Federico

Смежные вопросы