Ядро Linux: поиск всех драйверов, доступных через системные вызовы

Я сравниваю основной исходный код ядра Linux с модифицированной копией того же источника, в которую добавлено много драйверов. Небольшая предыстория: этот модифицированный исходный код является исходным кодом ядра Android, он содержит множество драйверов, добавленных поставщиком, производителем SoC, Google и т. Д.

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

Например, драйверы устройств char представляют интерес, поскольку я мог бы выполнять с ними некоторые системные вызовы openat, read, write, ioctl и close, если есть соответствующий файл устройства. Чтобы найти новые драйверы символьных устройств, я мог сначала найти все новые файлы в дереве исходных текстов, а затем выполнить grep для поиска struct file_operations. Но что еще мне нужно искать, кроме драйверов char?

Я знаю, что упомянутые выше системные вызовы выполняют своего рода переадресацию на соответствующий драйвер устройства, связанный с файлом. Но существуют ли другие системные вызовы, которые выполняют такую ​​пересылку? Думаю, мне нужно сосредоточиться на всех этих системных вызовах, верно?

Есть ли что-то, что я могу найти в исходных файлах, что указывает на то, что системные вызовы могут вести туда? Как мне это сделать, чтобы найти все эти драйверы?


Обновление (сужение):

  • Я нацелен на определенные устройства (например, Huawei P20 Lite), поэтому знаю соответствующую архитектуру и оборудование. Но ради этого вопроса мы можем просто предположить, что оборудование для любого драйвера присутствует. В моем случае не имеет особого значения, вызвал ли я драйвер, а он сообщил, что соответствующего оборудования нет, если я могу вызвать драйвер.
  • Я ищу только драйверы, доступные напрямую через системные вызовы. Под прямой доступностью я подразумеваю драйверы, разработанные так, чтобы иметь некоторый интерфейс системных вызовов с пользовательским пространством. Да, системные вызовы, не нацеленные на определенный драйвер, могут по-прежнему косвенно запускать код в этом драйвере, но этими косвенными эффектами можно пренебречь.
  • Возможно, кое-что проясняет мою цель: я хочу провести фазз-тестирование найденных драйверов с помощью Syzkaller. Для этого я бы создал описания системных вызовов, которые можно использовать для фаззинга каждого драйвера, анализируемого Syzkaller.

person onetyone    schedule 07.07.2020    source источник


Ответы (1)


Я почти уверен, что программно сделать это невозможно. Любая попытка сделать это натолкнется на пару проблем:

  • Драйверы, которые вызываются в данном случае, зависят от оборудования. Например, на моем ноутбуке драйвер iwlwifi будет доступен через сетевые системные вызовы, но на сервере этот драйвер не будет использоваться.
  • Практически любой код, загруженный в ядро, доступен с помощью некоторого системного вызова, если присутствует оборудование. Драйверы взаимодействуют с оборудованием, которое, в свою очередь, взаимодействует с пользователями, внешними устройствами или сетями, и все эти операции доступны с помощью системных вызовов. Люди не пишут драйверы, которые ничего не делают.
  • Даже драйверы, к которым системный вызов не может получить прямой доступ, могут повлиять на выполнение. Например, драйвер для истинного ГСЧ мог бы влиять на выполнение, изменяя поведение системного ГСЧ, даже если он не был доступен /dev/hwrng.

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

Извините за плохие новости.

person bk2204    schedule 08.07.2020
comment
Спасибо, я понимаю вашу точку зрения. Я думаю, что пропустил некоторые важные аспекты, которые сужают мою проблему, поэтому я обновил свой вопрос. Есть ли способ решить эту проблему в обновленных условиях? - person onetyone; 08.07.2020