Статья «Использование NetBSD с процессорами Marvell Kirkwood»

В статье представлен обзор операционной системы NetBSD и её отличий от других систем семейства. Кратко рассмотрена реализация и конфигурация драйверов устройств. Приведён пример использования ОС на мини-сервере IP-Plug в качестве альтернативы Linux. Операционная система NetBSD является представителем BSD-семейства наравне с OpenBSD и FreeBSD.

Изначально BSD (акроним от Berkeley Software Distribution) был совокупно стью патчей и утилит для Bell’s Labs Unix, которая развилась в самостоятельную систему. Исходный код имел две лицензии: Bell (т.к. компании принадлежала бóльшая часть изначального кода) и собственную BSD. Со временем команда разработчиков BSD распалась, и развитие проекта продолжилось в новой инкарнации в качестве порта на архитектуру i386 — 386BSD. Впоследствии BSD-семейство разделилось на три ветви: NetBSD, OpenBSD и FreeBSD. Каждая из трёх систем по-своему уникальна, но все они имеют много общего. Основным отличием NetBSD является кросс-платформенность. Девиз разработчиков: «Конечно, на этом можно запустить NetBSD». Заявлена реализация 53 архитектур, и количество поддерживаемых машин продолжает расти. При этом система остаётся такой же безопасной и производительной, как и её «родственники» OpenBSD и FreeBSD. Первый официальный релиз NetBSD состоялся в апреле 1993 г. под номером версии 0.8. Актуальной на сегодняшний день является версия 6.0.1.

Отдельно необходимо упомянуть преимущества BSD-лицензии. В отличие от Linux GPL, лицензия BSD позволяет каким угодно образом модифицировать исходный код, менять имена файлов и распространять конечный продукт, лишь указав имя автора оригинала.

Исходные коды NetBSD доступны через FTP-сервер в виде tar-архивов либо iso-образов. Также можно получить любую версию системы из cvs репозитория, сославшись на метку релиза. Дерево исходных кодов содержит в себе код ядра (директория sys), утилит (bin, usr.bin, sbin, usr, usr.sbin, gnu), кросс-компилятора (tools), скрипт для сборки build.sh и необходимые библиотеки и документацию.

Процесс компиляции системы включает в себя следующие этапы:

  • Сборка набора инструментов (toolchain) для целевой архитектуры — вызов скрипта build.sh с параметром tools. Инструментарий включает в себя as, binutils, gcc, m4, yacc и др. Все поддерживаемые архитектуры можно увидеть в директории sys/arch.
  • Сборка ядра на основе указанной конфигурации.
  • Сборка системных утилит и формирование корневой файловой системы — вызов скрипта build.sh с параметром distribution.

Рассмотрим процесс сборки системы на примере plug-компьютера IP-Plug (см. рис. 1). Этот многофункциональный мини-сервер был раз работан инженерами дизайн-центра электроники Promwad по заказу компании «АК-Системс» и предназначен для решения широкого спектра задач в IP-сетях, может выполнять функции компьютера или сервера. IP-Plug работает от сети 220 В, отличается низким энергопотреблением и малыми размерами (сопоставим с габаритами зарядного устройства для мобильного телефона).

Это устройство применяется для измерений параметров вычислительной сети, хранения и передачи данных, маршрутизации. Кроме того, оно может использоваться в качестве точки доступа WiFi, файл-сервера, DLNA-сервера. Расширение спектра задач компьютера реализуется за счёт модификации программного обеспечения. Основные технические характеристики мини-сервера IP-Plug представлены ниже.

В IP-Plug используется процессор компании Marvell 88F6282 серии Kirkwood архитектуры ARMv5TE. Его поддержка добавлена в дистрибутив NetBSD с июля 2012 г. и представлена файлами в директории sys/arch/evbarm/ marvell:

  • marvell_start.S — низкоуровневая инициализация ядра: инициализация MMU, передача параметров загрузки высокоуровневому коду;
  • marvell_machdep.c содержит основной код инициализации ARM-ядра, периферии (в т.ч. загрузочной консоли), построения таблицы страниц и релокации ядра;
  • marvellreg.h и marvellvar.h — константы адресов и размеров областей памяти, в которые отображаются регистры необходимой для загрузки периферии.

Драйверы конкретных периферийных устройств находятся в папке sys/ dev/marvell и компилируются в соответствии с конфигурацией ядра.

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

Для работы с различными устройствами в ядре используется HAL, базирующийся на абстракциях uvm/pmap (виртуальная память), bus_space и bus_ dma. Многие популярные шины (ISA, PCI, PCI-E и др.) тоже абстрагированы, что повышает портируемость кода драйвера.

Все устройства в системе представлены в виде древовидной иерархической структуры, которая описана в файле ioconf.c (он генерируется из конфигурации ядра). Корневым элементом дерева является фиктивное устройство root, к которому подключаются все остальные. Для нашего процессора первым потомком root является системная шина, которая соединяет ARM-ядро и периферию (см. рис. 2).

mainbus0 at root # задаёт первую абстракцию “системная шина”

cpu0 at mainbus0 # подключает процессорное ядро

mvsoc0 at mainbus0 # и периферию

Например, реализация Ethernet-драйвера представлена файлами if_mvgbe.c, makphy.c и mii.c. Его конфигурация представляется деревом на рисунке 3 и имеет следующий вид:

mvgbec0 at mvsoc0 offset 0x70000 # контроллер первого интерфейса

mvgbec1 at mvsoc0 offset 0x74000 # контроллер второго интерфейса

mvgbe0 at mvgbec0 port 0 irq 11 # PHY0

mvgbe1 at mvgbec1 port 1 irq 15 # PHY1

makphy0 at mii0 phy 0

makphy1 at mii1 phy 1

Поскольку все устройства имеют универсальный интерфейс, то при старте ядра происходит обход дерева с последовательным вызовом функций attach/match для инициализации каждого из них. Таким образом, осуществляется конфигурирование системы (процесс под названием autoconf).

Отредактировав конфигурационный файл и собрав ядро, перейдём к следующему шагу.

Указав параметр distribution скрип ту build.sh, можно собрать полноценную корневую файловую систему со всеми системными утилитами. Но если указать цель release, то все програм мы будут сгруппированы в наборы и запакованы в соответствующие архивы (base, comp, etc, games, modules и др.). Распаковка только двух наборов base и etc позволяет получить минимальную корневую файловую систему. Поместив содержимое архивов на NFS-ресурс, можно сконфигурировать ядро NetBSD для подключения его в качестве rootfs. Для этого достаточно добавить в конфигурацию:

options NFS_BOOT_BOOTSTATIC

options NFS_BOOTSTATIC_MYIP=”\”192.168.10.10\””

options NFS_BOOTSTATIC_GWIP=”\”192.168.10.1\””

options NFS_BOOTSTATIC_MASK=”\”255.255.255.0\””

options NFS_BOOTSTATIC_SERVERADDR=”\”192.168.10.3.0\””

options NFS_BOOTSTATIC_SERVER=”\”:/export/rootfs\””

config netbsd root on mvgbe0 type nfs

Теперь собранное ядро будет автоматически монтировать указанный ресурс в качестве корневой файловой системы.

Изменяя устройство в строке config, можно производить подключение rootfs с любых поддерживаемых устройств. Если файловая система по каким-либо причинам не примонтиро валась, ядро попросит выбрать новое загрузочное устройство и тип файловой системы на нём в интерактивном режиме.

В NetBSD предусмотрена возможность установки как готовых пакетов, так и пакетов собственной сборки. Для установки бинарных пакетов достаточно выполнить команду pkg_add с указанием маски имени пакета. Архивы пакета и зависимостей скачиваются с FTP-сервера и распаковываются. Для получения информации об установленных пакетах можно использовать утилиту pkg_info. Для удаления — pkg_delete.

При сборке пакетов из исходных кодов необходимо скачать и распаковать архив pkgsrc, содержащий утилиту bmake и make-файлы пакетов, отсортированные по категориям. Список всех пакетов с их кратким описанием можно получить по команде make readme.

Полная инструкция по управлению пакетами находится в директории pkgsrc/doc.

Заключение

Высокая переносимость, достаточная простота, наличие всего необходимого пакета программ и открытый исходный код делают NetBSD очень привлекательной ОС для встраиваемых систем. Как видно из примера, понадобилось совсем неглубокое знание архитектуры системы, а также минимальные изменения в коде для запуска на IP-Plug. При этом функциональность и производительность собранной операционной системы не уступает Linux, которая используется по умолчанию.

Литература

  1. Описание устройства IP-Plug//]]>www.ak-systems.ru]]>.
  2. Официальный сайт проекта NetBSD//]]>www.netbsd.org]]>.
  3. CVS-репозиторий проекта NetBSD// ]]>http://cvsweb.netbsd.org]]>.
  4. Официальное руководство по сборке системы NetBSD//]]>www.netbsd.org]]>.
  5. Руководство по написанию драйверов NetBSD//]]>www.netbsd.org]]>.