Энтузиаст запустил ядро Linux на плате Arduino Uno. Чтобы адаптировать полновесный Linux 6.1 к чипу ATmega328p, он портировал эмулятор RISC-V на эту платформу. Установлен новый антирекорд: более 15 часов для загрузки.
Ядро Linux адаптируют и запускают на разных конфигурациях. С ноября 2017 года в списке самых мощных суперкомпьютеров мира Top500 не осталось машин на других операционках. Уже больше пяти лет в этом рейтинге остались только суперкомпьютеры под Linux.
Вместе с тем отдельные варианты Linux специально «допиливают» для встраиваемых систем или плат со скромными характеристиками. К примеру, Damn Small Linux просит для работы без графики хотя бы 486dx или на 100 % совместимый клон и 8 МиБ ОЗУ, хотя рекомендуется 16 МиБ. Были попытки уместить Linux даже в 4 МиБ ОЗУ.
Вообще, энтузиасты любят из спортивного интереса запускать софт на платформах, для которых он никогда не предназначался. Чаще всего для этих целей выбирают игру Doom 1993 года, что демонстрирует графические способности. Doom работает на умных часах, калькуляторах или хоть внутри самого Doom. На самом деле такие развлечения — не самая простая операция, для успеха которой нужно познакомиться с эффективными техниками игровой разработки начала девяностых и ограничениями целевой платформы.
Реже упражняются с Linux. Речь идёт, конечно, о полноценном ядре, а не обрезанной версии вида μClinux. В качестве вызова систему запускают на микроконтроллерах, к примеру, на ESP32. В других случаях подойдёт Commodore 64, микрокомпьютер из восьмидесятых. Работа получается медленной: по расчётам выходит, что на загрузку на реальном «железе» уйдёт неделя. Попытка c C64 была проведена в эмуляторе VICE, а не на настоящем компьютере, но даже там в ускоренном режиме эмуляции для получения скриншотов пришлось прождать два часа.
С 2012 года худшим компьютером на Linux считался 8-битный микроконтроллер ATmega644a с 16 КиБ ОЗУ и 128 КиБ флэш-памяти. Процессор AVR был «разогнан» до частоты 24 МГц, блока управления памяти нет, для хранилища была карта памяти. С такими условиями энтузиаст Дмитрий Гринберг умудрился настроить эмуляцию процессора архитектуры ARM со скоростью 10 кГц. В результате получилось загрузить Ubuntu за 6 часов.
Умелец из Вьетнама побил антирекорд Дмитрия и запустил Linux на Arduino Uno. На загрузку Linux 6.1 уходит 15 часов 44 минуты.
raspiduino
«Сердце» Arduino Uno — ATmega328p. Характеристики ATmega328p ещё более скромные: 2 КиБ (2048 байт) ОЗУ, 32 КиБ флэш-памяти, 2 КиБ SRAM. Автор проекта arv32-opt портировал на ATmega328p код mini-rv32ima, минималистичного эмулятора RISC-V, способного загружать Linux.
Эмулятор использует 3 512-байтных кэша (один icache и два dcache) и ленивую систему кэширования. Процессор общается по интерфейсу SPI с картой памяти, где и хранит ОЗУ. Для адаптирования карт памяти, которые требуют уровни напряжения 3,3 В, для ATmega328p, у которой логические уровни ориентированы на 5 В, нужен преобразователь логического уровня. В документации приводится необходимая разводка выводов для подключения карты памяти.
Из-за узкого канала связи с картой памяти по однобитному интерфейсу и низкой частоты шины SPI (удалось достичь FLCK/16, то есть 1 МГц) скорость эмуляции RISC-V на Arduino Uno меньше килогерца. Для 16-МГц чипа ATmega328p средняя частота эмуляции находится на уровне 700 Гц, в пике — до 1500 Гц. И то для такого потребовалось доработать эмулятор системой из трёх кэшей и ленивым кэшированием. Поначалу скорость варьировалась от 175 до 205 Гц.
На данный момент после каждого запуска Linux на ATmega328p карту памяти нужно размечать заново. Сброс состояния пока не реализован.
Автор проекта выложил процесс загрузки на своём канале YouTube, в том числе полные видеозаписи без монтажных склеек. Понятно, что никакой практической ценности в еле ворочающейся операционке нет.
github.com/raspiduino/arv32-opt
Источник: habr.com