Рубрика «x86» - 5

От загрузчика к ядру

Если вы читали предыдущие статьи, то знаете о моём новом увлечении низкоуровневым программированием. Я написал несколько статей о программировании на ассемблере для x86_64 Linux и в то же время начал погружаться в исходный код ядра Linux.

Мне очень интересно разобраться, как работают низкоуровневые штуки: как программы запускаются на моём компьютере, как они расположены в памяти, как ядро управляет процессами и памятью, как работает сетевой стек на низком уровне и многое другое. Итак, я решил написать еще одну серию статей о ядре Linux для архитектуры x86_64.

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

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

В этой статье мы напишем с нуля калькулятор обратной польской записи (RPN) на чистом ассемблере x86. Когда закончим, то сможем использовать его так:

$ ./calc "32+6*" # "(3+2)*6" в инфиксной нотации
30

Весь код для статьи здесь. Он обильно закомментирован и может служить учебным материалом для тех, кто уже знает ассемблер.

Начнём с написания базовой программы Hello world! для проверки настроек среды. Затем перейдём к системным вызовам, стеку вызовов, стековым кадрам и соглашению о вызовах x86. Потом для практики напишем некоторые базовые функции на ассемблере x86 — и начнём писать калькулятор RPN.
Читать полностью »

Go 1.11: AVX-512 со вкусом Go - 1

В Go 1.11 значительно обновлён ассемблер под платформу x86.

У программистов появится возможность использовать AVX-512 — новейшие инструкции, доступные в процессорах Intel.

Под катом:

  • Самые значительные обновления в cmd/asm (go tool asm)
  • Как был внедрён новый набор инструкций в Go ассемблер
  • Использование новых инструкций и специальных возможностей EVEX префикса
  • Уровень интеграции в тулчейн (рецепты обхождения текущих ограничений)

Читать полностью »

В этой статье я покажу, как написать рудиментарный, нативный x86-64 just-in-time компилятор (JIT) на CPython, используя только встроенные модули.

Код предназначен для UNIX-систем, таких как macOS и Linux, но его должно быть легко транслировать на другие системы, типа Windows. Весь код опубликован на github.com/cslarsen/minijit.

Цель — сгенерировать в рантайме новые версии нижеприведённого ассемблерного кода и выполнить их.

48 b8 ed ef be ad de  movabs $0xdeadbeefed, %rax
00 00 00
48 0f af c7           imul   %rdi,%rax
c3                    retq

В основном, мы будем иметь дело с левой частью кода — байтовой последовательностью 48 b8 ed ... и так далее. Эти 15 байтов в машинном коде составляют функцию x86-64, которая умножает свой аргумент на константу 0xdeadbeefed. На этапе JIT будут созданы функции с разными такими константами. Такая надуманная форма специализации должна продемонстрировать базовую механику JIT-компиляции.
Читать полностью »

В августе этого года компания Lenovo презентовала свою новую линейку продуктов для дата-центров под маркой ThinkSystem, в которую входят серверы, системы хранения данных и коммутаторы. Если говорить про серверную линейку, то всего в рамках новой торговой марки было представлено 14 моделей различных форм-факторов (напольных, стоечных, высокоплотных и блейд-серверов), в том числе и топовая система ThinkSystem SR950, рассчитанная на решение критически важных и ресурсоёмких задач, таких как базы данных, аналитика, ERP, CRM и, конечно же, виртуализация. Получить такую систему для обзора хотя бы на пару дней — большая удача и сегодня я постараюсь рассказать вам об этом интересном сервере как можно подробнее.

Обзор сервера Lenovo ThinkSystem SR950 - 1
Читать полностью »

В предыдущей статье мы рассказали о трендах на рынке аппаратных средств, о трансформации Lenovo и привели примеры реализованных проектов. Предлагаем вашему вниманию вторую часть рассказа об анонсе новых систем и решений Lenovo для дата-центров, где мы подробнее расскажем о платформе Intel Purley, продуктах ThinkSystem и ThinkAgile.

image
Читать полностью »

Особенности миграции c RISC на х86 в России: теперь нас держит старый банковский софт времён DOS и Netware - 1

Подозреваю, что довольно значимая часть читателей поста младше, чем эти операционные системы. Но на них в закромах Родины ещё бегает наш российский (и не только) софт. Да и вы наверняка нет-нет, да видели DOS-приклад на рабочих местах Сбербанка или в больницах.

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

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

Ага, сейчас! Программистов, кто это писал, уже нет. Исходники обычно утеряны или же написаны на языках времён мезозоя. Даже документации обычно нет. Поэтому знаете, что мы делаем? Мы заворачиваем гипервизор в гипервизор. О, это отдельная песня. Сейчас расскажу.

Читать полностью »

Быстрое удаление пробелов из строк на процессорах ARM - 1Предположим, что я дал вам относительно длинную строку, а вы хотите удалить из неё все пробелы. В ASCII мы можем определить пробелы как знак пробела (‘ ’) и знаки окончания строки (‘r’ и ‘n’). Меня больше всего интересуют вопросы алгоритма и производительности, так что мы можем упростить задачу и удалить все байты со значениями меньшими либо равными 32.

В предыдущией статье, где я задавал вопрос об удалении пробелов на скорость, лучшим ответом было использование векторизации с помощью 128-битных регистров (SSE4). Оно оказалось в 5-10 раз быстрее подхода в лоб.

Очень удобно, что во всех процессорах имеются 128-битные векторные регистры, также как в процессорах x64. Неужели процессоры ARM могут работать настолько же быстро, как процессоры x64?
Читать полностью »

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

image

Читать полностью »

Однажды мне пришлось вычислять сумму векторов целых чисел.

Звучит необычно. Кому понадобится делать это в реальной жизни? Обычно такие вычисления встречаются только в задачках из начальной школы или бенчмарках компилятора. Но сейчас это случилось на самом деле.

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

  • её можно эффективно выполнить с помощью процессорной инструкции ADC (к сожалению, эта функция недоступна в C);
  • её можно выполнить на словах любого размера (можете добавить по желанию восьмибайтные значения, только результат следует уменьшить до двух байт и добавить все биты переполнения);
  • она нечувствительна к порядку следования байтов (удивительно, но это так).

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js