[ Content | View menu ]

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 устройства (в процессе работы скриптов преобразованного в более читаемую форму) к человекочитаемому виду.

Следите за обновлениями :)

«
»

3 комментария

Write a comment - TrackBack - RSS Comments

  1. Comment by WW:

    Спасибо! Полезная информация

    31.01.2008 @ 11:56
  2. Comment by Василий:

    Понравился дизайн вашего блога и его статьи! Пишите еще. Подписался на вашу rss-ленту.
    С уважением, Василий. Удачи!

    04.02.2008 @ 11:33
  3. Comment by Stanny:

    Интересная статейка

    10.02.2008 @ 03:15
Write comment

Я не робот.