Когда невозможное ВОЗМОЖНО: интервью с Дмитрием Гринбергом, которому удалось запустить UBUNTU LINUX на 8-битном микроконтроллере

board1

В конце мая весь интернет облетела новость о создании самого медленного компьютера под управлением Ubuntu Linux. Этим компьютером оказался 8-разрядный микроконтроллер АТ-mega1284p, оснащенный 256 Кб оперативной памяти и лишенный блока управления памятью MMU. Авторство проекта принадлежит Дмитрию Гринбергу, молодому программисту из России, который проживает в США и работает на компанию Google.

Свой опыт запуска Ubuntu Linux на микроконтроллере Дмитрий подробно описал в блоге на www.dmitry.co. Как оказалось, чтобы осуществить задуманное, ему пришлось применить несколько весьма изощренных трюков, например написать программные контроллеры для подключения дополнительного модуля памяти SIMM на 16 Мб и управления SD-картой на 1 Гб. Однако самое интересное скрывалось глубоко внутри. Это полноценный эмулятор архитектуры ARMv5TE, написанный с нуля специально для микроконтроллера и позволяющий запустить Ubuntu 9.04.

Производительность эмулятора оказалась в районе 6,5 кГц, при производительности реального процессора АТтеда1284р в 24 МГц (разгон со штатных 20 МГц), что, по сути, означало: это самый медленный компьютер, способный запустить Linux. Это же подтвердил и тестовый запуск дистрибутива Ubuntu, загрузка которого продолжалась более четырех часов, а среднее время ответа стандартных команд терминала составляло примерно минуту.

Дмитрий, расскажи немного о себе. Где сейчас живешь, где работаешь?

Живу около Сан-Франциско, в Силиконовой Долине. В свое время работал в VMware, Kno, Lab126 (Amazon), теперь работаю в Google. Писал много программ на PalmOS (я был довольно известен среди «пэлмоводов»), а теперь пишу на Android и скоро займусь iOS. В России ходил в школу №46 в Астрахани (ее потом переименовали в Гимназию №4). Уже здесь окончил Университет Иллинойса (University of Illinois) в Urbana-Champaign.

Ты рос в России?

Я родился в Таганроге и жил в Астрахани до 1999-го. Потом родители переехали в Америку, и я с ними. Отец очень рано начал учить меня программировать. Не пускал гулять и играть в футбол с друзьями, пока я не прочту очередную главу книги о языке программирования Си.

Когда ты начал интересоваться компьютерами?

Лет в шесть я увидел статью в каком-то старом журнале из библиотеки, с описанием программы на бейсике, которая угадывала животного, задавая несколько вопросов типа «да/нет». Когда я попросил у папы разрешения использовать компьютер, чтобы написать ее, он сказал, что бейсик —это ерунда, и дал книгу о языке Си. С тех пор так на нем и сижу. Выучил много других языков, но ничего лучше Си пока не нашел.

Твой отец тоже программист?

Да, тоже. И мама в России была программистом. Почти вся семья такая, кроме моей сестры. Папа интересуется телефонией и работаете VoIP-технологиями. Меня это не очень привлекает, поэтому в темах работы мы пересекаемся редко.

Как появилась идея запустить Linux на микроконтроллере? Сколько времени ты з потратил?

Давно хотелось доказать, что такое возможно. Эмулятор я писал в свободное время почти шесть месяцев. Потом забросил проект —сменил работу (ушел из Amazon в Google) и готовился к экзамену на права пилота, свободного времени было меньше. Решил закончить, когда сдал экзамен и освоился на работе. Раньше с AVR я не работал, поэтому недели две ушло только на выяснение причин, по которым AVR-GCC генерирует такой плохой код. В конце концов понял, что AVR-GCC по-другому просто не умеет. Два дня разбирался с RAM, она почти заработала, но иногда один бит менялся сам по себе. Сдавшись, я сделал новою плату, с более короткими и прямыми проводами oт AVR к RAM, и все магическим образом заработало без каких-либо проблем!

После окончания работы над эмулятором столкнулся с еще одной проблемой. В AVR-GCC int был представлен 16-битным числом, а все константы в Си именно этого типа. Пришлось переписывать часть эмулятора. Когда заработал эмулятор, появилась другая проблема: загрузчик работал корректно, но ядро падало. Долго разбирался, в чем дело. Оказалось, что в отличие от обычных архитектур, в которых сдвиг 32-битного числа вправо на 33 бита давал результат 0, AVR-GCC просто сдвигал на 1 бит вправо. Как оказалось, стандарт Си такое допускает. Пришлось проверять размер сдвигов и вновь исправлять код. После этого все заработало. По крайней мере, я так думал. Дело в том, что я не знал, сколько будет продолжаться загрузка ядра, и не имел возможности понять, зависла она или идет корректно. Наконец, через 5-6 чашек кофе я увидел фразу «kernel is up».

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

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

Почему для эмулирования была выбрана архитектура ARM?

Я с ней очень хорошо знаком: я работал с ARM, когда писал приложения для PalmOS, почти вся моя работа также связана с этой архитектурой. В любом случае нужно было что-то эмулировать, и я выбрал ARM. Можно было сделать х86 или MIPS. Но х86 я ненавижу, а с MMU в MIPS не так хорошо знаком.

Почему Ubuntu, а не что-то из разряда Embedded? Proof of concept?

Цель была доказать, что полная система, созданная для работы на больших компьютерах, заработает и здесь, a Ubuntu знакома мне ближе всего. Теоретически запустить можно и любую другую систему. Некоторые люди, сделавшие эмуляторы по моим инструкциям, уже успешно запустили в них CentOS.

Обязательно ли было эмулировать MMU? (uClinux, по идее, работает без MMU)

Теоретически, конечно, можно было сделать no-MMU, но опять-таки хотелось использовать не измененную копию системы для «больших» компьютеров. Мой эмулятор имеет модульную архитектуру, поэтому поддержку MMU легко убрать. В результате он станет раза в два-три быстрее.

Почему ты остановил выбор именно на этом микроконтроллере?

Нужен был контроллер, для которого есть хоть какой-то компилятор Си и как минимум 8 Кб памяти. Очень хотелось 8-битный, а не 16-или 32-битный (просто ради прикола). Я поискал и в итоге выделил двух финалистов: AVR и PIC18. Компилятор Си для PIC18 не смог осилить мой код (он умирал без ошибок), поэтому выбор был сделан за меня.

С тех пор я успешно запустил эмулятор на dsPIC33 (в двадцать раз быстрее AVR), а один человек запустил его на PIC32.

Ты сказал, что лучше языка, чем Си, не нашел. Чем он тебя так привлекает? Простотой и прямолинейностью либо чем-то другим? Почему не C++?

Чем мне нравится Си —в нем очень легко понять, что будет делать процессор. Если ты знаешь, как работает процессор, то легко напишешь более эффективный код.

C++ тоже неплохой язык, но я не очень его люблю. Используя C++, легко написать код, который будет работать непонятно когда (например, конструкторы глобальных объектов). Конечно, можно писать осторожней и избегать таких непоняток, но я предпочитаю просто не использовать C++.

Ты сказал, что сейчас работаешь в Google. Чем ты там занимаешься?

Работаю в команде Android над новыми версиями системы Android и над новыми продуктами экосистемы Android. Скоро конференция Google. Я буду выступать там с лекцией о новой версии Accessory Development Kit. Все лекции будут доступны для просмотра на google.com. Смотрите.

Расскажи подробнее об Accessory Development Kit. Для каких целей он используется?

Accessory Development Kit —это такая штука, используя которую к Android-телефонам можно подцеплять разные микроконтроллеры, сенсоры и так далее.

В прошлом году вышла версия 1 ADK, и с ней люди сделали много интересных вещей. Над версией 1 я не работал. Для версии 2 я писал весь код. И там много нового и интересного. Пока детали рассказать не могу, но все будет показано на конференции Google в конце июня.

О работе в Google рассказывают много интересного: потрясающие условия работы, невероятные зоны отдыха, свободное время на занятие своими проектами. Это не преувеличение?

Это так, и даже больше. У Google примерно тридцать ресторанов с любыми типами еды. Хочешь суши? Ресторан в здании 44. Хочешь бургер? Здание 45. Мексиканская еда? 41. Массаж всем по заказу. У Google свои автобусы (их где-то тридцать), и можно на работу и домой ездить на них. Например, от моего дома до ближайшей остановки Google-автобуса всего четыре квартала. Самое интересное, что разрешают приводить на работу домашних животных, поэтому вокруг всегда куча собак. И для них тоже есть где подкрепиться. Ну и самое главное —люди. Я могу честно сказать, что Google —это первое место работы, где я не чувствую, что 50-80% людей вокруг меня —идиоты. Это приятно.

Расскажи, чем ты занимался в Lab126, VMware, Kno.

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

Какие продукты были созданы под твоим управлением? О которых можно говорить.

Amazon еще не выпустили, поэтому не могу пока. Kno: goo.gl/z5mH9. Продукт был выпущен, но потом Intel дала Kno 30 миллионов и «попросила» свернуть проект.

На этом все закончилось. В VMware я сделал технологию VAssert, а также работал в команде из четырех человек, создавшей технологию Replay Debugging.

Расскажи подробнее о Kno. В чем был смысл их проекта? Ноутбук-трансформер, в котором вместо клавиш полноценный сенсорный экран? Электронная книга, дизайн которой максимально приближен к обычной книге?

Смысл Knо был простой: заменить учебники одним продуктом, на котором можно было бы покупать сами учебники в электронном формате. У него было два 14-дюймовых экрана, которые отзывались и на пальцы, и на ручку, то есть на нем можно было писать. Работал под управлением Linux (не Android). Продукт был готов, и где-то 100 экземпляров было отослано покупателям, но тут Intel заплатила Kno за то, чтобы выпуск продукта отменили.

Можешь сказать пару слов про свою мобильную ОС DGOS? Почему ты занялся ее написанием? Какие у нее преимущества и возможности?

Обо всем можно прочитать в блоге: dqosblog.blogspot.com. Смысл был дать карманным компьютерам на базе PalmOS новую жизнь. Много было сделано и много работало, но не хватило времени, а потом, конечно, все Palm ы повыкидывали, и —собственно, продолжение известно.

Не было ли мыслей опубликовать код DG0S под какой-нибудь свободной лицензией?

Была идея, и до сих пор есть, только пока я не уверен, что это кому-то надо. Просто уже поздно. Но в принципе, могу и выпустить. Я это предлагал даже.

Сейчас в свободное время занимаешься какими-нибудь интересными проектами наподобие DG0S?

Отдыхаю. Скоро очередной экзамен на следующий этап прав пилота. После этого, думаю, займусь чем-нибудь типа mesh networking. Мне эта тема интересна.

Зачем тебе права пилота? Голубая мечта детства или очередное увлечение?

И то и другое, конечно. Кто не мечтал полетать? Однажды (где-то два года назад) мне надоело мечтать, и я пошел и узнал, как начать. Права получил примерно через год. Но в пилотских правах есть градации, например, мне можно пилотировать только одномоторные самолеты весом меньше 5700 кг. Но это пока… на следующем этапе можно будет и больше.

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

Какие еще у тебя есть увлечения?

В свободное от полетов и работы время пишу стихи и музыку. Иногда рисую. Еще я делаю радиоуправляемые самолеты, ну и собираю большую коллекцию штрафов за превышение скорости. К сожалению, на трассах тут максимально разрешено 105 км/ч, а мой «Корвет» может 300. Вот в этом и состоит мое несогласие с полицией.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

11 + 14 =