Индексирование и поиск каталога

Минимальный reg+ interruptпример с виртуальным устройством QEMU

Как говорили другие, дерево устройств предоставляется поставщиками оборудования и сообщает ядру Linux, как взаимодействовать с устройствами.

Возможно, две наиболее важные части информации, которые нужны ядру Linux, это:

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

В нашем примере к дереву устройств versatilepbбудет добавлен следующий узел дерева устройств, который QEMU будет использовать из-за-M versatilepb:

lkmc_platform_device@101e9000 {
    compatible = "lkmc_platform_device";
    reg = <0x101e9000 0x1000>;
    interrupts = <18>;
    interrupt-controller;
    #interrupt-cells = <2>;
    clocks = <&pclk>;
    clock-names = "apb_pclk";
    lkmc-asdf = <0x12345678>;
};

Затем, используя модуль ядра Linux для взаимодействия с устройством, мы протестируем следующие функции DTS:

  • регистрирует адреса
  • IRQ
  • чтение пользовательских свойств из драйвера

Это основные компоненты примера:

  • Универсальный Linux .dtsПатч для форка Linux
    • regи interruptжестко соответствуют числам -, закодированным в универсальной машине QEMU (, которая представляет SoC)
    • compatibleсоответствует platform_driver.nameв модуле ядра и сообщает ядру, какой модуль будет обрабатывать это устройство
    • мы также передаем пользовательское свойство драйверу :lkmc-asdf = <0x12345678>;,который читается сof_property_read_u32
    • дерево устройств передается в прошивку QEMU с аргументом -dtb
  • Вилка QEMU :
  • модуль ядра Записывает в память на зонде для проверки, что также генерирует IRQ.

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

Дополнительные ресурсы:

1
23.04.2018, 20:08
1 ответ

За исключением требования «автоматическое обнаружение изменений в файлах», это можно сделать с помощью GNU id -utils . Это предоставляет инструмент под названием mkid, который создает двоичный файл базы данных с именем ID, который используется инструментом запросов lidи другими.

Id -utils предназначен для программирования; он распознает типы файлов по суффиксам в соответствии с настраиваемым файлом id-lang.map. Для каждого типа, который он поддерживает, у него есть отдельный сканер, чтобы токены из файла правильно обрабатывались. Существует резервный сканер для текстовых файлов, который mkidиспользует, как мне кажется, в качестве резервного для нераспознанных типов файлов. Я думаю, что если вы направите mkidна пустой id-lang.mapфайл, который пуст, он будет использовать текстовый сканер для всего.

mkidдостаточно быстро индексирует деревья, а запросы выполняются молниеносно.

Я интегрировал его с Vim для просмотра исходного кода; это удобнее, чем использование отдельного инструмента, такого как cscope. С этими двумя настройками:

:set grepprg=lid\ --regex\ --result=grep\ '$*'\ \\\|\ sort\ -u\ -t\ :\ -k\ 1,1\ -k\ 2,2n
:set grepformat=%f:%l:%m

Я могу использовать базу данных идентификаторов в качестве основы для команды Vim :grep. Например. :grep fooвыводит список всех местоположений, где находится foo.

Шаг sortв приведенном выше определении grepprgнеобходим, потому что lidвыводит совпадения в забавном порядке. Это делает внутреннее хеширование или что-то в этом роде.

0
20.08.2021, 20:06

Теги

Похожие вопросы