Файл структуры в linux-драйвере

В настоящее время я изучаю, как писать драйверы устройств Linux, и мне трудно понять " файл структуры". Я использую книгу Linux Device Drivers 3-го издания, чтобы помочь мне.

Вот что я понял.

а. Структурный файл представляет собой открытый файл, поэтому, когда open вызывается в модуле драйвера устройства, ядро ​​создаст файл структуры, содержащий все, что связано с драйвером устройства.

б. Если вы хотите обойти этот экземпляр драйвера устройства, вам нужно передать указатель на конкретный файл структуры, который был создан ядром после open()

с. file- > private_data​​strong > всегда будет возвращать указатель на устройство.

Другой вопрос, связанный с этим, - это поле " f_pos". В книге говорится, что драйвер может прочитать это значение, если хочет узнать текущую позицию в файле. Вот что я понимаю из этого.

д. Если struct foo_dev, и если общий объем памяти, используемый этим драйвером для хранения данных, X, то f_pos указывает на текущую позицию в этом блоке памяти, зарезервированном драйвером.

Насколько я понял, правильно и, пожалуйста, поправьте меня, где я ошибаюсь.

Спасибо,
Мир

Ответ 1

Структурный файл создается ядром и представляет собой представление ядер вашего устройства, которое позволяет ядру отображать с дескриптора файла на устройство.

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

Если вы выделяете хранилище, вы можете использовать file- > private_data, чтобы вы могли получить из файла структуры, который был передан вашему драйверу, путем чтения/записи/etc в вашу структуру.

Как используется файл- > private_data, зависит от драйвера, ядро ​​его не трогает. Его просто там для использования драйверов.

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

Ответ 2

Это в дополнение к тому, что сказал andrew...

a) struct FILE предоставляется ядром, но он подразумевается как интерфейс между ядром и одним приложением.

b) Другими словами, вы не можете передавать структуру FILE между несколькими приложениями для совместного использования устройства. Единственное исключение, где это возможно, - это между родительскими и дочерними процессами. Для доступа к устройствам или драйверам устройств одновременно из нескольких приложений, каждое приложение. должен вызвать вызов на устройстве и создать собственную структуру FILE. Это зависит от того, разрешать ли одновременный доступ или нет. Ядро здесь не говорит.

c) private_data - это именно то, что он говорит. Данные, относящиеся к драйверу устройства. Приложение или библиотека могут использовать это поле для передачи данных, которые очень специфичны для драйвера устройства.