Linux kernel: построение списка совместимости устройств для своего ядра
Опубликовано 30.01.2008
В предыдущей заметке был рассмотрен способ ручного определения совместимости драйвера с железом. Однако в случае, когда необходимо получить список полный всех устройств, с которым может работать наше многажды пропатченное и перекроенное ядро, лазить руками по каждому драйверу и смотреть, какие PCI и USB ids в него зашиты, очень неудобно.
На наше счастье, кое-кто (итальянец Giacomo Catenazzi) уже озаботился этой проблемой и в какой-то степени её решил. Встречайте: Linux Kernel Driver Database (LKDDb). Основная цель этого проекта, цитирую: «попытка построения понятной пользователю базы данных устройств и протоколов, известных ядру linux. База данных включает в себя цифровые идентификаторы железа, опции конфигурации ядра, необходимые для включения модуля в ядро, и названия модулей, получающихся на выходе. База составляется на основе исходников ядра и поэтому всегда актуальна»
На сайте представлен пример того, что получается в результате работы этого скрипта. Для каждой опции ядра указывается, поддержка каких PCI IDs добавляется в систему с включением этой опции, как называется результирующий модуль и от какой опции зависит. Например, вот страница, посвящённая упоминавшемуся в прошлой заметке драйверу sata_nv.
Но нас в первую очередь интересует собственно база данных, lkddb.list – текстовый файл относительно простого для парсинга формата, на основе которого и строится работа программы. Разобраться в формате не составляет никакого труда. Приведу лишь пример записей для неоднократно здесь упоминавшегося драйвера sata_nv:
lkddb module libata "NVIDIA SATA support" :: CONFIG_SCSI_SATA_NV :: drivers/scsi/Kconfig
lkddb module sata_nv "NVIDIA SATA support" :: CONFIG_SCSI_SATA_NV :: drivers/scsi/Kconfig
lkddb pci 10de .... .... .... 0101.. :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de .... .... .... 0104.. :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 0036 .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 003e .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 0054 .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 0055 .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 008e .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 00e3 .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 00ee .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 0266 .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 0267 .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 037e .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
lkddb pci 10de 037f .... .... ...... :: CONFIG_SCSI_SATA_NV CONFIG_SCSI :: drivers/scsi/sata_nv.c
Все строки в этом файле начинаются с lkddb; далее следует тип записи: pci
, usb
, ieee1394
, eisa
, pcmcia
и т.д. для устройств, i2c
, platform
, fs
или module
для различной информации, связанной с самим ядром. Далее для pci-устройств идут device id, vendor id, device class; затем, через разделитель «::», опция ядра, которую нужно включить для того, чтобы данный модуль скомпилировался, а также опции, от которой зависит данная опция; и, наконец, файл, в котором был найден данный pci id.
lkddb.list
может быть сгенерирован с помощью генератора, который, собственно, и является ядром программы. Нужно скачать последнюю версию, распаковать, указать в Makefile путь к исходникам своего ядра; для экономии 500 килобайт трафика можно в этот же каталог скопировать из /usr/share/hwdata
файлы pci.ids
и usb.ids
, после чего выполнить команду make откинуться на спинку кресла и подождать две-три минуты, пока парсятся немаленькие исходники и генерируется БД. Возможно, потребуется еще кое-что подпилить напильником, в зависимости от ситуации.
После дюжины экранов отладочных сообщений будет создан нужный нам файл lkddb.list
и, в качестве бонуса, около 35 мегабайт описаний модулей в формате HTML в папке web-lkddb
. До создания HCL остаётся полтора шага, не составляющих проблемы для знакомых с основами shell-программирования — из конфигурационного файла ядра нужно извлечь список всех включённых опций и для каждой скопировать информацию из lkddb.list
, попутно преобразовав PCI ID устройства (в процессе работы скриптов преобразованного в более читаемую форму) к человекочитаемому виду.
Спасибо! Полезная информация
Понравился дизайн вашего блога и его статьи! Пишите еще. Подписался на вашу rss-ленту.
С уважением, Василий. Удачи!
Интересная статейка