Wednesday, October 3, 2012

Android прошивки

​Существуют общность возможно даже недостаток прошивок Android и стабильных версий дистрибутивов и в общем-то любых прошивок - используются старые версии библиотек. Но все же ближе к обычным прошивкам - так как после релиза не вносятся изменения в базовые компоненты. Возможно, что версия библиотек определяется как последняя стабильная версия на момент начала разработок, и основные изменения вносятся только во внутренние части продуктов, разрабатываемых внутри компании и как следствие представляющие наибольший интерес для компании разработчика.
Было бы удобно, если бы бекпортировали изменения в ядре и библиотеках связанных с безопасностью openssl, openvpn и тому подобное. И обновляли все библиотеки у которых не меняется внешний интерфейс, например libxml и bash и sudo. И прошивка для телефонов поддерживающих по каким-то причинам только версию 2.3.* с обновленными ssl библиотеками и браузером, была достаточно полезна. Так же было бы не неплохо иметь возможность устанавливать и обновлять все пользовательские приложения не относящиеся к базовой функциональности в виде пакетов, например обновлять браузер(не html движок)и телефонное приложение, а в базовой обновляющееся только с прошивкой: сервисы, виртуальная машина и все остальные части в отдельном обновляемом разделе, который можно перекрывать как сейчас, когда обновленные версии хранятся в отдельном разделе.
Результатом моей попытки по обновления компонентов которые собираются без проблем со старым abi без изменений в критических компонентах к которым привязаны бинарные библиотеки для поддержки аппаратуры можно посмотреть сдесь.

Saturday, August 18, 2012

iOS и Android


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

В Android выбран режим виртуальной машины широко распространенного языка Java что конечно дало возможность получить большое количество разработчиков, но добавило проблем с лицензией на использование и патентами на реализацию, которая внутренно не совместимо с изначальной реализацией виртуальной машины. Выбрав как язык виртуальной машины python или другой подобный язык удалось бы возможно избежать некоторых проблем с лицензией, но все-же не решило всех проблем - так лицензионное разбирательство происходило не столько из-за использования языка сколько из-за вопроса реализации виртуальной машины. И никто не может сказать чтобы было выбери они другое решение. А тихое ожидание и скрытые проблемы с лицензиями и патентами только вредят продукту- зная что именно нарушено в 235 патентах, можно реализовать по другому функциональность или добиться решения о аннулировании патентов. И если продолжаются скрытые соглашения о крослицензировании для OpenSourse проекта, разработчиком может не захочется открывать/ сообщать о своих улучшениях, если в какой-то момент окажется, что ты не можешь использовать свои наработки и вынужден за них кому-то платить. 

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

P.S.: Я не владелец iPhone. Поэтому мое мнение сугубо субъективное.

Saturday, August 11, 2012

Samsung ML-1861

Очень хороший достаточно быстрый принтер, но имеет одно неудобство, для его поддержки в  Linux нужно поставить универсальный драйвера Samsung, которые не имеют исходников. Если его не установить (или opensource аналог о котором пойдет дальше речь), то в Ubuntu 12.04 будет установлен драйвер для ML-1750 и при попытке напечатать что либо - печаталась страница:
position: 0x0(0)
system: h6fw_5.49/xl_op
line:180
Version: SPL 5.49 10-20-2010
Сообщая, что переданный документ не соответствуют формату и нужно использовать другую версию языка описания страниц SPL.

Свободной реализацией этого языка занимался проект SPLIX, который является проектом по реверс инжинирингу этого языка и достиг значительных успехов в поддержке принтеров, но вот уже долгое время не развивается и о новых принтерах ничего не знает. Именно через него происходит вывод на печать в Ubuntu, но так как выбрана не правильная версия драйвера - используется не правильная версия языка. Для решения этой проблемы нужно зайти на CUPS и поменять драйвер на принтер о котором бы знали драйвера, как о поддерживающем именно эту версию языка, Samsung CLP-310, правда он цветной, но нам никто не мешает его использовать для черно-белой печати. (Возможно нужно кроме cups доставить splix.)

Шаги установки для проверки работоспособности:
  • Ставить бинарные драйвера с сайта samsung не нужно, все и так работает и обновляется вместе с системой.
  • Проверить установлен ли cups(можно через dpkg-query -l или synaptic), если нет устанавливаем через sudo apt-get install cups
  • Установить драйвера для поддержки языка разметки понимаемого принтером через sudo apt-get install printer-driver-splix
  • Зайти на CUPS (http://localhost:631/admin), и добавить новый принтер выбрав как модель Samsung CLP-310. (Administration->Add printer -> выбрать принтер подключенный по usb)
  • Попробовать напечатать что-нибудь и узнать поняли ли друг друга принтер с компьютером.

Sunday, August 5, 2012

Желания и мечты

​Не все желания выполнимы, после того как google официально объявило, что больше не будет поддерживать nexus one он же htc desire, htc объявило что запланированное обновление для desire hd тоже не выйдет - оно планировалось на июль-август - о чём как раз и было объявлено под конец этого срока. Пользователи уже создали петицию с просьбой выпустить еcли не полное обновление - то хотя бы код ядра и драйвера. В общем именно то чего не хватает альтернативным прошивкам для работы. С остальными устройствами в общем-то та же история - в основном прошивки сейчас есть только для последних устройств идущих с новым андроидом. Что будет с остальными устройствами не понятно, часть будет уже сейчас официально не поддерживаться в cyanogenmod 9+ версии, как не удовлетворяющая минимальным требованиям для андроида, так как на этих устройствах скорее всего будет проблемы с новыми приложениями рассчитанными на большие аппаратные возможности, и чтобы не создавать продукт которые вызовет только рост недовольных отзывов - решили официально не поддерживать. Относительно устройств которые удовлетворяют этим требованиям, но компании производители не хотят по своим внутренним причинам выпускать обновление прошивок, ответ похоже скорее всего - возможно, если смогут портировать драйвера с других устройств или через какие-то дополнительные абстракции, чтобы работали старые драйвера. Что в общем-то близко, но всё же отличается от обычных дистрибутивов линукса, где с большой вероятностью пользовательские устройства с более менее широкой распространённостью все же с большой вероятностью поддерживаются. Ноутбуки все же в большой степени остаются функциональными из-за широкой общности устройств и использования для удобства пользователя различных ухищрений с возможностью автоматической настройки устройств(USB, Plug and Play) - и скорее всего устройство как-то себе идентифицирует при загрузке, но всё же остаются различные проблемы вида сложностей обновления прошивок, так как производители не сообщают спецификацию и эта процедура может сильно отличаться между моделями, а может и нет - так как для прошивки используются приложения поставляемые производителем BIOS, а не устройства. Но всё же полной спецификации нет и CoreBoot может использоваться не на всех устройствах. Также есть проблемы когда производитель не поставляет драйвера или не обновляет их под новые ядра - но в основном это решается если устройство популярно.

Tuesday, July 17, 2012

DSL-модем

История мелкого разбора протокола

Решил немного проверить свои знания Linux/GNU философии. По идее все что создано руками человека может быть другим человеком понято и изменено, не будем рассматривать вариант разрушено, оставим на волю природы разрушать и очищать от неудачных творений человеческой разумности. И так есть устройство гордо именуемое как ADSL роутер обладающее очень важной особенностью признанной людьми в развитых странах осуществлять важнейшую потребность людей в глобальной общении и обладающий гигантским недостатком это изобретено не нами, нужно обязательно изучить и понять как же оно работает и восполнить жажду новой интересной, но совершенно не нужной информацией. Оно базируется на разработках которые вот уже лет десять воплощаются в серии устройство состоящих из множества интересных возможностей и технологий созданных на базе RISC архитектуры используемой во многих высокопроизводительных компьютерах.

Устройство содержит созданный на базе референсного дизайна adsl модема содержащего процессор с поддержкой usb, pci, rs232 портов, jtag дебаг интерфейсом, eth/wlan сетевым интерфейсом, adsl/vdsl модемами(отдельный DSP процессор). Система обычно содержит, если судить по известной мне информации вне процессора дополнительные сетевой маршрутизатор на 4 порта, внешний wifi модуль того-же производителя и дополнительный логику преобразования сигналов для dsl(ADSL2+ 5V Line Driver - похоже на каку-то трансформаторную развязку). Производители модемов в разной степени меняют эту реализации под свои нужды - но без значительны изменений между моделями различных производителей, и прошивку от одного модема при желании можно поставить на другой. Состав поддерживаемых интерфейсов/реализация элементов(внутри основного чипа/вне) изменяется между сериями, но тоже не значительно - в основном, как обычно, по пути расположения в основной чипе всей логики.

Из этого списка компонентов только dsl интерфейс не поддерживаться сторонними прошивками остальные части достаточно стандартные и благодаря открытой документации или реверс-инженерингу поддерживаются. Основным недостатком является отсутствие существенных обновлений прошивки даже самые новые прошивки одного производителя используют ядро 2.6.9 и для сборки требуют старые дистрибутивы (на fedora 9 - можно собирать DSL-2650U, 2640 - RedHat 9.0).

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

Но сначала нужно посмотреть что происходит на реальном оборудовании, когда мы пытаемся получить информацию о соединении, для случая с модема с usb это просто - на флешку отформатированую в fat32 скидываем откомпилированый strace и смотрим что происходит. strace выводит что adslcrl открывает файл устройства со стандартными флагами без каких-то нестандартных особенностей открытия и через ioctl передает первым параметром какую-то магическую константу, вторым параметром что-то похожее на адрес. Ничего туда не пишет и не читает. Делаем несколько запусков и убеждаемся что он всегда делает одни и те же действия с одинаковой константой и близкими значениями адреса.

Дальше мы уже можем переключиться на эмулятор чтобы получить больше подробностей.

Непосредственно брать образ файловой системы из образа прошивки не нужно - формат опять таки закрытый, но есть частичная документация получения реверс-инженерингом, можно поступить проще и взять этот образ из дерева исходных кодов при сборке. Он представляет собой обычный образ сжатой файловой системы Squashfs(targets/DSL-2650U/rootfs.img) старой версии(version 2.0) поэтому непосредственно открыть на новых дистрибутивах его нельзя, они уже эту версию не поддерживают - поэтому нужно создать образ с использованием более распространенной файловой системы:

  1. dd if=/dev/zero of=empty.img count=32768 
  2. mkfs.ext3 empty.img 

и перенести на нее содержимое первого образа. В этот образ уже можно добавлять нужные нам дополнительный средства busybox нужной нам версии с включенной поддержкой всех команд и strace и т.д. в общем все что захочется.

Далее качаем, если еще этого не сделали образ дебиана для mips мальта. И запускаем с нашим новым пользовательским окружением.

Если почитать блог можно подтвердить предположение, что для других модемов тоже используется магическая константа и адрес. Значит нужно создать модуль для того чтобы посмотреть что же все-же передается. В ранее указанном блоге делается подмена системных функций - более похожая на создании вируса c сокрытием процессов. Проще создать модуль который будет выдавать все что ему приходит и пробует вернуть похожее на реальный ответ назад. В ранее указанном блоге используется дамп 256 байт области переданной как второй параметр. Дампим пока этот объем - и видим что по этому адресу расположены выравненные по слову числа похожие на 3 адреса и пара констант. Далее пишем программу которая создает такой буфер с тремя выделениями памяти и смотрим, что записалось по этим адресам, если запустить программу на реальном оборудовании - сначала ставим размер буферов в 256 байт - видим что память по всем адресам изменилась, память выделенная под входные параметры не изменилась. Пробуем увеличивать размеры буферов до 512, 1024, 2048 - видим что значения записываемые модулем ядра на реальном оборудовании не влазят в буферы меньше 2k байт - похоже нужно использовать буферы в 2048. И сделав так видим что заполняется только первый буфер и так как мы используем выделение данных в куче адреса у нас немного отличаются от оригинальной программы. Поэтому предполагаем что она выделяет память в стеке, и мы просто видим дамп стека.

Далее инициализируем память для первого буфера в 0, смотрим на дамп, инициализируем в -1 смотрим в дамп и видим что в реальности меняется только примерно 1.5k байт, можем предположить, что это и есть реальный размер. Смотрим в дамп переданных ядру данных, и видим что одна константа совпадает с полученным размером, можно предположить, что именно так передается размер выделенной памяти. Уменьшаем размер передаваемых данных до 0x20 и видим что ничего не поменялось - можно предположить что это есть примерный размер входного буфера.

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

Это конечно нас не приблизило к осознанию как все работает, так как это протокол проприетарный и скорее всего может меняться в зависимости от прошивки/модели. Более перспективным является понимание как оно внутри работает, а у нас получился шаг в строну - но все же позволяющий потренироваться на простых вещах.

Sunday, June 3, 2012

Qemu и сеть(tap)

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

Если нужен доступ внешней сети можно использовать Tap вариант - при этом нужно создать виртуальный мост объединяющий реальный интерфейс с виртуальным. В этом случае есть 2 варианта сделать чтобы он всегда создавался при старте системы или создавать его ручками. Второй вариант мне кажется лучше - нужно всего пара команд и в системе не висит лишний интерфейс. Последовательность запуска:
  1. sudo brctl addbr virbr0
  2. sudo brctl addif virbr0 eth0
  3. sudo ifconfig virbr0 up
  4. sudo dhclient virbr0
  5. sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap

Sunday, May 27, 2012

Компиляция busybox под mips

  1. tar -xvf ../cross-compiler-mips.tar.bz2
  2. tar -xvf ../busybox-1.20.0.tar.bz2
  3. cd busybox-1.20.0/
  4. CROSS_COMPILE="$PWD/../cross-compiler-mips/bin/mips-"
  5. LDFLAGS="--static" make CROSS_COMPILE="$CROSS_COMPILE" defconfig
  6. LDFLAGS="--static" make CROSS_COMPILE="$CROSS_COMPILE" all
  7. LDFLAGS="--static" make CROSS_COMPILE="$CROSS_COMPILE" install
P.S.: Образ для виртуальной машины, чтобы проверить можно скачать здесь.