Что я конкретно хочу здесь узнать, так это то, как ядро Linux работает на всех разных ПК, независимо от базового оборудования.
Или вообще, как любое ядро (ядро NT от Microsoft, Mac OS и Linux) может работать на любом ПК независимо от конфигурации оборудования ПК.
Чтобы объяснить мои сомнения, вот сценарий: по сравнению с ПК-2, Bluetooth, клавиатура, Wi-Fi и т. д. ПК-1 имеют другую конфигурацию и разработаны другим производителем. Чтобы все это оборудование работало, я полагаю, что ядро должно иметь аппаратно-специфичный код для включения этого оборудования. Я полагаю, что в ядре есть уровень драйвера устройства, на котором оно должно включать это оборудование? Или оно просто загружает специфичную для устройства прошивку откуда-то еще? Где именно в ядре находится аппаратно-специфичный код? Также, проясняя свои сомнения, я наткнулся на HAL, BSP. Что это и где эти уровни находятся в ядре?
решение1
Что я конкретно хочу здесь узнать, так это то, как ядро Linux работает на всех разных компьютерах, независимо от базового оборудования.
Прежде всего, ядро может работать на любом ПК, если оно скомпилировано для этой конкретной архитектуры. С вашими компьютерами общего назначения архитектура, как правило, та же самая (x86_64/amd64), но это меняется, когда вы имеете дело со встроенными устройствами.
Дерево устройств
За исключением компиляции, само ядро не зависит от оборудования. Я даю вамдерево устройств!
Ядро Linux заботится о необнаруживаемом оборудовании через дерево устройств. Оно сообщает ядру информацию о процессоре, памяти, шинах, устройствах, подключенных через I2C, SPI и т. д. Вместо того, чтобы жестко закодировать схему устройства, ее можно изменить через дерево устройств. Это все действительно волшебно, когда вы это понимаете. Дерево устройств также сообщает ядру, какой драйвер оно должно использовать для определенного устройства через параметр compatible
.
Дерево устройств может храниться различными способами в зависимости от того, как было скомпилировано ядро, но обычно иерархию можно увидеть в /proc/device-tree
или /sys/firmware/devicetree/base
.
Для таких вещей, как USB-устройства, все это делается драйвером USB. Ядро содержит базовый код для управления такими вещами, как клавиатуры и мыши. Некоторые поставщики имеют собственные драйверы, которые затем поставляются вместе с устройством.
Модули
Для драйверов ядро Linux использует нечто, называемоемодули ядра. Все модули можно найти в /lib/modules
. Существует два типа модулей: загружаемые модули и встроенные модули. Вы можете просмотреть все загруженные модули с помощью команды lsmod
. Когда ядро находит определенное устройство в дереве устройств или даже когда вы подключаете устройство к периферийному устройству, оно будет искать модуль, который оно может загрузить для этого устройства, и этот модуль становится драйвером для этого устройства.
Хорошая вещь в загружаемых модулях заключается в том, что они сохраняют образ ядра меньше. Модули можно компилировать отдельно. Встроенные модули компилируются в ядро и, таким образом, увеличивают фактический размер образа. Вы также можете компилировать и загружать модули в ядро во время его работы, но это уже совсем другая тема.
БСП
Вы попадаете в BSP (Board Support Package), когда поставщик поставляет ядро и ряд определенных модулей для своего собственного оборудования (сюда входит процессор и подключенное оборудование). Иногда поставщики вносят изменения в существующие модули или поставляют пользовательские модули с ядром. Некоторые поставщики вносят изменения в само ядро, и весь этот пользовательский пакет становится BSP. Это часто происходит в мире встраиваемых систем.
ХЭЛ
HAL (Hardware Abstraction Layer) может быть синонимом BSP. Я не видел, чтобы он так уж часто использовался в мире Linux, но когда вы погружаетесь в микроконтроллеры, он используется довольно часто. По сути, HAL — это набор библиотек, используемых для доступа к оборудованию, что значительно упрощает взаимодействие с оборудованием. Например, в случае с чипом Wi-Fi он предоставит вам базовые процедуры для подключения к точке доступа, сканирования сети, создания точки доступа и т. д. В этом смысле он действует как драйвер.