Устройство с встроенным linux

А вы знали, что в основе ОС 85% смартфонов лежит Linux?

По факту на рынке смартфонов доминирующее положение занимают именно устройства на базе Linux. Некоторые от такого заявления призадумаются, другие же преисполнятся гордостью за Linux в стиле The Sound of Music – The Hills are Alive. Далее я приведу интересные факты, подтверждающие, что в основе 85% смартфонов действительно лежит ядро Linux, а также представлю ряд многообещающих новинок этого рынка.

Нередко в ходе общения с профессионалами вне рабочего пространства меня спрашивают: «Чем ты занимаешься?». Когда я отвечаю, что работаю системным аналитиком Linux, многие реагируют так: «А мне не особо нравится Linux, потому что в нем нельзя открывать или редактировать документы Word»* или «Ты имеешь ввиду ОС для настольных ПК, в которой все в виде текста, и отсутствует графический интерфейс?»** и даже так «Linux? Это что?». В ответ я обычно строю ехидную гримасу с вопросом…«А вы в курсе, что сами прямо сейчас используете смартфон, работающий на Linux?».

Да, на самом деле, как многие из вас знают, в основе дистрибутивов Android и Chrome OS изначально лежит ядро Linux.

Android-смартфоны работают на Linux

Как заявляют сами разработчики Google: «Android построен на открытом Linux Kernel» (ссылка содержит видео). Начиная с Android 11, эта ОС базируется на LTS-ядре (ядро с долгосрочной поддержкой) Linux, а именно его версиях 4.19 и 5.4.

Говоря конкретнее: «С 2019 года при каждом размещении Линусом Торвальдсом очередного релиза или пре-релиза главная ветка Linux сливается с главной веткой Android. До 2019 года ядра Android собирались путем клонирования свежего LTS-ядра и добавления в него Android-патчей. Новая модель взаимодействия позволяет избежать существенных усилий по переадресации портов и тестированию патчей Android, реализуя все это пошагово». — source.android.com

Есть очень информативное видео (правда в 240p), раскрывающее строение архитектуры Android, в котором инженер Google объясняет, что при использовании в основе Android архитектура ядра Linux дорабатывается. Есть и более свежее видео в лучшем качестве, которое отвечает на вопрос: «Действительно ли Android – это, по сути, Linux?». Глава подразделения открытых проектов Google, Крис ДиБона, описывает Android так: «Десктопная мечта Linux, ставшая реальностью».

Убедившись, что Android-смартфоны действительно работают на базе Linux, можно вкратце ознакомиться с данными некоторых исследований, а также узнать о новых перспективных моделях устройств и некотором сопутствующем ПО.

Исследования рынка

В ноябре 2020 года компания IDC опубликовала исследование, которое показало, что системы Android занимают лидирующее положение на рынке смартфонов. Согласно собранным данным, в течение последнего квартала было продано около 261.1 миллионов устройств, 85% из которых на базе Android.

По информации Gartner и Statista эта платформа на данный момент занимает 86% мирового рынка. Взгляните на график ниже, демонстрирующий двух основных игроков индустрии – Android и Apple iOS.

Многообещающие смартфоны на базе Linux

Если вас интересуют смартфоны на ядре Linux, то советую присмотреться к описываемым далее моделям, а также сопутствующему ПО.

Librem 5 – безопасность и конфиденциальность

Purism, известная по разработке ноутбуков с Linux, фокусирующихся на конфиденциальности и бесплатном ПО, успешно провела краудфандинговую кампанию для создания нового смартфона Librem 5. При этом разработчикам удалось собрать на 1 миллион долларов больше, чем планировалось.

Смартфон Librem 5 основан на Debian Linux и по умолчанию оснащен механическими выключателями оборудования, гарантирующими безопасность и конфиденциальность использования. В качестве операционной системы используется GNU/Linux с поддержкой бесплатного ПО. — puri.sm

Pinephone – власть пользователям

PinePhone – это смартфон от компании Pine64, разработавшей Pinebook Pro. Основной замысел состоит в предоставлении пользователю полного контроля над устройством. Обеспечивается это за счет использования мобильных ОС на базе стандартной Linux и оснащения корпуса 6 выключателями элементов оборудования, доступными под задней крышкой. В добавок к этому, конструкция собирается на винтах, что упрощает последующий ремонт и апгрейд. — pine64.org

F(x)tec Pro¹ – обладатель полноценной QWERTY клавиатуры

Pro1 – это сенсорный смартфон с выдвижной горизонтальной клавиатурой. Он разработан и производится компанией F(x)tec, базирующейся в Лондоне. Это устройство представляет собой более совершенную альтернативу клавиатуре Moto Mod Livermorium. На данный момент сообщество Pro1 уже помогло в разработке ОС на базе Linux, и вскоре также планируется поддержка Sailfish. – fxtec.com

Читайте также:  Действующий код активации windows

Ubuntu Touch для смартфонов и планшетов

Ubuntu Touch (ранее Ubuntu Phone) – это мобильная версия ОС Ubuntu, изначально разработанная компанией Canonical Ltd. Сейчас ее разработкой занимается сообщество UBports. Спроектирована она главным образом для сенсорных мобильных устройств, а именно смартфонов и планшетов. Эта платформа полностью независима и поддерживается исключительно сообществом.

Вот список устройств, находящихся на разной стадии поддержки этой ОС, в который также входит Fairphone 3. Более зрелые устройства позволяют удобную установку системы с помощью UBports. Для тех же, что находятся на ранней стадии поддержки, обычно установка делается вручную. – ubuntu-touch.io

Plasma Mobile – от создателей KDE Plasma

Plasma Mobile – это вариант Plasma для смартфонов. На данный момент она доступна для Nexus 5 и Nexus 5x, а также PinePhone и устройств, поддерживаемых postmarketOS. Работает Plasma Mobile на протоколе Wayland и при этом совместима с приложениями Ubuntu Touch. 1 декабря 2020 года KDE совместно с Pine64 анонсировали возможность предзаказа PinePhone – KDE Community Edition. – plasma-mobile.org

А какое ядро в вашем Android?

Для получения расширенного доступа к Linux потребуются рут-права, но ради чисто спортивного интереса предлагаю просто заглянуть в стандартную систему Android, чтобы узнать, какая у вас установлена версия Linux Kernel. В большинстве Android-смартфонов ее можно посмотреть в разделе Настройки –> Об устройстве (иногда нужно нажать на версию Android).

Если же рут-права у вас есть, то обычно можно установить “Termux”, после чего запустить его и ввести uname -a

В ответ команда вернет примерно такой вывод (на устройстве OnePlus):

Конечно же, рутованное устройство с доступом к терминалу обеспечивает много крутых возможностей. Например, с помощью top или htop можно отслеживать состояние приложений, а через командную строку устанавливать пакеты, удалять приложения, запускать службы и т.д.

Заключение

Армия андроидов продолжает захватывать рынок смартфонов. Главная причина в том, что в их основе лежит открытое ПО, дающее опытным пользователям и инженерам свободу для исследования, разработки и совершения новых технических прорывов.

Надеюсь, что перечисленным в статье смартфонам удастся занять на рынке весомую долю. К другим приметным карманным устройствам на Linux можно отнести NecunOS NE_1, Fenniy, Cosmo Communicator и Volla Phone.

Напоследок добавлю, что буду рад, если с Linux познакомится как можно больше пользователей, которые оценят его преимущества и пополнят уникальное сообщество.
Даешь свободу и власть пользователям!

Сноски

* По факту Linux поддерживает просмотр и редактирование файлов Word, таблиц Excel и прочих, причем не только на настольных ПК, но также на планшетах и смартфонах.
** Для Linux есть гораздо больше вариантов графического интерфейса, чем для любой другой операционной системы. К примеру, Gnome, KDE, Xfce и многие-многие другие.

Источник

Embedded Linux в двух словах. Первое

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

Платформой послужит плата BeagleBone Black с процессором производства Техасских Инструментов AM3358 и ядром Arm Cortex-A8, и, чтобы не плодить мигающие светодиодами мануалы, основной задачей устройства будет отправка смайлов в топовый чат, широко известного в узких кругах, сайта, в соответствии с командами от смайл-пульта. Впрочем, без мигания светодиодами тоже не обошлось.

Итак, на столе лежит чистая, т.е. без каких-либо предустановленных дистрибутивов, плата BeagleBone Black, блок питания, переходник USB-UART. Для общения с платой, переходник нужно подключить к 6-ти выводному разъему, где первый вывод обозначен точкой — это GND, выводы 4/5 — RX/TX соответственно. После установки скорости в какой-либо терминальной программе, например putty, на 115200, можно взаимодействовать с платой, о подключении подробнее и с картинками здесь.

Топовые чаты, пульты и светодиоды будут позже, а сейчас на плату подается питание и плата отвечает CCCCCCCCCCC

В переводе с бутлоадерского это означает, что первичному загрузчику, зашитому в ROM процессора, нечего загружать. Ситуацию проясняет Reference Manual, где на странице 5025 в разделе 26.1.5 описана процедура начальной загрузки. Процедура такая: первичный загрузчик проводит некоторую инициализацию: тактирование процессора, необходимой периферии, того же UART, и, в зависимости от логических уровней на выводах SYSBOOT, строит приоритетный список источников где можно взять следующий загрузчик, т.е. посмотреть сначала на MMC карте, SPI-EEPROM или сразу ждать данных по Ethernet.

Я использую способ загрузки с помощью SD карты, вот что говорит об этом раздел RM 26.1.8.5.5 на странице 5057: первичный загрузчик сначала проверяет несколько адресов 0x0/ 0x20000/ 0x40000/ 0x60000 на наличие так называемой TOC структуры, по которой он может определить загрузочный код, если так код не найти, то первичный загрузчик, предполагая на SD карте наличие файловой системы FAT, будет искать там файл с названием MLO, как это расшифровывается в RM не сказано, но многие склоняются что Master LOader. Возникает резонный вопрос, где же взять этот MLO?

Читайте также:  Nfs sharing windows server

Das U-Boot

Das U-Boot или просто U-Boot — Universal Boot Loader, один из самых, если не самый, распространенный загрузчик для встроенных систем, именно с его помощью можно создать требуемый вторичный загрузчик (MLO), который будет загружать третичный загрузчик (сам U-Boot), который будет загружать ядро Linux.

Перед скачиванием U-Boot, стоит сходить в репозиторий и найти тег последней версии, далее

U-Boot содержит больше тысячи конфигураций, в том числе нужную:

Это конфигурация платы AM335x evaluation module, этот модуль лежит в основе других плат, в том числе BeagleBone Black, что можно видеть, к примеру, по Device Tree, но о нем позже. Настраивается и собирается U-Boot с помощью Kconfig, то же, что используется и при сборке ядра Linux.

Установка нужного конфига:

Можно, к примеру, убрать, установленную по умолчанию, 2-х секундную задержку при загрузке платы с U-Boot

Boot options —> Autoboot options —> (0) delay in seconds before automatically booting

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

ARM Toolchain

Один из видов кросскомпиляции это сборка на одной архитектуре, как правило x86-64, именуемой HOST, исходного кода для другой, именуемой TARGET. Например, для TARGET архитектуры ARMv7-A, ядра ARM CortexA-8 процессора AM3358, платы BeagleBone Black. К слову, чтобы не запутаться в ARM’ах, даже есть свой справочник, так их много и разных.

Сама сборка осуществляется набором инструментов — компилятор, компоновщик, runtime библиотеки, заголовочные файлы ядра; так называемый Toolchain. Toolchain можно собрать самостоятельно либо с помощью crosstool-NG, а можно взять готовый от компании Linaro, или самой ARM. Здесь я буду использовать Toolchain от ARM “GNU Toolchain for the A-profile Architecture Version 10.2-2020.11, x86_64 Linux hosted cross compilers, AArch32 target with hard float (arm-linux-none-gnueabihf)», если не вдаваться в излишние подробности, то это все означает, что набор инструментов будет работать на десктопной машине с Linux и собирать программы для 32-х битной ARM платформы с аппаратной поддержкой операций с плавающей запятой.

Теперь для успешной сборки U-Boot, нужно указать в переменных ARCH и CROSS_COMPILE требуемые архитектуру и путь к кросскомпилятору соответственно, например так

Либо использовать export ARCH/CROSS_COMPILE , чтобы каждый раз не набирать все это. Я, для наглядности, буду каждый раз набирать все это.

После сборки U-Boot, в папке появятся необходимые файлы, а именно

MLO — вторичный загрузчик (напомню, первичный зашит в самом процессоре)

u-boot.img — третичный загрузчик, собственно U-Boot

Для успешной загрузки с SD карты, нужно ее некоторым образом разметить. Карта должна содержать минимум два раздела, первый, отмеченный как BOOT, с файловой системой FAT, второй раздел с ext4. Разметить карту можно, к примеру, программой fdisk.

Теперь нужно просто скопировать результаты сборки U-Boot в FAT раздел, вставить карту в BeagleBone Black и в терминале наблюдать уже более осознанный ответ платы

В ответе платы есть такие строки

Failed to load ‘boot.scr’

Failed to load ‘uEnv.txt’

U-Boot, во время загрузки, смотрит наличие дополнительных команд, сначала в файле boot.scr, при его наличии, затем, если boot.scr не нашлось, в uEnv.txt. Эти файлы, помимо очередности при поиске, отличаются тем, что в файле uEnv.txt, дополнительные команды представлены в текстовом виде, т.е. он проще для восприятия и редактирования. U-Boot не создает файлы с дополнительными командами, делать это нужно самостоятельно.

Здесь происходят некоторые манипуляции в результате которых U-Boot загружает из SD карты в RAM по адресу [loadaddr] — образ ядра [zImage], и по адресу [fdtaddr] — дерево устройств [Flattened Device Tree]. Формируются аргументы, передаваемые ядру Linux, это параметры консоли, к которой подключен переходник USB-UART [console=ttyS0,115200n8], место размещения корневой файловой системы [bootpartition=mmcblk0p2], параметры разрешения на чтение/запись корневой файловой системы [rw], ее тип [ext4] и ожидание появления корневой файловой системы [rootwait]. Чтобы раскрутить всю цепочку действий U-Boot, можно, после того как U-Boot прекратит попытки найти что бы загрузить и выдаст приглашение на работу в виде =>, ввести команду printenv , она покажет значения всех переменных, которыми располагает U-Boot.

В завершении своей работы U-Boot, командой bootz , вместе с вышеуказанными аргументами и адресом дерева устройств, передает управление ядру Linux.

Ядро Linux

Прежде чем приступать к любым действиям с ядром, стоит заглянуть сюда и убедится в наличии необходимых пакетов. Следующим шагом нужно определиться с тем, какую версию ядра использовать. Здесь я использую версию 5.4.92 и вот по каким соображениям. Одной из основных причин того, что не стоит брать просто последнюю версию ядра, доступную на данный момент, наряду с наличием драйверов, является невозможность быстро протестировать это ядро на всем разнообразии платформ поддерживаемых Linux, а значит можно потратить кучу сил и времени на исправление неполадок, если что-то пойдет не так, и не факт что это вообще получится сделать. BeagleBone Black имеет официальный репозиторий, где можно найти версию ядра, протестированную на данной платформе, и long term версия 5.4.92 была последней на тот момент.

Читайте также:  Переустановить драйвер сетевого адаптера windows 10

Нужный конфиг, расположенный в /arch/arm/configs, называется omap2plus_defconfig, OMAP — это название линейки процессоров, продолжением которых является AM3358, впринципе, подойдет и более общий multi_v7_defconfig.

Сам конфиг пока остается без изменений, поэтому можно просто его установить и запустить компиляцию ядра(zImage), модулей(modules) и дерева устройств(dtbs)

Проходит некоторое время.

Результат сборки, в виде zImage, находится в /arch/arm/boot, там же в папке /dts находится скомпилированное дерево устройств am335x-boneblack.dtb, оба отправляются на SD карту к файлам загрузчика. На этом FAT раздел SD карты можно считать скомплектованным. Итого, там присутствуют:

MLO — вторичный загрузчик

u-boot.img — третичный загрузчик

uEnv.txt — дополнительные команды загрузчика

zImage — образ ядра Linux

am335x-boneblack.dtb — скомпилированное дерево устройств платы

Еще при сборке ядра заказывались модули ядра, но они уже относятся к корневой файловой системе.

Корневая файловая система. BusyBox

Ядро получает корневую файловую систему путем монтирования блочного устройства, заданного в, переданном при запуске ядра, аргументе root=, и далее, первым делом, исполняет оттуда программу под названием init.

Если запустить BeagleBone Black, имея только вышеуказанные файлы для FAT раздела, то ядро будет паниковать по причине отсутствия init и, в целом, по причине пустой rootfs, т.е. корневой файловой системы.

Можно шаг за шагом создать все минимально необходимые компоненты корневой файловой системы, такие как оболочка, различные демоны запускаемые init, сам init, конфигурационные файлы, узлы устройств, псевдофайловые системы /proc и /sys и просто системные приложения. Для желающих совершать подобные подвиги, существует проект Linux From Scratch, здесь же я воспользуюсь швейцарским ножом встроенных систем с Linux, утилитой BusyBox.

Скачивание последней, на тот момент, версии:

Настройка конфигурации по умолчанию:

Чтобы не думать сейчас о разделяемых библиотеках, стоит установить статическую сборку BusyBox:

Settings —> Build static binary (no shared libs)

Установка в папку по умолчанию _install:

Теперь в папке _install можно видеть будущую корневую файловую систему, в которую нужно добавить некоторые вещи.

Папки, помимо созданных BusyBox:

Стартовый скрипт. Дело в том, что, запускаемая в первую очередь, программа init, делает много полезного, например, выводит в консоль приглашение, но до выдачи приглашения, init проверяет наличие стартового скрипта /etc/init.d/rcS, и, при наличии, запускает его.

Этот скрипт монтирует псевдофайловые системы proc и sysfs, и ничего не мешает ему запускать, к примеру, пользовательскую программу, отвечающую за функционал устройства, но лучше будет делать это в отдельных скриптах, скомпонованных по функциональному назначению.

Стоит сказать, что работа init, на самом деле, начинается с чтения конфигурационного файла /etc/inittab, но BusyBox’овская init включает таблицу inittab по умолчанию, если таковой не окажется в корневой файловой системе.

Теперь пора вспомнить про модули ядра. Их также нужно разместить в корневой файловой системе в /lib/modules/5.4.92/, но сейчас они разбросаны по всей папке в которой собиралось ядро. Чтобы собрать модули в кучу, нужно в папке с ядром выполнить

Где в INSTALL_MOD_PATH указать путь к папке с корневой файловой системой, кросскомпилятор указывать не нужно, т.к. здесь модули ядра просто копируются по месту назначения. В результате папка /lib корневой файловой системы пополнится разделом /lib/mudules/5.4.92/ содержащим модули ядра, полученные при компиляции ядра.

Осталось скопировать все содержимое папки _install во второй раздел SD карты, тот который с ext4, и поменять владельца всего содержимого на root.

После запуска BeagleBone Black с корневой файловой системой, через 1.910315 секунды после старта ядра, система предложит активировать консоль и начать работу.

Но начать работу в такой системе, скорее всего не получится, т.к. в ней нет ничего кроме системных утилит BusyBox и моей небольшой программы, нарисовавшей приветствие, зато, эта система поможет получить общее представление о том, какая магия происходит внутри подобных устройств. Именно общее, т.к. в реальных устройствах, из-за необходимости минимизации времени загрузки, ограниченности ресурсов, заточенности под конкретную задачу, различий между ARM процессорами, построение системы может сильно отличаться. Например, на малинке, вообще сначала стартует графический процессор, который затем запускает все остальное.

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

Источник

Оцените статью