#linux #c #драйвер
Чтобы использовать символьный драйвер - нам надо создать файл устройста, он же специальный файл или узел дерева файловой системы. У меня есть два мнения для чего он нужен, скажите, пожалуйста, какое правильное (если есть такое). 1) Это файл, который служит неким интерфейсом. Например, когда мы пишем такую команду echo "hello" > /dev/my_driver, то строка "hello" пишется не в сам файл /dev/my_driver, а в некий буфер, который нам предоставляет ядро. Так-же с функциями open, read и тд., они не открывают сам файл, а просто сигнализируют, что надо создать и открыть некий файл или прочитать данные. 2) Это обычный файл, в который мы записываем данные и читаем их оттуда же. При той же команде echo "hello" > /dev/my_driver, строка "hello" запишется непосредственно в файл /dev/my_driver.
Ответы
Ответ 1
tl;dr Правильный вариант, скорее, — (1); чтение/запись обрабатывается непосредственно драйвером устройства, промежуточного буфера может и не быть (хотя обычно он есть в пространстве ядра). Что вообще происходит при вызовах open()/read() итд? При системном вызове open() в массив файловых дескрипторов (current->files->fdt->fd), связанный со структурой текущего работающего процесса (current), помещается новая запись (struct fd), которая содержит структуру отождествляемую с открытым файлом (struct file). При этом в поле данной структуры f_op записывается набор операций, которые можно делать с данным файлом (struct file_operations). В итоге вызов open() просто возвращает номер новой выделенной записи в вышеупомянутом массиве. Вызов read() по сути просто достаёт файловых дескриптор из массива с помощью fdgetpos(), проверяет права доступа на чтение/запись и вызывает уже заданную связанную с файлом операцию чтения. Аналогично работают и все прочие вызовы — write/mmap/ioctl итп. Так чем же отличается чтение из обычного файла и из файла-устройства? По сути ни чем: единственное различие в том, что набор операций (struct files_struct) при открытии берётся не от драйвера файловой системы, а от драйвера устройства. Аналогичным образом реализованы и файлы в псевдо-файловых-cистемах /proc и /sys.Ответ 2
Если говорить о файлах устройств (есть ещё и другие псевдофайлы), то отличие их от обычных ("регулярных") файлов заключается в том, что: регулярные файлы существуют в физической реальности. После записи байта в такой файл мы можем найти место в физическом мире, где этот байт лежит. псевдофайлы (в том числе и файлы устройств) физически не существуют. После записи байта в файл /dev/ttys0 этот байт не присутствует нигде в реальном мире. Совершенно аналогичная ситуация с псевдофайлами из каталогов /proc, /sys и т.д. Запись в эти файлы (при наличии прав доступа) приводит к измению поведения ОС, а вовсе не к тому, что записанный (якобы) байт где-то сохранился. Несколько особая ситуация с псевдофайлами устройств дисковых накопителей. Хотя для /dev/sda1 можно выполнять операции чтения/записи, вот только результат будет довольно неожиданный, так как операции ввода/вывода будут выполняться не с файлами (расположенными ВНУТРИ диска), а с блоками, образующими ФС этого диска. Совершенно особая песня - псевдофайлы сетевых карточек, разделяемой памяти и т.д. которые используются исключительно для управления этими устройствами, а операции ввода/вывода выполняются специальными IOCTL командами, образующими систему сокетов. Короче - это всё сложная и большая тема.
Комментариев нет:
Отправить комментарий