Sunday, June 21, 2015

Сила эмуляции

Если посмотреть на современные компьютеры с несколько необычного угла,то можно увидеть: что ничего по сути не поменялось. Да все стало миниатюрнее и содержит большее количество транзисторов, но количество реально работающих транзисторов и объёмы памяти доступные для процессора не поменялись. Конечно это не совсем так и я сильно утрирую, но всё же посмотрим к чему это нас приведет.

Рассмотрим, как же современная аппаратура работает.
  • При включении питания процессор включается и инициализирует свои внутренние структуры можно даже считать, что он вычитывает из своего ROM внутри себя начальную программу, так как современные процессоры кроме совсем простых RISC процессоров, содержат собственный микрокод который при старте конфигурирует внутренние структуры и загружает интерпретатор внешнего бинарного кода, так как сам процессор не знает ничего о своих CISC командах и все эти команды интерпретируются, скорее даже прекомпилируются в начале конвейера в VLIW(very long instruction word) и уже эти команды он выполняет. При этом благодаря идее темного кремния - части процессора которые в данный момент не работают отключают и уменьшают количество включенных транзисторов на каждом этапе. И по сути пытаются не делать универсальные блоки - так как экономить на транзисторном бюджете не нужно, можно создать отдельные блоки для сложения и вычитания и просто выключать лишнее и получать более оптимальное соотношение потребляемой мощности к производительности так как специализированная схема, заточенная под одну операцию всегда эффективнее.
  • После этого начинается загрузка BIOSа, которая содержит совсем маленький загрузчик цель которого включить уровне кеша выше первого, так как только первый уровень кеша доступен на этапе старта и это очень ограниченное количество килобайт. Или почти intel 80. Эти инструкции настраивают следующие уровни кеша и остальную встроенную в процессор периферию, и уж затем копируют туда следующие участки кода BIOSа перекрывая участки оригинального BIOSа и распаковывая его.
  • Инициализируем самые критичные блоки и обновляем микрокод процессора и мы имеем несколько мегабайт доступной памяти и можем регулировать питание внешних устройств и т.п.. Или почти intel 86 процессор.
  • И вот теперь можно протестировать внешнюю память и настроить ее - и мы получаем intel 386 и выше процессор и у нас несколько гигабайт адресное пространство. И начинаем инициализировать остальную периферию. И если это старые BIOS мы выходим в состояние 86 процессора в 16 режиме или если это UEFI - то в родном 32/64 режиме это уже зависит, как повезет.
  • И так мы имеем первый уровень интерпретации. Процессор интерпретирует CISС инструкции - память отображена один в один по адресам, но уже работает система когда все обращении к участку памяти он скрытно копируется в кеш и уже там над ним что-то делают.
Ползем далее - операционная система создает виртуальное адресное пространство или TLB структуры и блокирует все обращение к привилегированным инструкциям. Далее код уже не видит память и не может общаться с периферией. Но можно работать с виртуальными файловыми системами и получать данные не зная, как же это все работает внутри.
Далее мы идем в следующий уровень виртуализации - контейнеры браузеры, виртуальные машины. Нам создают отдельную нить исполнения и перехватывают все наши действия и обращения к памяти и эмулируют новую аппаратуру если нужно - и от сюда нам уже не выбраться - мы не видим ровным образом ничего - нам только сказали - захочешь чего либо - вызови это прерывание.

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

А что этот код будет делать? и кто там? - мы не узнаем, может там совсем другая архитектура и мы в виртуалке?

А есть же еще TrustZone и SMM(system managment mode) код - который может стартовать до BIOSа или быть отдельным процессором, который видит наш процессор и его память с периферией, а мы его нет. На этих механизмах построен менеджмент серверов когда через отдельную сеть управляется состоянием сервера - без его участия, например вход в BIOS и проброс кадра видеокарты через сеть или DRM(digital rights management) логика.

HTTP2 vs Cache Proxy

Http2 убивает идею кешировантие на прокси, этот стандарт приносит передачу сразу в несколько потоков с использование приоритетов на каждый поток, но в нем не заложена идея кеширования на промежуточных узлах. Это становиться не возможно, после того как любое соединение становиться шифрованным и требует валидных сертификатов. В следствии этого нельзя несколько раз передать туже информации разным пользователям, так как для каждого соединения используются разные ключи для потока. Значит можно работать только по схеме CDN, когда на промежуточных узлах есть оригинальный сертификат и все данные перепаковываются им. Было бы замечательно, если бы существовала технология, когда данные с определённого не зашифрованного потока можно было закешировать и передавать отдельным зашифрованным каналом подписи для таких данных, а сами данные по усмотрению промежуточных узлов брались из отдельного кеша. Даже если в кеше были бы данные зашифрованные и хозяин данного кеша не мог получить эти данные в открытом виде, но оставались бы хеши от содержимого и подпись этого содержимого. Это вернет кеширование в общее потребление - и сразу несколько клиентов могли бы получать общие библиотеки по общему каналу, а подписи для этих библиотек и специфичную для пользователя информацию по другому.

Bootable usb flash

Маленькая инструкция для создания загрузочной usb flash disk: 
  1. запускаем dmesg и ищем в последних записях упоминание о usb storage, предположим, что это будет sdb
  2. пробуем отмонтировать диск umount /dev/sdb1 
  3. очищаем sudo dd if=/dev/zero of=/dev/sdb count=100 
  4. создаем заново разделы sudo fdisk /dev/sdb, в ней создаем диск нажав n и соглашаемся со всеми предложениями, записываем разделы через w 
  5. форматируем новый раздел mkfs.vfat /dev/sdb1 
  6. восстанавливаем загрузочные записи sudo apt-get install mbr && sudo install-mbr /dev/sdb
  7. если нужно, копируем нужный нам дистрибутив linux через unetbootin, или если образ создан с возможностью старта с флешки, то это все можно было не делать и просто запустить dd if=cool_dist.iso of=/dev/sdb

Thursday, May 21, 2015

Датчик освещения

Опубликовал свое первое приложение в гугл маркете, написал я его полгода назад и сразу выложил исходный код с альфа версией на маpкете, но тогда оно было доступно только ограниченному кругу тестеров, включающему только те аппараты которые мне доступны. Теперь же это 'произведение' доступно всем желающим в собранном виде. Функциональность приложения очень проста, оно берет изображение с фронтальной камеры с минимальным разрешением и заблокированной экспозицией и рассчитывает среднее значение которое ставит как значение яркости экрана. Для удобства тестирования приложение отображает значение с датчика освещения и примерное значение освещения на основе кадра фронтальной камеры.
Идей для дальнейшего улучшения может быть добавление виджета для рабочего стола или экрана блокировки, но у андроида динамическое изменение содержимого виджета и доступ к камере не доступен напрямую без хаков. Скорее это не очень красивый код получится, поэтому пока не найду, как красиво это сделать будет только явный запуск. Или добавление в ядро линукса псевдо датчика освещённости, который будет использовать камеру.

DDOS vs CDN

Текущие методики чистки трафика от паразитного как то DDOS или накручивание счетчиков представляют собой правила на блокирование трафика по регионам адресов и дополнительные проверки на живость пользователя через капчи даже скрытое от пользователя когда браузер сам высчитывает какую-то магию или проверку на какие-то специфичные свойства браузера - куки в local storage или флеше, теги в кешируемом содержимом.
Эти способы имеют не очень приглядные особенности - заблокировав людей по принципу присутствия включенного js или флеша, сразу отбрасывают людей с выключенным js или если сбойнул какой-то код или мобильных пользователей с альтернативными браузерами. При этом желающих обойти эту проблему решение лежит на поверхности - разобраться что куда ставиться и с эмулировать или запустить эмуляцию всего браузера и или если есть доступ к банерной системе - грузить этот сайт вместе со своим банером на пользовательских системах.
При ограничении трафика по адресу вы сразу отбрасываете пользователей с этого региона и теряете часть добросовестных пользователей, в случае тора для сайтов связанных с образовательной деятельностью или обсуждающих какие-то проблемы общества - мы теряем наиболее активных пользователей которым из-за ограничение трафика провайдером или из желания сохранить конфиденциальность своих интересов от третьих лиц.
Возможным решением таких проблем было бы максимальная кешируемость страниц с информацией с попыткой по максиму использовать CDN и лимитация трафика по объёму по регионам и выполнение проверок на живость только на этапе заполнения форм, когда js уже может быть жизненно важен для работоспособности.

Sunday, April 12, 2015

Vulkan или новый шанс

На данный момент реализация OpenGl для линукс отстает от последней версии на пару лет, расширения из новой версии присутствуют, но официальной поддержки четвертой версии так и нет. Есть на это две причины:
  1. intel который делает ставку на open source и постепенно реализует все версии opengl в полном объеме, но еще не опубликовал код с поддержкой этой версии;
  2. независимым разработчикам не интересно реализовывать расширения которые не являются популярными и реализуют только те части которые им кажутся нужными.
Также amd работает над драйвером для ядра который можно использовать для обоих реализаций графики: для проприетарных драйверов и открытого кода. Это позволит без обновления кода в ядра использовать проприетарные дрова с любым ядром, а для открытого кода возможность всегда иметь поддержку всех новых чипов и постараться получить максимально полную реализацию всех возможных стандартов.
Но существует шанс получить реализацию стандарта несколько быстрее: новая версия OpenGL Vulkan - базируется на открытых стандартах и должна иметь референсную реализацию всех частей для проверки валидности рендеринга. Особенность данного стандарта заключается в том что он пересматривает все традиции современного OpenGL, если традиционно библиотека полностью скрывает внутреннюю реализацию взаимодействия с видеокартой и сама следит за опустошением буферов и синхронизацией, то новый стандарт предоставляет программисту самому следить за буферами и дает абстракцию к буферам видеокарты и памяти максимально низкоуровнево и как следствие получаеться, что программист должен сам контролировать заполненость буферов и выделение памяти, ошибки не проверяються перед отправкой в устройство. И основой нового стандарта послужила API Mantle от AMD.
В результате доступно такие виды взаимодействия:
  1. апи описания памяти и флаги как обрабатывать эту память с отображением в виртуальную память процессора или использовать только внутреннюю память устройства реализуется через выбор пула памяти и характеристик сегмента;
  2. описание опкодов Spir V виртуальной машины базирующемся на байткоде llvm.
Valve c Intel уже имеют реализацию данных драйверов написанный LunarG, который они обещают полностью открыть в момент полного открытия стандарта.

Sunday, March 22, 2015

SSD performance

SSD диски SAMSUNG 840 EVO имеют неприятную особенность деградации производительности - по изначальной спецификации скорость чтения записи должна быть на уровне 400-450 Mb/s, но современем скорость падает до 100Mb/s. Или совсем запущенные случаях до 30 для случая 0,5Tb записвнных блоков для 240Gb диска. 
Возможные причины данного поведения: 
  • скрываются во внутренней структуре дисков когда диск состоит из TLC памяти и треть которой используется как кеш в виде SLC, что позволяет ускорить работу диска. Как следствие метод ускорения перенести в этот кеш наиболее часто используемые области;
  • не достаточно эффективная работа TRIM для записи информации нужно полностью очищенные области памяти так как перезапись нескольких байт не поддерживается в флеш памяти;
  • особенности процесса поддержки равномерного износа ячеек когда каждая следующая операция записи идет в следующий очищенную область памяти и при падении заряда в ячейках памяти при чтении эти данные переносятся в новую область а старая переноситься в буфер свободных областей и так по кругу. 
  • особенности чтения многоуровневой памяти - когда уровень заряда памяти постепенно падает и нужно несколько раз прочитать информацию с различными уровнями усиления пока не совпадут контрольные суммы. 

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

Для запуска этой утилиты с usb диска нужно подготовить флешку таким образом: 
  1. скачать freedos и записать на флешку;
  2. скачать утилиту для восстановления производительности Performance Restoration Software и записать на тот же диск;
  3. загрузиться с флешки без загрузки драйверов и запустить утилиту, скопированную на предыдущем шаге;
  4. выключить компьютер, не перегружаться, а именно выключить. Это нужно чтобы все буферы сбросились и диск перечитал прошивку. ( freedos поддерживает poweroff команду ). 

После этих действий производительность возвращается в заявленные производителем рамки. Для быстрой проверки можно запустить: hdparm -tT /dev/sda