sysfs_create_group(): Куда звонить?

в настоящее время я пишу модуль драйвера, который предлагает некоторые записи в файле sysfs. Я много читал в дереве исходников драйверов и в Интернете. Я нашел два подхода, в которых вызывается sysfs_create_group():

а) чаще всего: в функции probe() драйвера. Как советовали здесь Как прикрепить файловые операции к sysfs атрибут в драйвере платформы?

Случайная вещь, на которую я посмотрел: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/rtc/rtc-ds1307.c#n1580

б) В структуре драйвера. http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/

Я знаю, Грег К. Х. — очень известный разработчик. Поэтому я попытался последовать его совету. В функциях bla_show()/bla_store() я пытался получить личные данные моего драйвера, но мои printk() показывали совсем другие адреса, чем я напечатал в функции probe(). Мои личные данные (ноль). Что неправильно.

Когда я использую подход а), он работает, как и ожидалось, но, как предполагает Грег К. Х., это тоже неправильно. Я часто вижу это в стабильном дереве в разных драйверах. Грег пишет, пользовательское пространство уже получило уведомление о наличии нового устройства, но в книге LDD3 указано, что функция зонда предназначена для определения наличия устройства.

Подводя итог моего вопроса:

  1. Зачем уведомлять об этом пространство пользователя, даже если ядро ​​​​не знает, сможет ли оно справиться с этим?
  2. Где правильно вызывать sysfs_create_group()? Это а) или б)?

LDD3: https://static.lwn.net/images/pdf/LDD3/ch14.pdf PDF стр. 24

probe — это функция, вызываемая для запроса существования определенного устройства (и может ли этот драйвер работать с ним), remove вызывается, когда устройство удаляется из системы, а shutdown вызывается во время выключения, чтобы приостановить работу устройства.

Я еще больше запутался, чем раньше.....

С наилучшими пожеланиями Георг


person schorsch_76    schedule 15.06.2016    source источник


Ответы (1)


Драйвер устройства — это программа, управляющая определенным типом устройства, подключенного к вашему компьютеру.

Устройства платформы по своей природе не поддаются обнаружению, т. е. аппаратное обеспечение не может сказать "Эй! Я присутствую!" к программному обеспечению. Поэтому для таких устройств нам нужен драйвер, который называется Драйверы платформы. Драйверы предоставляют методы probe() и remove().

 struct platform_driver {
   int (*probe)(struct platform_device *);
   int (*remove)(struct platform_device *);
   .
   .
   struct device_driver driver;// this file has 2 parameter name or    owner.
 };

probe() обычно должен проверять, действительно ли аппаратное обеспечение указанного устройства существует. Сначала мы регистрируем наш драйвер. Как только он найдет устройство, он вызовет пробу драйвера. Он использует имя для поиска устройства.


Ответ: ваше устройство доступно, тогда вам нужна запись sysfs для связи (в пространство пользователя). поэтому концептуально вам нужно определить запись sysfs в файле probe.

sys_notify для вашего атрибута, и это вызовет пробуждение кода пользовательского пространства. Он сработает, когда sysfs будет доступен для пользовательского пространства. Это просто избегает блокирующего вызова. Когда ядро ​​не имеет sysfs, оно не будет уведомлять пользовательское пространство.

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

person Arvind Yadav    schedule 15.06.2016