Pull to refresh

Microsoft добавит эмуляцию 64-битных приложений на Windows 10 для ARM-систем

Reading time1 min
Views6.5K
image

Microsoft объявила, что добавит эмуляцию x64-приложений для ARM-систем на Windows 10. Компания пообещала, что эмуляция x64 появится в ноябре, сначала ее опробуют инсайдеры. Для широкого круга пользователей она станет доступной в 2021 году.
Читать дальше →
Total votes 7: ↑7 and ↓0+7
Comments27

Как устроена страничная организация памяти x86_64

Level of difficultyEasy
Reading time15 min
Views8.4K

В этом посте я буду говорить о страничной организации только в контексте PML4 (Page Map Level 4), потому что на данный момент это доминирующая схема страничной организации x86_64 и, вероятно, останется таковой какое-то время.

Окружение

Это необязательно, но я рекомендую подготовить систему для отладки ядра Linux с QEMU + gdb. Если вы никогда этого не делали, то попробуйте такой репозиторий: easylkb (сам я им никогда не пользовался, но слышал о нём много хорошего), а если не хотите настраивать окружение самостоятельно, то подойдёт режим практики в любом из заданий по Kernel Security на pwn.college (вам нужно знать команды vm connect и vm debug).

Я рекомендую вам так поступить, потому что считаю, что самостоятельное выполнение команд вместе со мной и возможность просмотра страниц (page walk) на основании увиденного в gdb — хорошая проверка понимания.

Читать далее
Total votes 53: ↑53 and ↓0+53
Comments0

Подмена обработчика системного вызова

Reading time6 min
Views9.6K
Всем доброго времени суток! Я студентка-второкурсница технического ВУЗа. Пару месяцев назад пришла пора выбирать себе тему курсового проекта. Темы типа калькулятора меня не устраивали. Поэтому я поинтересовалась, есть ли что-нибудь более интересное, и получила утвердительный ответ. «Подмена обработчика системного вызова» — вот моя тема.

Введение

Обработчик прерываний (или процедура обслуживания прерываний) — специальная процедура, вызываемая по прерыванию для выполнения его обработки. Эти обработчики вызываются либо по аппаратному прерыванию, либо соответствующей инструкцией в программе, и обычно предназначены для взаимодействия с устройствами или для осуществления вызова функций операционной системы (wiki).

Зачем?

Главная цель, пожалуй, наглядно на рабочей системе посмотреть как оно работает, а не «грызть» сухую теорию. Ну, или как раньше программисты пытались «делать многозадачность» в DOS, переопределяя обработчик событий таймера.
Читать дальше →
Total votes 52: ↑47 and ↓5+42
Comments32

Android NDK, Revision 10 поддерживает архитектуру Intel 64-bit

Reading time1 min
Views6.9K
Хорошая новость для разработчиков приложений под Android: новая, десятая версия Android NDK, вышедшая в июле, содержит целых три новых 64-битных ABI: arm64-v8a, x86_64 и mips64, что благоприятным образом скажется на производительности программ. Нам особенно приятно отметить появившуюся поддержку x86_64, ведь команда Intel, естественно, принимала в этой работе участие. К слову сказать, интерфейс х86 также был доработан, в частности, добавлена поддержка инструкций SSSE3. Компилятором по умолчанию для 64-битных платформ является GCC 4.9. Еще одно важное изменение: GDB обновился до версии 7.6.
И еще — Android NDK и этот блог имеют кое-что общее. А именно, начиная с этой версии, NDK автоматически умеет переводить код ARM NEON intrinsic функций в x86 intrinsics. А автор соответствующего кода — редактор блога Intel — Vikky13.
Полный список изменений.
Total votes 22: ↑20 and ↓2+18
Comments17

Расширенные инструкции процессора в .NET или «C# Intrinsics»

Reading time6 min
Views17K
В шахматных программах широко используются «битовые доски» (битборды 1, 2) для представления фигур на доске. А так же и для других игр на той же доске 8×8, и даже для карточных игр. С битбордами часто проводят различные операции, например, найти первый установленный бит или посчитать количество установленных битов. Для этих операций придумано много «хитрых» алгоритмов, а на современных процессорах некоторые из этих операций доступны в расширенном наборе инструкций. Например, popcnt, доступный в SSE4.2 ABM. Также есть пара инструкций bsf/bsr, которые доступны уже давно, но из JIT-компилятора к ним нет никакого доступа.
Конечно, всё серьёзные шахматные программы пишут на C++, но для прототипирования каких-нибудь алгоритмов хочется использовать C#, потому что я с ним лучше знаком и у меня меньше шансов выстрелить себе в ногу. Но производительность тоже не хочется терять просто так, в C/C++ интересующие нас инструкции доступны так называемые встроенные функции. Я попробовал сделать подобное решение и для C#.
Читать далее
Total votes 32: ↑31 and ↓1+30
Comments10

Google gears успешно скомпилировался для Firefox 3.5 под Linux

Reading time1 min
Views832
Гугл пока не выложил обновления, но в svn сорс уже собирается, после некоторых танцев и небольшого патча. Выкладываю версию-0.5.25.0 для Linux 64 и 32. и патч. Проверено работает на opensuse 11.1 с фоксом проинсталленым из репозиторев.

Для x86_64:
uploaded.ivlis.com/gears-linux-x86_64-opt-0.5.25.0.xpi
(md5: 6d517d64e8ca4408b2d75572f501c3e1)

Для i386:
uploaded.ivlis.com/gears-linux-opt-0.5.25.0_0.xpi
(md5: 9da04e7e04ea9bbb41c52f9d3d7b57eb)

Для osX (Спасибо kovpas):
kovpas.ru/ggears/gears-osx-opt-0.5.25.0.xpi

Как собирать:
Total votes 42: ↑34 and ↓8+26
Comments32

ARM серверы — более производительные и более дешёвые

Reading time3 min
Views19K

В этом году Apple потрясла рынок десктопных процессоров чипом Apple M1 и устройствами на нём. Похожее событие произошло в мире облачных вычислений в прошлом году. AWS выпустили новый тип сервера на собственных ARM процессорах Graviton2. По заявлениям Amazon, соотношение производительности к цене у новых процессоров на 40% выше, чем у аналогов на x86. Ещё одно недавнее обновление - сервера Amazon RDS (облачный сервис, предоставляющий сервера баз данных) на Graviton2. Я запустил несколько бенчмарков и нагрузочный тест реального бэкенд приложения, чтобы проверить настолько ли хороши сервера на ARM процессорах и узнать какие проблемы совместимости могут возникнуть.

Читать далее
Total votes 24: ↑22 and ↓2+20
Comments14

Сэмулируй сборку приложения ARM на x86 процессоре на примере Qt

Reading time14 min
Views17K
Мощность современных процессоров растёт, как в стационарных компьютерах, так и в различных embedded устройствах, на борту которых процессоры на базе ARM с операционной системой linux. Сегодня в рамках данной статьи мы запустим эмулятор процессора ARM на x86 компьютере и в нём попробуем собрать Qt из исходников и тестовое приложение, т.е. так сказать сиэмулируем сборку ARM приложения.

В первой части статьи будем использовать эмулятор QEMU для aarch64, во второй части запустим эмулятор Raspberry и проверим работоспособность приложения в нём.

От себя хочу отметить, это все делается не быстро, и если Вы попробуете все это выполнить, то полный цикл займет у вас несколько дней!)


Читать дальше →
Total votes 16: ↑16 and ↓0+16
Comments7

64 бита

Reading time12 min
Views79K

Статья раскрывает смысл термина «64 бита». В статье кратко рассмотрена история развития 64-битных систем, описаны наиболее распространенные на данный момент 64-битные процессоры архитектуры Intel 64 и 64-битная операционная система Windows.
Читать дальше →
Total votes 126: ↑108 and ↓18+90
Comments82

Eclipse и Windows 64

Reading time2 min
Views628
После приобретения нового ноута (его обзор на Хабре) с установленной 64разрядной Windows 7 встал вопрос о миграции процесса Eclipse разработки. Если с workspac'ами все прошло вполне безболезненно, то сама платформа преподнесла неприятный сюрприз:
на основной странице для скачивания различных редакции Eclips'а не доступна 64 разрядная версия для Windows.
Читать дальше →
Total votes 7: ↑4 and ↓3+1
Comments6

64-битная Haiku и порт OpenJDK уже не за горами

Reading time3 min
Views2.4K
Алекс Смит, студент Haiku GSoC 2012, сообщает, что добился существенного прогресса в работе над портированием ядра Haiku на платформу x86_64. Вся функциональность ядра, за исключением дебаггера, уже доступна, также он портировал некоторые драйверы, включая PCI, драйверы дисков, BFS и PS/2 ввод. Для большинства драйверов портирование заключалось в исправлении ошибок компилятора. С другими были проблемы, связанные с 64-битной разрядностью, что сделало их портирование более проблематичным.
Читать дальше →
Total votes 36: ↑33 and ↓3+30
Comments18

Перезагрузка текстур OpenGLESv2 через DMABUF

Reading time9 min
Views3.5K

В этой статье я хочу рассказать, как просто можно обновлять текстуры OpenGLES через DMABUF. Поискал по Хабру и к своему удивлению не обнаружил ни одной статьи на эту тему. В Хабр Q&A тоже ничего такого не нашел. И это для меня немного странно. Технология появилась довольно давно, хотя информации о ней действительно в сети не много, вся она расплывчатая и противоречивая.

Я всю эту информацию собирал по крупицам из разных источников, прежде чем смог написать вот такой видео плеер, как на демке выше. Здесь, на демке, мой самописный видео плеер, основанный на библиотеке gstreamer, загружает видео кадры в текстуру OpenGLESv2 каждый раз перед рендерингом. Работает на Raspberry Pi4. Кадры просто копируются в специальным образом выделенную память — а уж DMA переносит их в память GPU, в текстуру. Далее расскажу, как я это делал.
Total votes 12: ↑12 and ↓0+12
Comments13

Префиксы в системе команд IA-32

Reading time4 min
Views15K
Сегодня я хочу рассказать вам о префиксах в системе команд Intel IA-32 в 32- и 64-битных вариантах (также именуемых как x86 и x86_64). Но для начала напомню вкратце общую структуру IA-32 инструкции:



  • Префиксы. Могут отсутствовать. Может присутствовать сразу несколько.
  • Опкод. Может состоять из одного, двух или трех байтов.
  • Mod_R/M байт. Используется для адресации операндов. Может отсутствовать в кодировке, если инструкция не имеет явных операндов.
  • SIB (Scale Index Base) байт. Второй байт, использующийся для адресации операндов в памяти. Может отсутствовать.
  • Байт смещения адреса (англ. displacement). 1, 2, 4 или ни одного байта.
  • Константа (англ. immediate). 1, 2, 4 или ни одного байта.

Читать дальше →
Total votes 26: ↑24 and ↓2+22
Comments11

Правильно ли работает ваш дизассемблер?

Reading time3 min
Views14K
Сегодня я хочу рассказать об одной интересной сложности декодирования/дизассемблирования IA-32 инструкций.

Перед прочтением этой статьи рекомендую обратиться в статье «Префиксы в системе команд IA-32», описывающей общую структуру IA-32 команды и существующие префиксы. В этой статье я подробнее расскажу про обязательные префиксы (англ. mandatory prefixes) и некоторые нюансы, связанные с ними.
Читать дальше →
Total votes 49: ↑47 and ↓2+45
Comments18

Десять имён для одной архитектуры

Reading time3 min
Views129K

На пятничном семинаре учебного проекта лаборатории МФТИ-Интел один из студентов задал мне примерно такой вопрос: а почему 64-битный вариант архитектуры процессоров Intel называется x64, а 32-битный — x86? Я начал объяснять, что не всё так просто. Захотелось нарисовать более полную картину. Ведь на самом деле это не x64, и даже не x86.
Читать дальше →
Total votes 112: ↑102 and ↓10+92
Comments51

Return oriented programming. Собираем exploit по кусочкам

Reading time8 min
Views27K
Введение
В этой статье мы попробуем разобраться как работает Return Oriented эксплоит. Тема, в принципе, так себе заезженная, и в инете валяется немало публикаций, но я постараюсь писать так, чтобы эта статья не была их простой компиляцией. По ходу нам придется разбираться с некоторыми системными особенностями Linux и архитектуры x86-64 (все нижеописанные эксперименты были проведены на Ubuntu 14.04). Основной целью будет эксплуатирование тривиальной уязвимости gets с помощью ROP (Return oriented programming).
Читать дальше →
Total votes 39: ↑38 and ↓1+37
Comments4

[CppCon 2017] Matt Godbolt: Что мой компилятор сделал для меня?

Reading time11 min
Views19K

Продолжение цикла обзорных статей с конференции CppCon 2017.



На этот раз очень интересное выступление от автора Compiler Explorer (godbolt.org). Обязательно читать всем, кто для быстроты умножает на 2 с помощью сдвига (по крайней мере, на x86-64). Если вы знакомы с ассемблером x86-64, то можете перемотать до разделов с примерами ("Умножение", "Деление" и т.д). Далее слова автора. Мои комментарии в квадратных скобках курсивом.


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


Total votes 31: ↑31 and ↓0+31
Comments3

Сколько инструкций процессора использует компилятор?

Reading time3 min
Views34K
Месяц назад я попытался сосчитать, сколько разных инструкций поддерживается современными процессорами, и насчитал 945 в Ice Lake. Комментаторы затронули интересный вопрос: какая часть всего этого разнообразия реально используется компиляторами? Например, некто Pepijn de Vos в 2016 подсчитал, сколько разных инструкций задействовано в бинарниках у него в /usr/bin, и насчитал 411 — т.е. примерно треть всех инструкций x86_64, существовавших на тот момент, не использовались ни в одной из стандартных программ в его ОС. Другая любопытная его находка — что код для x86_64 на треть состоит из инструкций mov. (В общем-то известно, что одних инструкций mov достаточно, чтобы написать любую программу.)

Я решил развить исследование de Vos, взяв в качестве «эталонного кода» компилятор LLVM/Clang. У него сразу несколько преимуществ перед содержимым /usr/bin неназванной версии неназванной ОС:

  1. С ним удобно работать: это один огромный бинарник, по размеру сопоставимый со всем содержимым /usr/bin среднестатистического линукса;
  2. Он позволяет сравнить разные ISA: на releases.llvm.org/download.html доступны официальные бинарники для x86, ARM, SPARC, MIPS и PowerPC;
  3. Он позволяет отследить исторические тренды: официальные бинарники доступны для всех релизов начиная с 2003;
  4. Наконец, в исследовании компиляторов логично использовать компилятор и в качестве подопытного объекта :-)

Начну со статистики по мартовскому релизу LLVM 10.0:
ISA Размер бинарника Размер секции .text Общее число инструкций Число разных инструкций
AArch64   97 МБ 74 МБ 13,814,975 195
ARMv7A 101 МБ 80 МБ 15,621,010 308
i386 106 МБ 88 МБ 20,138,657 122
PowerPC64LE 108 МБ 89 МБ 17,208,502 288
SPARCv9 129 МБ 105 МБ 19,993,362 122
x86_64 107 МБ 87 МБ 15,281,299 203
В прошлом топике комментаторы упомянули, что самый компактный код у них получается для SPARC. Здесь же видим, что бинарник для AArch64 оказывается на треть меньше что по размеру, что по общему числу инструкций.

А вот распределение по числу инструкций:
Читать дальше →
Total votes 93: ↑92 and ↓1+91
Comments226

Что нужно знать, если вы хотите вызывать Go функции из ассемблера

Reading time9 min
Views5.4K
You've run into a really hairy area of asm code.
My first suggestion is not try to call from assembler into Go. — Ian Lance Taylor

До тех пор, пока ваш ассемблерный код делает что-то простое, всё выглядит неплохо.


Как только у вас возникает задача вызвать из ассемблерного кода Go функцию, один из первых советов, который вам дадут: не делайте так.


Но что если вам это очень-очень нужно? В таком случае, прошу под кат.


Читать дальше →
Total votes 28: ↑25 and ↓3+22
Comments14

.NET Core: интринсики x86_64 на виртуальных машинах

Reading time4 min
Views5.9K
Мы живём в эпоху доминирования архитектуры x86. Все x86-совместимые процессоры похожи, но и все при этом немного отличаются. И не только производителем, частотой и количеством ядер.

Архитектура x86 за время своего существования (и популярности) пережила много крупных апдейтов (например, расширение до 64 бит — x86_64) и добавлений «расширенных наборов инструкций». К этому приходится подстраиваться и компиляторам, которые по-умолчанию генерируют максимально общий для всех процессоров код. Но среди расширенных инструкций есть много интересного и полезного. Например, в шахматных программах часто используются инструкции для работы с битами: POPCNT, BSF/BSR (или более свежие аналоги TZCNT/LZCNT), PDEP, BSWAP и т.д.

В компиляторах C и C++ явный доступ к таким инструкциям реализован через «присущие (intrinsic) данному процессору функции». пример1 пример2

Для .NET и C# такого удобного доступа не существовало, поэтому когда-то давно я сделал свою обёртку, которая предоставляла эмуляцию таких функций, но если CPU их поддерживал, то заменяла их вызов прямо в вызывающем коде. Благо, большинство нужных мне интринсиков помещались в 5 байт опкода CALL. Подробности можно почитать на хабре по этой ссылке.

С тех пор прошло много лет, в .NET нормальных интринсиков так и не появилось. Но вышел .NET Core, в котором ситуацию исправили. Сначала появились векторные инструкции, в потом и почти весь* набор System.Runtime.Intrinsics.X86.
* — нет «устаревших» BSF и BSR

И всё вроде-бы стало хорошо и удобно. Если не считать того, что определение поддержки каждого набора инструкций всегда было запутанным (какие-то включаются сразу наборами, для каких-то есть отдельные флаги). Так .NET Core запутало нас ещё сильнее с тем, что между «разрешёнными» наборами есть ещё и какие-то зависимости.
Читать дальше →
Total votes 19: ↑19 and ↓0+19
Comments1
1