Я сравниваю основной исходный код ядра Linux с модифицированной копией того же источника, в которую добавлено много драйверов. Небольшая предыстория: этот модифицированный исходный код является исходным кодом ядра Android, он содержит множество драйверов, добавленных поставщиком, производителем SoC, Google и т. Д.
Я пытаюсь идентифицировать все драйверы, добавленные в измененный источник, которые доступны из пользовательского пространства через любые системные вызовы. Я ищу какой-нибудь систематический или идеально автоматический способ найти все это, чтобы избежать ручной работы.
Например, драйверы устройств char представляют интерес, поскольку я мог бы выполнять с ними некоторые системные вызовы openat
, read
, write
, ioctl
и close
, если есть соответствующий файл устройства. Чтобы найти новые драйверы символьных устройств, я мог сначала найти все новые файлы в дереве исходных текстов, а затем выполнить grep для поиска struct file_operations
. Но что еще мне нужно искать, кроме драйверов char?
Я знаю, что упомянутые выше системные вызовы выполняют своего рода переадресацию на соответствующий драйвер устройства, связанный с файлом. Но существуют ли другие системные вызовы, которые выполняют такую пересылку? Думаю, мне нужно сосредоточиться на всех этих системных вызовах, верно?
Есть ли что-то, что я могу найти в исходных файлах, что указывает на то, что системные вызовы могут вести туда? Как мне это сделать, чтобы найти все эти драйверы?
Обновление (сужение):
- Я нацелен на определенные устройства (например, Huawei P20 Lite), поэтому знаю соответствующую архитектуру и оборудование. Но ради этого вопроса мы можем просто предположить, что оборудование для любого драйвера присутствует. В моем случае не имеет особого значения, вызвал ли я драйвер, а он сообщил, что соответствующего оборудования нет, если я могу вызвать драйвер.
- Я ищу только драйверы, доступные напрямую через системные вызовы. Под прямой доступностью я подразумеваю драйверы, разработанные так, чтобы иметь некоторый интерфейс системных вызовов с пользовательским пространством. Да, системные вызовы, не нацеленные на определенный драйвер, могут по-прежнему косвенно запускать код в этом драйвере, но этими косвенными эффектами можно пренебречь.
- Возможно, кое-что проясняет мою цель: я хочу провести фазз-тестирование найденных драйверов с помощью Syzkaller. Для этого я бы создал описания системных вызовов, которые можно использовать для фаззинга каждого драйвера, анализируемого Syzkaller.