в настоящее время я пишу модуль драйвера, который предлагает некоторые записи в файле 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 указано, что функция зонда предназначена для определения наличия устройства.
Подводя итог моего вопроса:
- Зачем уведомлять об этом пространство пользователя, даже если ядро не знает, сможет ли оно справиться с этим?
- Где правильно вызывать sysfs_create_group()? Это а) или б)?
LDD3: https://static.lwn.net/images/pdf/LDD3/ch14.pdf PDF стр. 24
probe — это функция, вызываемая для запроса существования определенного устройства (и может ли этот драйвер работать с ним), remove вызывается, когда устройство удаляется из системы, а shutdown вызывается во время выключения, чтобы приостановить работу устройства.
Я еще больше запутался, чем раньше.....
С наилучшими пожеланиями Георг