2013-03-26 2 views
1

Как я могу реализовать собственный дескриптор файла? Скажите, есть ли у меня модуль ядра, контролирующий некоторые аппаратные средства, и я хочу показать возможность взаимодействия с этим оборудованием в пользовательском пространстве с помощью read() и write(). Не хотите использовать методы IOCTL или netlink или другие методы userpace-kernelspace. Нужно ли мне перекомпилировать ядро, или я могу это сделать, просто написав модуль ядра.Реализация дескриптора файла

Я понимаю, что для создания файлового дескриптора потребуется механизм для использования пользователем пространства kernelspace для создания записи в структуре файлов задачи (т.е. функция, эквивалентная функции open(), eventfd() timerfd(), socket()). То, что я могу реализовать через IOCTL (так что мне не придется перекомпилировать ядро), но как мне взломать в read() и write() - я уже исправил их с помощью LD_PRELOAD, это единственный способ? Не хочу перекомпилировать ядро!

ответ

0

Я не уверен, что понимаю все ваши вопросы. Тем не менее:

  • Вы можете определенно иметь это как модуль ядра;
  • вы, вероятно, хотите создать персональное устройство (вторая часть вашего вопроса);
  • для устройства char вы можете реализовать системные вызовы, которые вам нужны; если вы только хотите иметь read и write - никаких проблем;

Посмотрите на главу 3 (и другие) этого book.

0

konrad.kruczynski - это правильно!

использовать персональное устройство как механизм пользовательского пространства для связи с вашим оборудованием и создать устройство в/dev файловой системе, например/dev/hardware_type_A.

затем скомпилируйте & & Загрузите модуль в ядро, тогда, если весь ваш код будет хорош, тогда ядро ​​создаст символьное устройство в/dev/с именем/dev/hardware_type_A.

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

Если вы действительно говорите, что не хотите контролировать его через ioctl, тогда вам нужен новый протокол, который отправляет данные с помощью записи, и ваш драйвер распаковывает эти данные и управляет оборудованием от имени вашей программы у пользователя.

+0

Благодарим вас за ответ, @ konrad.kruczynski & John. В настоящее время символьное устройство/ioctl - это способ, которым я реализовал связь между пользовательским пространством и ядерным пространством. Я передаю указатели на структуры данных в KS, используя ioctl, и модуль стороны ядра извлекает данные из этой структуры. Но мне нужна сущность в пользовательском пространстве, на котором я могу использовать select(). Мне нужен способ сигнализировать США, когда происходит событие со стороны ядра. Я знаю, что есть другие способы отправки сигналов в США, но есть ли способ, которым США могут ждать, используя select()? могу ли я использовать select() с символьным устройством? – lithiumhead

+0

Это действительно возможно с помощью ядра apis. см. linux/poll.h, когда запрос поступает из пользовательского пространства, добавьте его в waitqueue и разбудите, если у вас есть данные из драйвера. найдите wake_up_interruptible в папке drivers/char/в источниках ядра. это в конечном итоге улучшает ваш водитель, а также сокращает использование процессора в ожидании ... – John

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