#linux-kernel #linux-device-driver
Вопрос:
У меня есть драйвер ядра Linux, в котором есть глобальная переменная, доступ к которой осуществляется внутри функции EXPORT_SYMBOL. Драйвер повторно вводится и будет загружен несколько раз в зависимости от записи в дереве устройств. Я пытаюсь найти способ, с помощью которого другие драйверы ядра идентифицируют отдельные экземпляры, чтобы они могли установить обратный вызов с правильным экземпляром драйвера.
Например, внутри моего модуля драйвера:
/*global variable */
struct list *list;
int foo(void * data, void *callback(void *data)) {
//This function uses *list pointer.
}
EXPORT_SYMBOL(foo);
Этот драйвер может быть вызван несколько раз на основе записи в дереве устройств.
Комментарии:
1. Вы не можете загружать модуль несколько раз. Вы не должны быть в состоянии,
insmod
допустили бы ошибку, сказав, что он уже загружен. Это тоже не имеет особого смысла, что именно вы пытаетесь сделать, чтобы попытаться вставить модуль несколько раз? Будьте более конкретными и описательными.2. Нет никакого способа. У вас проблема с уровнем дизайна. Измените дизайн вашего драйвера должным образом.
3. «Этот драйвер может быть вызван несколько раз на основе записи дерева устройств». — Только если существует несколько экземпляров этого устройства, и каждый из них однозначно адресуем. Затем драйвер должен быть повторно зарегистрирован (вместо загрузки нескольких копий).
4. Да, водитель является повторным участником. Я хочу, чтобы другие драйверы ядра могли идентифицировать каждый экземпляр устройства отдельно, чтобы они могли устанавливать обратный вызов с отдельными экземплярами.
5. Предположительно, каждое устройство будет иметь некоторые личные данные, выделенные при вызове функции «зонд» устройства вашего драйвера, поэтому указатель функции обратного вызова, установленный другими драйверами ядра, может храниться в личных данных для этого устройства.