LINUX.ORG.RU

devfs или sysfs ?


0

0

Пишу драйвер для PCI-устройства, использую ядро 2.4.9-13. Как все-таки создавать(регистрировать) файлы устройств для всех обнаруженных моих железок (а их может быть не одна) - при помощи devfs, sysfs или еще как-то? С какой версии ядра в нем перестал существовать devfs? Только не говорите, что я должен вызывать mknode - для PnP устройств это не спортивно.


Насколько я знаю, у меня в 2.4.21 devfs стоит как EXPERIMENTAL, так что скорее всего в 2.4.9 его и нету поэтому. Тебе надо скорее всего юзать devfs, потому что sysfs - это новое представление устройств как на соляре. Это не то, что тебе надо. Если я не прав, поправьте меня. Я не использовал devfs, просто мне так логически кажется, что надо использовать именно её. Ну а вообще ты бы заглянул в /dev ... Там ребята вовсе не думают, что спортивно, а что нет ... в Linux это нормально :) Тем более, что у тебя PCI разьёмов то штук 5-7 максимум. 5 файлов не повредит каталогу /dev.

anonymous
()
Ответ на: комментарий от anonymous

Я бы с радостью использовал devfs, но при вызове

h = devfs_register(NULL,devName,DEVFS_FL_AUTO_DEVNUM,0,0,S_IFCHR | RUGO | S_IWUGO,&mppa_fops,NULL);

в /dev мое устойство не создается, а h == NULL.

Если ставлю проверку типа

#ifndef CONFIG_DEVFS_FS #error "This driver needs devfs support to be available" #endif

то при компиляции ругается. Правда сейчас использую ядро 2.4.18-3. Может быть такое, что в 2.4.18 devfs уже нет, а в 2.4.9 еще есть?

А насчет неспортивных вызовов mknode - на целевой машине могут гроздями висеть PCI расширители, а на них мои железки (это устройства сбора информации). Заставлять заказчика всякий раз при изменении конфигурации вызывать mknode - он не за это деньги платит:-)). Я так понимаю, что если есть поддержка PnP модулей (a la PCI), должен быть культурный способ автоматизированно создавать (и удалять) необходимое количество устройств в /dev. Или я не прав?

snilga
() автор топика
Ответ на: комментарий от anonymous

Я ставил ядро 2.4.18 сместе с дистрибутивом Red Hat Linux 7.3. Что-то не припомню, чтобы кто-то мне предлагал включать поддержку devfs. Вообще раньше с Linux-ом не сталкивался, но есть опыт разработки драйверов под Windows, Solaris, QNX - сердцем чую, что идеология в Linux не отличается оот скажем Solaris:-)). Есть ли способ проверить, включена ли поддержка devfs при установки ядра? Если бы я ставил ядро скажем из rpm - мог бы я как-то включить поддержку devfs?

snilga
() автор топика
Ответ на: комментарий от snilga

Ты просто не включил поддержку devfs. Это точно. По умолчанию она
всегда выключена, так как это экспериментальная фича. Так что смело
можешь достать исходники ядра из дистриба и делать:
make xconfig dep clean bzImage modules modules_install install
Не забудь всё правильно выбрать. Хотя если ты этого никогда не делал,
то готовься несколько раз компилить ядро (не знаю, смог ли кто в первый
раз его правильно откомпилить, не забыв предварительно всё нужное
выбрать в конфиге:)
Во всех выше перечисленных системах ядро вроде не надо компилить и
конфигурировать, как в линухе. Поэтому тебе и кажется, что там всё
должно быть включено и выбрано :)

anonymous
()
Ответ на: комментарий от snilga

Да, и ещё ... готовься, что система может просто не обнаружить твой
раздел \, так как скорее всего теперь будет новый способ задания
устройств. Читай Documentation/filesystems/devfs/...
По крайней мере у меня ядро не могло найти корневую систему после
включения этой фичи. Ведь в этом то и весь смысл - по-другому задавать
имена устройств. Ну там в ридми всё написано по этому поводу.
Я не знаю, что ты будешь больше ругать после всего этого:
mknod или devfs .... :) 

anonymous
()
Ответ на: комментарий от anonymous

Ну допустим, пересоберу я свое ядро с поддержкой devfs, а где гарантия, что у коенечного пользователя моего драйвера ядро собрано со включенной поддержкой devfs? Что-то мне эта идея с devfs все меньше нравится... А есть какое-нибудь более гибкое решение, кроме mknode, чтобы PnP все-таки остался PnP без костылей?

snilga
() автор топика
Ответ на: комментарий от snilga

А ты займись кросплатформенным программированием.
Проверь
Включено devfs, ага юзам библу devxxx.so
Не включено, ага тут все не спортивно но юзаем mknod.so

А можно это определить на моенте компиляции проги и сразу вкомпилять нужный код в прогу. Без юзанья либ.

А можно, а хз что еще можно :-)

anonymous
()

А зачем вообще их создавать?

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

Пусть девайс будет один, и пусть он реализует
два дополнительных ioctl'а: GET_NUMBER_OF_MY_DEVICES
и ATTACH_TO_DEVICE_BY_NUM. Надеюсь, по именам ясно,
что они должны делать :)

А devfs сильно не рекомендую.

idle ★★★★★
()
Ответ на: комментарий от idle

Да не хочется как-то придумывать не существующих сущностей. Придется наверное все таки использовать mknode. А что там насчет библиотеки mknode.so - что, правда такая есть, и можно ли вызывать mknode прямо из драйвера?

snilga
() автор топика
Ответ на: комментарий от anonymous

>Насколько я знаю, у меня в 2.4.21 devfs стоит как EXPERIMENTAL, так что скорее всего в 2.4.9 его и нету поэтому.

devfs есть во всей серии 2.4.x начиная с 2.4.0, проблема в том, что в шапке его поддержка может быть отключена по умолчанию

>sysfs - это новое представление устройств как на соляре.

оно появилось в Linux начиная с 2.6

Reset ★★★★★
()
Ответ на: комментарий от anonymous

>так как скорее всего теперь будет новый способ задания устройств.

чтобы этого избежать есть devfsd демон, который ссылки расставляет

Reset ★★★★★
()
Ответ на: комментарий от Reset

Так ещё надо умудриться запустить систему, а потом уже настраивать этот devfsd. Но на этот счёт вроде был параметр ядра nodevfs ... вроде так :)

anonymous
()
Ответ на: комментарий от anonymous

А что возвращает sys_mknode и можно ли потом эти nodes удалить, когда драйвер выгружается например?

snilga
() автор топика

Понимаю твои проблемы...
чтобы зря время не терять сразу адресую к двум статьям, которые наверняка тебе помогут:
1. udev - A Userspace Implementation of devfs. Greg Kroah-Hartman, IBM corp., Linux Technology center.
2. libsysfs - a programming interface to gather device information in Linux. Ananth N. Mavinakayanahalli and Daniel Stekloff, IBM corp., Linux Technology center.

Обе имеют достаточно подробный ссылочный материал.
Желаю удачи.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.