LINUX.ORG.RU

Порядок поключения устройства

 ,


0

1

Доброго времени суток всем!

Я в Линуксе совсем еще зеленый, а взялся ковырять довольно скольскую тему run-from-RAM - попутно вскрывая для себя все новые и новые пласты знания об устройстве системы с самого низа.

Сейчас немного завяз в устройствах (в разрезе моей задачи - на собранных разными способами initramfs то виден, то не виден оптический привод).

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

Итак. Когда мы имеем устройство, физически подключенное к какому то слоту в ПК, его сперва распознает (сам факт подключения) либо ядро как таковое, либо один из его модулей. Факт подключения можно выяснить одной из многочисленных команд типа lspci, hw, lsusb, hwinfo и иже с ними. Если поддержка устройства есть прямо в ядре - мы его сразу должны увидеть в выдаче, если в выдаче его нет - нужно выяснять, каким модулем оно распознается - для этого есть инструментарий lsmod (можно запустить его на системе, в которой устройство успешно работает и посмотреть - эвристически подобрав название, разумеется - название его модуля), а также modinfo, insmod и modprobe.

Соответственно, когда мы нашли недостающий модуль - тупо можно скопировать его в каталог /lib/modules (или в /lib64/modules? Как правильно, если система amd64?), а затем загрузить любой из двух команд:

modprobe ИМЯМОДУЛЯ
или
insmod ПУТЬКМОДУЛЮ
Насколько я понимаю, первая команда предпочтительнее, ибо грузит и все модули, от которых зависит требуемый.

Любой модуль должен строго соответствовать своему ядру, поэтому при трансплантации модулей из системы в систему это надо учитывать))

Когда устройство появляется в выдаче, необходимо сопоставить ему соответствующий файл в вФС /dev - для этого существует некий udev - он переводит работу с устройствами на более высокий уровень абстракции, создавая файлы устройств на основе информации о физически подключенном оборудовании, которую поставляет ему ядро/модули ядра.

Чтобы вызвать udev мы при старте системы должны смонтировать вФС типа devtmpfs:

mount -t devtmpfs udev /dev

А если при ее монтировании нужный для конкретного устройства модуль ядра не был загружен - то устройство придется создавать в ручную - по сути руками делать то, что udev делает как скрипт:

mknod /dev/КАКНАЗОВЕМФАЙЛУСТРОЙСТВА b или с ОСН.НОМЕР ВТ.НОМЕР
где b или c - блочное создаем устройство или символьное.

Ну вот как то так я все это понял. Рад буду замечаниям и поправкам.

С точки зрения кодовой базы в ядре, работа с драйверами выполняется на основе структуры, которая в общем виде называется так

static struct device_driver eepro100_driver

Она включает массив идентификаторов
Далее создается дочерний от нее обьект - еще одна конскретная структура

struct pci_driver

При старте операционной системы происходит регистрация

int driver_register(struct device_driver *drv);

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

int driver_for_each_dev(...)

К одному драйверу может быть подключено несколько устройств
В кталоге

/sys/devices

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

int (*probe) (struct device *dev);

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

Драйверы устройств могут экспортировать атрибуты через свои каталоги sysfs. Драйверы могут объявлять атрибуты с помощью макросов DRIVER_ATTR_RW и DRIVER_ATTR_RO

struct driver_attribute {
struct attribute attr;
ssize_t (*show)(struct device_driver *driver, char *buf);
ssize_t (*store)(struct device_driver *, const char *buf, size_t count);
};

DRIVER_ATTR_RW(debug);

kto_tama ★★★★★
()

модули (вместе с modules.dep) уже лежат в /lib/modules - зачем и откуда их туда копировать?

а если у вас модули в другом месте - то insmod их подгружает откуда угодно.

вообще - при появлении устройства дергается хотплаг скрипт которому передается инфа об устройстве в окружении. и обычно он просто выполняет modprobe по modalias-у. modprobe ищет модуль по modules.alias, и загружает его со всеми зависимостями из modules.dep

вообще - те драйвера, что будут использоваться на подавляющем большинстве платформ, лучше линковать в ядро. меньше места будут занимать в итоге…

NiTr0 ★★★★★
()
Последнее исправление: NiTr0 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.