Какие операционные системы поддерживает платформа x86. X86 или x64: Что это значит? Частота работы ядра

Всем доброго времени суток дорогие посетители блога айтишнега… У меня довольно часто интересуются — x86 это 32 или 64 битная Windows? Поддаваясь логике — можно предположить что x86 явно больше чем x64, но на практике оказывается что x86 равно x32… но тогда почему так пишут и кому надо ударить по голове, чтобы такой путаницы не было?

А теперь давайте я просто взорву вам мозг — x86 равно x32, и внимание, равна x64 — вы были к такому готовы? — думаю нет… теперь давайте разбираться что, как и куда! Чтобы ответить на этот не самый простой вопрос нам нужно вернуться на несколько десятилетий назад, именно оттуда и идет вся эта заварушка.

По голове надо настучать авторам, которые пишут в требованиях к компьютеру x86 и x64 в связке. Писать такое — грубая ошибка, но этим грешат все… x86 — это архитектура процессора, которая отлично себя чувствует и на 64 битных процессорах и на 32 битных! Маркировка x86 пошла от названия первого процессора от компании Intel i8086 и более новых моделей. Потом первые цифры менялись и сокращенно их объединяли x86 на конце модели — этакая линейка процессоров. Конечно же это было очень давно и процессоры маркируются совершенно по другому, но x86 прочно засела в документации и частенько вводит людей в путаницу… которые особо то не интересовались архитектурой процессоров и не вникали в историю их создания

x86 это 32 или 64 битная Windows?

x86 — это не разрядность, а архитектура… но как показала практика — x86 приравняли к 32 битной операционной системе. Если пренебречь всеми правилами, то можно сказать да, x86 равна 32 битной системе в большинстве случаев.

Правильный вариант обозначения выглядел бы примерно так для 32 разрядной операционной системы (OS_WINDOWS_x86_32bit) или так для 64 битной (OS_WINDOWS_x86_64bit) , но у нас все поперепутали!

Тут еще нюанс в том, что 32 битные процессоры уже очень и очень продолжительное время были единственными на рынке, и они были архитектуры x86… а когда вышли 64 разрядные — их стали обозначать x64, а для 32 биток оставили все как есть!

x32 или x64 — Что лучше?

В плане производительности конечно же 64 разрядная операционная система имеет явное преимущество, а вот 32 разрядная ОС очень ужата в ресурсах оперативной памяти. 32 битка не может адресовать более 4 гигабайт оперативной памяти, но по факту она видит не более 3,25 гигабайт из четырех! Однако некоторые приложения могут не запуститься на 64 битной WIndows — что и является сдерживающим фактором перехода но новую ОС.

x86-64 - 64-битное расширение для архитектуры x86, разработанное компанией AMD, позволяющее выполнять программы в 64-разрядном режиме.

История

Оригинальная спецификация разработана компанией AMD в 2000 г. Первым процессором, реализовавшим архитектуру, стал AMD K8 (выпущен в 2003 г.).

В те годы (конец девяностых и начало двухтысячных) компании HP и Intel разрабатывали свою 64-битную архитектуру IA-64 (Intel Itanium). Но она была кардинально другой, основана на принципе VLIW (very long instruction word), и была несовместима с 32-битной архитектурой x86. Из-за того, что огромная масса ранее написанного софта не работала на IA-64, этой архитектуре не удалось завоевать популярность. Хотя в конце 2001 года для IA-64 была выпущена специальная версия Windows XP 64-bit for IA-64.

Архитектура x86 ведёт свою историю с 1978 г., начиналась как 16-битная, в 1985 г. стала 32-битной. Архитектура обладает большим количеством костылей для обратной совместимости. Ей предрекали смерть вместе с 32-разрядыми вычислениями. Однако появление x86-64 дало ей новую жизнь.

Именование

Существует несколько вариантов названий этой технологии, которые иногда приводят к путанице.

  • x86-64 - первоначальный вариант. Именно под этим названием фирмой AMD была опубликована первая предварительная спецификация.
  • x64 - официальное название версий операционных систем Windows, также используемое как название архитектуры фирмами Microsoft и Oracle.
  • AMD64 - после выпуска первых процессоров Clawhammer и Sledgehammer в названии архитектуры появилось название фирмы-разработчика AMD. Сейчас является официальным для реализации AMD.
  • EM64T - первое официальное название реализации Intel. Расшифровывалось как Extended Memory 64 Technology.
  • Intel 64 - текущее официальное название архитектуры Intel.

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

Часто пользователи путают архитектуру x86-64 с IA-64. Во избежание подобных ошибок следует помнить, что Intel 64 и IA-64 - это совершенно разные, несовместимые между собой микропроцессорные архитектуры. В 2017 году вы вряд ли встретите где-либо процессор архитектуры IA-64 (Itanium).

Распространённость

Суперкомпьютеры

В списке суперкомпьютеров TOP-500 архитектура x86-64 вытеснила ранее популярные RISC-архитектуры и 32-битные версии. Intel пыталась продвигать свой Itanium (макс. доля достигнута в 2004 г.), но безуспешно.

Дата-центры

Servers using x86 chips still maintain a more than 90 percent market share. http://www.common.org/servers/x86-servers-data-center/

Во всех дата-центрах корпорации Google сейчас используются процессоры Intel с известной всем архитектурой x86. Тем не менее, корпорация Google планирует использовать и альтернативные решения. https://habrahabr.ru/company/ibm/blog/282820/

В 2017 году алгоритмы обработки больших объёмов информации в подавляющем большинстве случаев выполняются именно на архитектуре x86-64, поэтому мы и рассматриваем её в магистратуре АиСОБОИ.

Регистры

Архитектура x86-64 имеет:

  • 16 целочисленных 64-битных регистров общего назначения (RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, R8 - R15);
  • 8 80-битных регистров с плавающей точкой (ST0 - ST7);
  • 8 64-битных регистров MMX (MM0 - MM7, имеют общее пространство с регистрами ST0 - ST7);
  • 16 128-битных регистров SSE (XMM0 - XMM15);
  • 64-битный указатель RIP и 64-битный регистр флагов RFLAGS.

Операции над 64-битными регистрами (сложение, вычитание и пр.) работают столько же времени, сколько операции над 32-битными регистрами.

Может показаться удивительным, но операции над младшими 32-битными половинами регистров обнуляют старшие 32 бита. Например,

mov eax, ebx

автоматически занулит старшие биты в rax.

Так сделано для оптимизации. Это позволяет процессору разрывать цепочки зависимостей (не надо ждать, пока посчитаются старшие биты, для продолжения операций с младшими, потому что старшие почти наверняка никому не будут нужны).

Современный процессор устроен очень сложно. Модель процессора, описанная в руководстве по архитектуре, плохо описывает реальный механизм работы современного ядра. В частности, понятие регистров процессора не соответствует действительности, «в железе» нет такой вещи, как регистр eax или rax. Понятие регистров процессора виртуализируется. Эта технология называется переименованием регистров (register renaming). Декодер команд выделяет регистр из большого банка регистров. Когда инструкция завершается, значение этого динамически распределенного регистра записывается обратно в любой регистр, в котором в настоящее время хранится значение, скажем, rax. Чтобы сделать эту работу эффективно и одновременно выполнять несколько инструкций, очень важно, чтобы операции не имели взаимозависимости. Плохо, когда значение регистра зависит от других инструкций.

Инструкции

x86-64 относится к типу CISC (complex instruction set computing). Является чуть ли не единственной современной CISC-архитектурой. Другие популярные архитектуры строятся по принципу RISC (reduced instruction set computer).

При этом современные х86-процессоры, хотя и CISC-совместимы, но являются процессорами с RISC-ядром, и в формальном смысле считаются гибридными. В таких гибридных CISC-процессорах CISC-инструкции преобразовываются в набор внутренних RISC-команд, при этом одна команда x86 может порождать несколько RISC-команд, исполнение команд происходит на суперскалярном конвейере одновременно по несколько штук. Небольшие инструкции легко выполнять одновременно.

Инструкции кодируются последовательностью байт переменной длины, на практике от 1 до 15 байт.

Ликвидированные возможности

В x86-64 по сравнению с x86 удалили некоторые устаревшие инструкции. Это двоично-десятичная арифметика BCD и инструкции типа aam (ASCII adjust for multiplication). Большая часть устаревших инструкций, тем не менее, оставлена.

Режимы

Процессоры данной архитектуры поддерживают два режима работы: Long mode («длинный» режим) и Legacy mode («унаследованный», режим совместимости с 32-битным x86).

Long mode

«Длинный» режим - «родной» для процессоров x86-64. Этот режим даёт возможность воспользоваться всеми дополнительными преимуществами, предоставляемыми архитектурой. Для использования этого режима необходима 64-битная операционная система.

Этот режим позволяет выполнять 64-битные программы; также (для обратной совместимости) предоставляется поддержка выполнения 32-битного кода, например, 32-битных приложений, хотя 32-битные программы не смогут использовать 64-битные системные библиотеки, и наоборот. Чтобы справиться с этой проблемой, большинство 64-разрядных операционных систем предоставляют два набора необходимых системных файлов: один - для родных 64-битных приложений, и другой - для 32-битных программ.

Legacy mode

Данный «унаследованный» режим позволяет процессору выполнять инструкции, рассчитанные для процессоров x86, и предоставляет полную совместимость с 32-битным кодом и операционными системами. В этом режиме процессор ведёт себя точно так же, как x86-процессор, например Athlon или Pentium III, и дополнительные функции, предоставляемые архитектурой x86-64 (например, дополнительные регистры), недоступны. В этом режиме 64-битные программы и операционные системы работать не будут.

Этот режим включает в себя подрежимы:

  • Реальный режим (real mode)
  • Защищённый режим (protected mode)
  • Режим виртуального 8086 (virtual 8086 mode)

Реальный режим использовался в MS-DOS, в реальном режиме выполнялся код BIOS при загрузке компьютера. Защищённый режим используется в 32-битных версиях современных многозадачных операционных систем. Режим виртуального 8086 - подрежим защищённого, предназначался главным образом для создания т. н. «виртуальных DOS-машин». Если из 32-битной версии Windows вы запускаете 16-битное DOS-приложение, то работает эмулятор NTVDM, который использует этот режим процессора. Другой эмулятор, DOSBox, не использует этот режим V86, а выполняет полную эмуляцию.

Переход между режимами

Из длинного режима нельзя перейти в реальный или режим виртуального 8086 без перезагрузки. Поэтому в 64-битных версиях Windows не работает NTVDM и нельзя запускать 16-битные программы.

Самый современный процессор x86-64 полностью поддерживает реальный режим. Если загрузка выполняется через BIOS, то код загрузчика (из сектора #0) исполняется в реальном режиме. Однако если вместо BIOS используется UEFI, то переход в Long mode происходит ещё раньше, и никакого кода в реальном режиме уже не выполняется. Можно считать, что современный компьютер сразу начинает работать в 64-битном длинном режиме.

Трансляция адресов в памяти

Упрощённо говоря, процессор обращается к памяти через шину. Адресами памяти, которыми обмениваются в шине, являются физические адреса, то есть сырые числа от нуля до верхней границы доступной физической памяти (например, до 2 33 , если у вас установлено 8 ГБ оперативки). Ранее между процессором и микросхемами памяти располагался северный мост, но в реализации Intel начиная с Sandy Bridge он интегрирован на кристалл процессора.

Физические адреса являются конкретными и окончательными - без трансляции, без подкачки, без проверки привилегий. Вы выставляете их на шину и всё. Однако программы используют адреса логической памяти, которые должны быть оттранслированы в физические адреса до того, как будет выполнен доступ к памяти. Концептуально трансляция выглядит следующим образом:

Это не физическая схема, а только описание процесса преобразования адресов.

Трансляция начинается, когда CPU выполняет инструкцию, которая ссылается на адрес памяти. Первым шагом является перевод этого логического адреса в линейный адрес. Но, спрашивается, зачем это делать вместо того, чтобы напрямую использовать линейные адреса в программе? Это результат эволюции. Чтобы действительно понять смысл сегментации x86, нам нужно вернуться в 1978 год.

Сегментация памяти в реальном режиме

16-битный процессор 8086 использовал 16-битные регистры и мог напрямую адресовать только 2 16 байт памяти. Инженеры придумывали, как же можно заставить его работать с большим объёмом памяти, не расширяя разрядность регистров.

Были придуманы сегментные регистры, которые должны были задавать, к какому именно 64-килобайтному куску памяти относится данный 16-битный адрес.

Решение выглядит логичным: сначала вы устанавливаете сегментный регистр, по сути говоря “так, я хочу работать с куском памяти начиная с адреса X”; затем 16-битный адрес уже используется как смещение в рамках этого куска.

Всего предусматривалось сначала четыре 16-битных сегментных регистра, потом добавили ещё два:

  • CS = Code Segment
  • DS = Data Segment
  • ES = Destination Segment
  • SS = Stack Segment

Для вычисления линейного адреса ячейки памяти процессор вычисляет физический адрес начала сегмента - умножает сегментную часть виртуального адреса на число 16 (или, что то же самое, сдвигает её влево на 4 бита), а затем складывает полученное число со смещением от начала сегмента. Таким образом, сегменты частично перекрывались, и всего можно было адресовать около 1 МБ физической памяти. Спрашивается, почему не умножать значение сегментного регистра сразу на 65536, ведь тогда можно было бы адресовать 4 ГБ памяти. Тогда это было не нужно и только растило стоимость чипа.

В реальном режиме отсутствует защита памяти и разграничение прав доступа.

Программы были маленькие, поэтому их стек и код полностью помещались в 64 КБ, не было проблем. В языке C тех древних времён обычный указатель был 16-битный и указывал относительно сегмента по умолчанию, однако существовали также far-указатели, которые включали в себя значение сегментного регистра.

#include int main() { char far * p = (char far * ) 0x55550005 ; char far * q = (char far * ) 0x53332225 ; * p = 80 ; (* p) ++; printf ("%d" ,* q) ; return 0 ; }

Тут оба указателя указывают на один и тот же физический адрес 0x55555 .

Защищённый режим

В 32-битном защищенном режиме также используется сегментированная модель памяти, однако уже организованная по другому принципу: расположение сегментов описывается специальными структурами (таблицами дескрипторов), расположенными в оперативной памяти.

Сегменты памяти также выбираются все теми же сегментными регистрами. Значение сегментного регистра (сегментный селектор) больше не является сырым адресом, но вместо этого представляет собой структуру такого вида:

Существует два типа дескрипторных таблиц: глобальная (GDT) и локальная (LDT). Глобальная таблица описывает сегменты операционной системы и разделяемых структур данных, у каждого ядра своя. Локальная таблица может быть определена для каждой конкретной задачи (процесса). Бит TI равен 0 для GDT и 1 для LDT. Индекс задаёт номер дескриптора в таблице дескрипторов сегмента. Поле RPL расшифровывается как Requested Privilege Level.

Сама таблица представляет собой просто массив, содержащий 8-байтные записи (дескрипторы сегмента), где каждая запись описывает один сегмент и выглядит так:

Помимо базового адреса сегмента дескрипторы содержат размер сегмента (точнее, максимально доступное смещение) и различные атрибуты сегментов, использующиеся для защиты памяти и определения прав доступа к сегменту для различных программных модулей. Базовый адрес представляет собой 32-битный линейный адрес, указывающий на начало сегмента, а лимит определяет, насколько большой сегмент. Добавление базового адреса к адресу логической памяти дает линейный адрес (никакого умножения на 16 уже нет). DPL (Descriptor Privilege Level) - уровень привилегий дескриптора; это число от 0 (наиболее привилегированный, режим ядра) до 3 (наименее привилегированный, пользовательский режим), которое контролирует доступ к сегменту.

Когда CPU находится в 32-битных режимах, регистры и инструкции могут в любом случае адресовать всё линейное адресное пространство. Итак, почему бы не установить базовый адрес в ноль и позволить логическим адресам совпадать с линейными адресами? Intel называет это «плоской моделью», и это именно то, что делают современные ядра x86. Это эквивалентно отключению сегментации.

Длинный режим

На архитектуре x86-64 в длинном (64-битном) режиме сегментация не используется. Для четырёх сегментных регистров (CS, SS, DS и ES) базовый адрес принудительно выставляются в 0. Сегментные регистры FS и GS по-прежнему могут иметь ненулевой базовый адрес. Это позволяет ОС использовать их для служебных целей.

Например, Microsoft Windows на x86-64 использует GS для указания на Thread Environment Block, маленькую структурку для каждого потока, которая содержит информацию об обработке исключений, thread-local-переменных и прочих per-thread-сведений. Аналогично, ядро Linux использует GS-сегмент для хранения данных per-CPU.

Практика: просмотр регистров

(gdb) info registers rax 0x40052d 4195629 rbx 0x0 0 rcx 0x0 0 rdx 0x7fffffffde78 140737488346744 rsi 0x7fffffffde68 140737488346728 rdi 0x1 1 rbp 0x7fffffffdd80 0x7fffffffdd80 rsp 0x7fffffffdd80 0x7fffffffdd80 r8 0x7ffff7dd4e80 140737351863936 r9 0x7ffff7dea700 140737351952128 r10 0x7fffffffdc10 140737488346128 r11 0x7ffff7a32e50 140737348054608 r12 0x400440 4195392 r13 0x7fffffffde60 140737488346720 r14 0x0 0 r15 0x0 0 rip 0x400531 0x400531 eflags 0x246 [ PF ZF IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0

Кольца защиты

Вы, вероятно, знаете интуитивно, что приложения имеют ограниченные полномочия на компьютерах Intel x86 и что только код операционной системы может выполнять определенные задачи. Как это работает? Уровни привилегий x86 - механизм, с помощью которого ОС и ЦП ограничивают возможности программ пользовательского режима. Существует четыре уровня привилегий: от 0 (наиболее привилегированных) до 3 (наименее привилегированных) и три основных ресурса: память, порты ввода-вывода и возможность выполнения определенных машинных инструкций. В любой момент времени процессор x86 работает на определенном уровне привилегий, который определяет, какой код может и не может сделать. Эти уровни привилегий часто описываются как защитные кольца, причем самое внутреннее кольцо соответствует самым высоким привилегиям. Большинство современных ядер x86 используют только Ring 0 и Ring 3.

Виртуальное адресное пространство

Хотя виртуальные адреса имеют разрядность в 64 бита, текущие реализации (и все чипы, которые находятся на стадии проектирования) не позволяют использовать всё виртуальное адресное пространство из 2 64 байт (16 экзабайт). Это будет примерно в четыре миллиарда раз больше виртуального адресного пространства на 32-битных машинах. В обозримом будущем большинству операционных систем и приложений не потребуется такое большое адресное пространство, поэтому внедрение таких широких виртуальных адресов просто увеличит сложность и расходы на трансляцию адреса без реальной выгоды. Поэтому AMD решила, что в первых реализациях архитектуры фактически при трансляции адресов будут использоваться только младшие 48 бит виртуального адреса.

Кроме того, спецификация AMD требует, что старшие 16 бит любого виртуального адреса, биты с 48-го по 63-й, должны быть копиями бита 47 (по принципу sign extension). Если это требование не выполняется, процессор будет вызывать исключение. Адреса, соответствующие этому правилу, называются «канонической формой». Канонические адреса в общей сложности составляют 256 терабайт полезного виртуального адресного пространства. Это по-прежнему в 65536 раз больше, чем 4 ГБ виртуального адресного пространства 32-битных машин.

Это соглашение допускает при необходимости масштабируемость до истинной 64-разрядной адресации. Многие операционные системы (включая семейство Windows NT и GNU/Linux) берут себе старшую половину адресного пространства (пространство ядра) и оставляют младшую половину (пользовательское пространство) для кода приложения, стека пользовательского режима, кучи и других областей данных. Конструкция «канонического адреса» гарантирует, что каждая совместимая с AMD64 реализация имеет, по сути, две половины памяти: нижняя половина «растет вверх» по мере того, как становится доступнее больше виртуальных битов адреса, а верхняя половина - наоборот, вверху адресного пространства и растет вниз.

Первые версии Windows для x64 даже не использовали все 256 ТБ; они были ограничены только 8 ТБ пользовательского пространства и 8 ТБ пространства ядра. Всё 48-битное адресное пространство стало поддерживаться в Windows 8.1, которая была выпущена в октябре 2013 года.

Структура таблицы страниц

Вместо двухуровневой системы таблиц страниц, используемой системами с 32-битной архитектурой x86, системы, работающие в длинном режиме, используют четыре уровня таблицы страниц.

Возможные размеры страниц:

  • 4 KB (2 12 байт) - наиболее часто используется (как и в x86)
  • 2 MB (2 21 байт)
  • 1 GB (2 30 байт)

Полная иерархия сопоставления страниц размером 4 КБ для всего 48-битного пространства займет немногим больше 512 ГБ ОЗУ (около 0.195% от виртуального пространства 256 ТБ).

Практика: как скоро оно упадёт?

Понятно, что данный код по стандарту некорректен, содержит Undefined Behavior, а раз так, то компилятор может сделать что угодно, например не упасть вообще. Но тем не менее, если запускать на x86-64, то падает оно в определённый момент...

#include #include char buf[ 1 ] ; #define PAGE_SIZE 4096 int main() { char * ptr = buf; for (;; ) { int offset = (intptr_t ) ptr % PAGE_SIZE; printf ("%p: offset = %d\n " , ptr, offset) ; * ptr = "a" ; // Segmentation fault expected! ++ ptr; } return 0 ; }

Организация стека и вызова функций

В x86-64 по сравнению с x86 заметно выросло число регистров общего назначения (вдвое), что не может не радовать. Поэтому больше регистров можно использовать для передачи аргументов в функции, при этом меньше использовать стек в памяти, тем самым вызов функции ускоряется.

Стек в x86

Стек растёт вниз. Вершина стека на самом деле имеет наименьший адрес.

Используется специальный регистр rsp (Stack Pointer).

Инструкция

Push rax

эквивалентна

Sub rsp, 8 mov , rax

Инструкция

эквивалентна

Mov rax, add rsp, 8

Соглашение вызова в Linux

В Linux и других ОС используется соглашение System V AMD64 ABI.

Для простоты мы ограничимся целочисленными аргументами и указателями.

Первые шесть аргументов передаются через регистры:

Если этого не хватает, то седьмой аргумент уже передаётся через стек.

Если функция хочет использовать регистры rbx, rbp и r12–r15, она перед выходом обязана их вернуть в первоначальное состояние.

Возвращаемое значение до 64 бит сохраняется в rax, до 128 бит - в rax и rdx.

Фрейм стека

Для такой функции

long myfunc(long a, long b, long c, long d, long e, long f, long g, long h) { long xx = a * b * c * d * e * f * g * h; long yy = a + b + c + d + e + f + g + h; long zz = utilfunc(xx, yy, xx % yy) ; return zz + 20 ; }

стек будет иметь такой вид:

Красная зона (red zone)

128-байтовая область за пределами места, на которое указывает rsp, считается зарезервированной и не должна изменяться обработчиками сигналов или прерываний. Функции могут использовать эту область для временных данных, которые не нужны для вызовов функций. В частности, листовые функции (из которых не вызываются другие функции) могут использовать эту область для всего кадра стека, а не изменять указатель стека rsp в начале и конце выполнения.

Это оптимизация. Уменьшение и увеличение rsp - это уже две инструкции, их можно сэкономить.

Например:

long utilfunc(long a, long b, long c) { long xx = a + 2 ; long yy = b + 3 ; long zz = c + 4 ; long sum = xx + yy + zz; return xx * yy * zz + sum; }

Сохранение базового указателя фрейма

Указатель rbp (и его предшественник ebp на x86), будучи стабильной «привязкой» к началу фрейма стека во время выполнения функции, очень удобен для ручного программирования и для отладки. Однако некоторое время назад было замечено, что коду, который генерируется компилятором, rbp действительно не нужен (компилятор может легко отслеживать смещения из rsp).

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

gcc сохраняет базовый указатель по умолчанию на x86, но позволяет оптимизировать с помощью флага компиляции -fomit-frame-pointer .

Во всяком случае, еще одна «новинка», которую представил AMD64 ABI, делает базовый указатель явно необязательным. gcc придерживается этой рекомендации и по умолчанию опускает указатель фрейма на x64 при компиляции с оптимизацией. Он дает возможность сохранить его, указав флаг -fno-omit-frame-pointer .

Соглашение вызова в Windows

Ура, больше никаких cdecl/stdcall/fastcall/thiscall/register/safecall, осталось только одно соглашение вызова! Но нет, Microsot разработал vectorcall...

Первые четыре аргумента передаются через регистры: rcx, rdx, r8, r9.

Регистры rbx, rbp, rdi, rsi, rsp, r12, r13, r14 и r15 функция обязана вернуть в исходное состояние.

Практика: сумма чисел 3 : c3 ret

Системные вызовы

Механизмы выполнения системного вызова

Функции C

Когда вы вызываете какую-либо системную функцию, например open() , write() , getpid() из кода на C, вы на самом деле не делаете напрямую сам системный вызов. Просто так вызовом функции в режим ядра (ring 0) из пользовательского (ring 3) перейти не получится. Вызываются обычные функции, реализованные внутри стандартной библиотеки, а уже они внутри делают системный вызов тем или иным методом:

  • через программное прерывание,
  • через инструкцию syscall,
  • через инструкцию sysenter.

Программное прерывание

Прерывания - это как бы сигнал процессору, что надо прервать выполнение (их поэтому и назвали прерываниями) текущего кода и срочно сделать то, что указано в обработчике.

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

Программное прерывание - синхронное прерывание, которое может осуществить программа с помощью специальной инструкции.

В процессорах архитектуры x86 для явного вызова синхронного прерывания имеется инструкция int , аргументом которой является номер прерывания (от 0 до 255). В защищённом и длинном режиме обычные программы не могут обслуживать прерывания, эта функция доступна только системному коду (операционной системе).

В ОС Linux номер прерывания 0x80 используется для выполнения системных вызовов. Обработчиком прерывания 0x80 является ядро Linux. Программа перед выполнением прерывания помещает в регистр eax номер системного вызова, который нужно выполнить. Когда управление переходит в ring 0, то ядро считывает этот номер и вызывает нужную функцию.

Метод этот широко применялся на 32-битных системах, на 64-битных он считается устаревшим и не применяется, но тоже работает (пример показывался на лекции), хотя с целым рядом ограничений (например, нельзя в качестве параметра передать 64-битный указатель).

  • Поместить номер системного вызова в eax .
  • Поместить аргументы в регистры ebx , ecx , edx , esi , edi , ebp .
  • Вызвать инструкцию int 0x80 .
  • Получить результат из eax .

Пример реализации mygetpid() (получение PID текущего процесса) на ассемблере (для системного вызова getpid используется номер 20):

Intel_syntax noprefix . globl mygetpid .text mygetpid: mov eax , 20 int 0x80 ret

Инструкция syscall

Это более современный метод, используется в 64-битном Linux, работает быстрее.

  • Номер системного вызова помещается в rax .
  • Аргументы записываются в rdi , rsi , rdx , r10 , r8 и r9 .
  • Затем вызывается syscall .
  • Результат в rax .

Пример реализации mygetpid() (получение PID текущего процесса) на ассемблере (для системного вызова getpid по таблице используется номер 39):

Intel_syntax noprefix . globl mygetpid .text mygetpid: mov rax , 39 syscall ret

Отслеживание системных вызовов

На Linux инструмент пользовательского режима strace позволяет отслеживать системные вызовы, которые выполняет данная программа.

Сегодня уже никто не удивится тому факту, что любимая семейная фотография, хранимая и оберегаемая от коварных неожиданностей в виде, например, воды от незадачливых соседей с верхнего этажа, забывших закрыть кран, может представлять собой какой-то непонятный набор цифр и, вместе с тем, оставаться семейной фотографией. Домашний компьютер стал столь же банальной вещью, что и «ящик» с голубым экраном. Не удивлюсь, если скоро домашний ПК будет приравниваться к бытовой электротехнике. Кстати, «двигатель прогресса», всем знакомая Intel, это нам и пророчит, продвигая идею цифрового дома.
Итак, персональный компьютер занял свою нишу во всех сферах жизни человека. Его появление и становление как неотъемлемого элемента уклада жизни уже стало историей. Когда мы говорим о ПК, то имеем в виду IBM PC-совместимые системы, и вполне справедливо. Мало кто из читателей вообще своими глазами видел не IBM PC-совместимую систему, тем более пользовался такой.

Все компьютеры IBM PC и совместимые с ними основываются на процессорах с архитектурой х86. Честно говоря, иногда мне кажется, что это не только процессорная архитектура, а архитектура всего ПК, вроде идеологии строения системы в целом. Сложно сказать, кто кого тянул за собой, то ли разработчики периферийного оборудования и конечных продуктов подстраивались под архитектуру х86, или, наоборот, они прямо или косвенно формировали пути развития х86 процессоров. История х86 — не ровная асфальтированная дорожка, а совокупность различных по «степени тяжести» и гениальности шагов разработчиков, сильно переплетающихся с экономическими факторами. Знание истории процессоров х86 вовсе не обязательно. Сравнивать процессор сегодняшней реальности с его давними предками попросту бессмысленно. Но чтобы отследить общие тенденции развития и попытаться сделать прогноз, экскурс в историческое прошлое архитектуры х86 необходим. Конечно, серьезный исторический труд может занять не один том, и претендовать на объективный и широкий охват темы бессмысленно. Поэтому вдаваться в перипетии «лайф-тайма» каждого поколения процессоров х86 не будем, а ограничимся важнейшими событиями во всей эпопее х86.

1968 год
Четверо сотрудников компании Fairchild Semiconductor: Боб Нойс, менеджер и изобретатель интегральной микросхемы в 1959 году, Гордон Мур, возглавлявший научные исследования и конструкторские разработки, Энди Гроув, специалист в области химических технологий, и Артур Рок, осуществлявший финансовую поддержку, основали фирму Intel. Это название образовано от Integral Electronic.


1969 год
Бывшим директором маркетингового отдела Fairchild Semiconductor Джерри Сандерсом и несколькими его единомышленниками была основана фирма AMD (Advanced Micro Devices), занявшаяся производством микроэлектронных устройств.

1971 год
При выполнении одного из заказов на микросхемы оперативной памяти сотрудник Intel Тед Хофф предложил создать универсальную «умную» ИМС. Разработку возглавил Федерико Феджин. В итоге родился первый микропроцессор Intel 4004.

1978 год
Весь период до этого — предыстория, хотя и неотрывная от случившихся далее событий. В этом году началась эра х86 — фирмой Intel был создан микропроцессор i8086, который имел частоты 4.77,8 и 10MHz. Смешные частоты? Да, это частоты современных калькуляторов, но с них все начиналось. Чип изготавливался по 3-мкм технологии и имел внутренний 16-битный дизайн и 16-битную шину. То есть появились 16-битная поддержка и, следовательно, 16-разрядные операционные системы и программы.
Чуть позже, в том же году, был разработан i8088, основным отличием которого являлась 8-разрядная внешняя шина данных, обеспечивавшая совместимость с 8-разрядной обвязкой и памятью, использовавшейся ранее. Также доводом в его пользу была совместимость с i8080/8085 и Z-80, относительно низкая цена. Как бы там ни было, но в качестве ЦП для своего первого ПК IBM выбрала i8088. С тех пор процессор Intel станет неотъемлемой частью персонального компьютера, а сам компьютер долго будут именовать IBM PC.

1982 год
Объявлен i80286. «Двести восемьдесят шестой» стал первым процессором х86, проникшим на советское и постсоветское пространство большим количеством. Тактовые частоты 6, 8, 10 и 12 МГц, производился по 1.5-мкм техпроцессу и содержал около 130000 транзисторов. Данный чип имел полную 16-битную поддержку. Впервые с появлением i80286 появилось такое понятие, как «защищенный режим», но тогда еще разработчики программного обеспечения не использовали его возможности в полной мере. Процессор мог адресовать более 1 Мб памяти, переключившись в защищенный режим, но назад вернуться можно было после полного перезапуска, а сегментированная организация доступа к памяти требовала значительных дополнительных усилий при написании программного кода. Из этого вытек тот факт, что i80286 использовался скорее как быстрый i8086.

Производительность чипа по сравнению с 8086 (а особенно по сравнению с i8088) увеличилась в несколько раз и достигала 2.6 миллионов операций в секунду. В те годы производители стали активно использовать открытую архитектуру IBM PC. Тогда же начался период клонирования процессоров архитектуры х86 от Intel сторонними производителями. То есть чип выпускался другими фирмами в виде точной копии. Intel 80286 стал основой новейшего по тем меркам ПК IBM PC/AT и его многочисленных клонов. Основными преимуществами нового процессора оказались повышенная производительность и дополнительные режимы адресации. И главное — совместимость с существующим программным обеспечением. Естественно, процессор был также лицензирован сторонними производителями…
В том же году фирма AMD заключает с Intel лицензионное соглашение и на его основе начинает производство клонов процессоров x86.

1985 год
В этом году произошло, наверное, самое значительное событие в истории процессоров с архитектурой х86 — компанией Intel был выпущен первый процессор i80386. Он стал, можно сказать, революционным: 32-разрядный многозадачный процессор с возможностью одновременного выполнения нескольких программ. В сущности, самые современные процессоры представляют собой ничто иное, как быстрые 386-е. Современное программное обеспечение использует ту же архитектуру 386, просто современные процессоры делают то же самое, только быстрее. Intel 386™ стал большим шагом вперед по сравнению с i8086 и i80286. В сущности, самые современные процессоры представляют собой ничто иное, как быстрые 386-е. Современное программное обеспечение использует ту же архитектуру 386, просто современные процессоры делают то же самое, только быстрее. Intel 386™ стал большим шагом вперед по сравнению с i8086 и i80286. Intel 386™ имел значительно улучшенную систему управления памятью по сравнению с i80286, а встроенные средства многозадачности позволили разработать операционную систему Microsoft Windows и OS/2.

В отличие от i80286 Intel 386™ мог свободно переключаться из защищенного режима в реальный и обратно и имел новый режим — виртуальный 8086. В этом режиме процессор мог выполнять несколько различных программных нитей одновременно, так как каждая из них выполнялась на изолированной «виртуальной» 86-й машине. В процессоре были введены дополнительные режимы адресации памяти с переменной длиной сегмента, что значительно упростило создание приложений. Процессор производился по 1-мкм технологическому процессу. Впервые процессор Intel был представлен несколькими моделями, которые образовали семейство 386-х. Здесь и начинается знаменитая маркетинговая игра компании Intel, позднее вылившаяся в разделение одного разработанного ядра на два торговых варианта, в некотором круге пользователей и специалистов называемое: «Pentium для богатых, Celeron для бедных». Хотя что здесь плохого — и волки сыты, и овцы целы.
Были выпущены следующие модели:

386DX с частотой 16, 20, 25 и 33 МГц имел 4 ГБ адресуемой памяти;
386SX с частотой 16, 20, 25 и 33 МГц в отличие от 386DX имел 16, а не 32-битную шину данных, и соответственно 16 Мб адресуемой памяти (подобным образом в свое время процессор i8088 был «создан» из i8086 за счет уменьшения разрядности внешней шины для обеспечения совместимости с имеющимися внешними устройствами);
386SL в октябре 1990 года — мобильная версия процессора Intel 386SX с частотой 20 и 25MHz.

1989 год
Корпорация Intel выпускает свой очередной процессор — Intel 486™ DX с частотой 25, 33 и 50 МГц. Intel 486 ™ DX стал первым процессором в семействе 486 и имел значительный (более чем в 2 раза при той же частоте) прирост производительности по сравнению с семейством 386. У него появился кэш первого уровня объемом 8 Кб, интегрированный в чип, а максимальный размер L2-кэша увеличился до 512 Kb. В i486DX был интегрирован блок вычислений с плавающей точкой (FPU — Floating Point Unit), который раньше выполнялся в виде внешнего математического сопроцессора, устанавливаемого на системную плату. Кроме того, это первый процессор, ядро которого содержало пятиступенчатый конвейер. Таким образом, команда, прошедшая первую ступень конвейера, продолжая обрабатываться на второй, высвобождала первую для следующей инструкции. По своей сути, процессор Intel 486™DX представлял собой быстрый Intel 386DX™, объединенный с математическим сопроцессором и 8 кБ кэш-памяти на одном кристалле. Такая интеграция позволила увеличить скорость коммуникаций между блоками до очень высоких значений.
Фирмой Intel была развернута рекламная кампания с лозунгом «Intel: The Computer Inside». Пройдет время, и она превратится в знаменитую рекламную кампанию «Intel Inside».

1991 год
Был создан собственный процессор фирмы AMD — Am386™. Этот был частично построен под действием лицензии, частично по собственной разработке и работал на максимальной частоте 40 МГц, что превышало аналогичный показатель процессора Intel.
Немного ранее произошли первые судебные разбирательства между Intel и AMD по поводу намерения AMD продавать свой клон Intel 386™. Крепко укрепившая свои позиции Intel перестала нуждаться в раздаче лицензий сторонним производителям и делиться пирогом собственного приготовления ни с кем не собиралась. В результате AMD впервые вступила на рынок х86 процессоров как конкурент. За ней последовали и другие компании. Так началось продолжающееся до сих пор великое противостояние двух гигантов (остальные конкуренты сошли с дистанции), которое дало миру много хорошего. Негласным лозунгом конкурентов Intel стала фраза: «то же, что у Intel, но за меньшую цену».
В то же время Intel выпускает i486SX, в котором для удешевления продукта отсутствует блок FPU (интегрированный сопроцессор), что, конечно же, негативно сказалось на производительности. Других отличий от i486DX не было.

1992 год
С выходом процессора Intel 486DX2 впервые был использован коэффициент умножения частоты шины. До этого момента внутренняя частота ядра была равна частоте внешней шины данных (FSB), но появилась проблема ее наращивания, так как локальные шины периферии (в то время VESA VL-bus), да и сами периферийные устройства проявляли нестабильность работы при частоте, превышающей 33 МГц. Теперь при частоте шины FSB 33 МГц тактовая частота ядра составляла 66 МГц за счет умножения на 2. Такой прием надолго вошел в историю и используется поныне, только множитель в современных CPU может превышать 20. Intel 486™ DX2 надолго стал популярным процессором и продавался в огромных количествах, впрочем, как и его клоны от конкурентов (AMD, Cyrix и другие), которые теперь уже имели некоторые отличия от «интеловского оригинала».

1993 год
В свет вышел первый суперскалярный процессор х86, то есть способный выполнять более одной команды за такт — Pentium (кодовое название P5). Это достигалось наличием двух независимых параллельно работающих конвейера. Первые процессоры имели частоту 60 и 66 МГц и получили 64-разрядную шину данных. Впервые кэш-память первого уровня была разделена на две части: отдельно для инструкций и данных. Но одним из самых значительных нововведений был полностью обновленный блок вычислений с плавающей точкой (FPU). Фактически до этого на платформе x86 еще не было настолько мощного FPU, и лишь через многие годы после выхода Intel Pentium конкуренты смогли достичь его уровня производительности. Также впервые в процессор был включен блок предсказания ветвлений, с тех пор активно развивающийся инженерами.

Суть заключается в следующем: в любой программе присутствует множество условных переходов, когда в зависимости от условия выполнение программы должно пойти по тому или иному пути. В конвейер можно поместить только одну из нескольких ветвей перехода, и если он оказывается заполненным кодом не той ветви, то его приходится очищать и заполнять заново несколько тактов (в зависимости от количества ступеней конвейера). Для решения этой проблемы и используются механизмы предсказания ветвлений. Процессор содержал 3,1 млн. транзисторов и изготавливался по 0.8-мкм процессу. Все эти изменения позволили поднять производительность нового процессора на недосягаемую высоту. В действительности же оптимизация кода «под процессор» первое время была редкой и требовала применения специальных компиляторов. И еще долго новейшему процессору приходилось выполнять программы, предназначенные для процессоров семейств 486 и 386.
В том же году появилось второе поколение Pentium на ядре P54, в котором были устранены все недостатки Р5. При изготовлении использовались новые технологические процессы 0.6, а позднее и 0.35-мкм. До 1996 года новым процессором были охвачены тактовые частоты от 75 до 200 МГц.
Первый Pentium сыграл важную роль в переходе на новые уровни производительности персонального компьютера, дал толчок и определил ориентиры развития на будущее. Но при большом рывке в производительности он не привнес никаких кардинальных изменений в архитектуру х86.

1994 год
Появившиеся Intel 486™DX4, AMD Am486DX4 и Cyrix 4х86 продолжили линейку 486-х и использование умножения частоты шины данных. Процессоры имели утроение частоты. Процессоры DX4 от Intel работали на 75 и 100 МГц, а Am486DX4 от AMD достиг 120 МГц. В процессорах стала широко применяться система управления энергопотребления. Других принципиальных отличий от 486DX2 не обнаружилось.

1995 год
Анонсирован Pentium Pro (ядро P6). Новая процессорная шина, три независимых конвейера, оптимизация под 32-битовый код, от 256 Kb до 1 Mb L2-кэша, интегрированного в процессор, причем работающего на частоте ядра, усовершенствованный механизм предсказания ветвлений — по количеству нововведений новый процессор чуть ли не бил рекорды, ранее установленные Intel Pentium.

Процессор позиционировался на использование в серверах и имел очень высокую цену. Самое примечательное, что вычислительное ядро Pentium Pro фактически не было ядром архитектуры х86. Машинные коды x86, поступающие в CPU, внутри декодировались в RISC-подобный микрокод, и уже именно его исполняло ядро процессора. Набор CISC-команд, как набор команд процессора х86, подразумевал переменную длину команд, что определяло сложность нахождения каждой отдельной команды в потоке и, следовательно, создавало трудности в разработке программ. CISC-команды являются сложными и комплексными. RISC-команды упрощенные, короткие, требующие значительно меньшее время на выполнение команды с фиксированной длиной. Использование RISC-команд позволяет значительно увеличить распараллеливание процессорных вычислений, то есть использовать больше конвейеров и, следовательно, уменьшать время исполнения команд. Ядро P6 легло в основу трех следующих процессоров Intel — Pentium II, Celeron, Pentium III.
В этом году состоялось также знаковое событие — компания AMD купила фирму NexGen, имеющую к тому времени передовые архитектурные разработки. Слияние двух инженерных команд позже принесет миру процессоры х86 с отличной от Intel микроархитектурой и даст толчок новому витку жестокой конкуренции.
На Микропроцессорном Форуме впервые был представлен новый процессор MediaGX от Cyrix, и его отличительной особенностью являются интегрированные контроллер памяти, графический ускоритель, интерфейс шины PCI и производительность, соизмеримая с производительностью Pentium. Это была первая попытка такой плотной интеграции устройств.

1996 год
Появился новый процессор AMD К5 с суперскалярным RISC-ядром. Однако RISC-ядро с его набором команд (ROP-команд) скрыты от программного обеспечения и конечного пользователя, а команды х86 преобразуются в RISC-команды. Инженеры AMD использовали уникальное решение — команды х86 частично преобразуются еще во время помещения в кэш-память процессора. В идеале процессор K5 может выполнять до четырех команд х86 за один такт, но на практике в среднем за такт обрабатываются только 2 инструкции.

Кроме того, традиционные для RISC-процессоров изменения порядка вычислений, переименование регистров и другие «приемы» позволяют увеличить производительность. Процессор К5 явился детищем объединенной команды инженеров AMD и NexGen. Максимальная тактовая частота так и не превысила 116 МГц, но производительность К5 была выше, чем у процессоров Pentium с такой же тактовой частотой. Поэтому в маркетинговых целях впервые в практике маркировки CPU был использован рейтинг производительности (Performance Rating), который явно противопоставлялся тактовой частоте равных по производительности Pentium. Но процессор все-таки не мог достойно потягаться с ним, так как Pentium уже тогда достиг частоты 166 МГц.
В том же году увидел свет Intel Pentium MMX. Главное нововведение процессора P55C — дополнительные команды MXX к набору команд, который почти не претерпевал изменений со времен создания процессоров третьего поколения. Технология MMX — это использование команд, ориентированных на работу с мультимедиаданными. Специальный набор команд SIMD (Single Instruction — Multiple Data — одна команда — множественные данные) повышает производительность при выполнении векторных, циклических команд и обработке больших массивов данных — при применении графических фильтров и различных спецэффектов.

По сути это 57 новых инструкций, призванных ускорить обработку видео и звука. Остальными изменениями ядра стали уже типичные увеличение объема кэш-памяти, улучшение схем работы кэш-памяти и других блоков. Производился процессор по 0.35-мкм процессу, 4.5 млн. транзисторов. Максимальная частота 233 МГц.
Начался выпуск суперскалярных процессоров Cyrix 6х86 на ядре М1, который на самом деле являлся процессором 5-го поколения, отличительной особенностью которого были «глубокие» конвейеры и использование классических х86 команд без каких-либо дополнительных наборов инструкций.
В конце года, пока в Intel велась разработка PentiumII, снова заявила о себе AMD, выпустив процессор шестого поколения К6. В основу AMD-K6 легло ядро, разработанное инженерами компании NexGen для процессора Nx686 и существенно доработанное в AMD. Как и К5, ядро К6 оперировало не х86 инструкциями, а RISC-подобным микрокодом. Процессор поддерживал команды MMX и 100-мегагерцевую системную шину и имел увеличенный до 64 Кб объем кэш-памяти первого уровня. Вскоре стало ясно, что PentiumII окажется К6 не по зубам.

с 1997 года до наших дней…
К 1997 году уже сложились направления инженерных разработок архитектуры х86 ведущих производителей. Следующий этап в развитии процессоров x86 можно охарактеризовать как противостояние архитектур, которое продолжается и поныне. На дистанцию по крупному счету вышли: захватившая 90 % рынка Intel, упорно с ней бьющаяся AMD, многократно проигрывающая в производственных мощностях, и Cyrix, которая впоследствии будет куплена компанией VIA, а затем и вовсе, не выдержав конкуренции, канет в неизвестность. Остальные производители не смогут достойно конкурировать и будут вынуждены искать другие ниши на рынке. Намечен переход от CISC к RISC-подобным микрокомандам в меньшей степени у Intel, в большей у AMD. Причем на вход и выход процессоров х86 по-прежнему поступают CISC-команды. А почему, собственно, стали вводить в х86 процессоры с родной ей CISC-архитектурой внутреннюю RISC-архитектуру, позволяющую углублять распараллеливание выполнения команд? Да просто из CISC-архитектуры х86 еще во времена четвертого поколения было выжато все, и способов повышать производительность на уровне базисных наборов команд не осталось.

Принципиально новых изменений и прорывов в развитии архитектуры с тех пор не было, хотя современные процессоры быстрее, например, «386-го» в сотни раз. Инженеры оттачивают и совершенствуют уже существующие микроархитектуры ядер, а новые представляют собой лишь переработанные старые. Все усовершенствования и попытки повысить производительность сводятся к оптимизации существующих решений, введению различных исправлений и «костылей» для хромающих FPU, системы организации конвейеров и кэшей. Избитыми, но все же действенными средствами является постоянное увеличение объема кэш-памяти и частоты шины FSB. Современные процессоры имеют до 2 Мб кэш-памяти, работающей на частоте ядра, а частоты системных шин достигают 800 МГц, и то с использованием множителя, так как реальная генерируемая частота всего 200 МГц. За последние 7 лет в процессоры х86 были введены следующие «новшества-подпорки»: кэш-память окончательно переехала на кристалл процессора и переведена на частоту ядра, введены и постоянно совершенствуются блоки предсказания ветвлений как компенсация увеличению длины (количества стадий) конвейера, механизм динамического изменения порядка исполнения инструкций, уменьшающий количество холостых тактов, механизм предвыборки данных для более рационального использования кэш-памяти. Множатся дополнительные наборы команд: SSE, SSE2, SSE3, 3DNow!, 3DNow Professional. Если MMX еще можно было с натяжкой назвать дополнительным набором инструкций х86, то все последующие наборы вряд ли, так как к командам х86 добавлять уже нечего. Смысл же появления этих наборов заключается в попытке как можно меньше использовать блок вычислений с плавающей точкой (FPU) в таком виде, в каком он есть, так как, обладая высокой производительностью, он отличается малой приспособленностью для высокоточных вычислений, капризностью внутренней архитектуры и ее непредсказуемостью, что усложняет жизнь программистам. То есть фактически ввели специализированный расчетный блок, ориентированный не на вычисления вообще, а на реальные, часто встречающиеся задачи, выполнять которые предлагается в обход классического FPU.

Как-то это больше похоже на борьбу с последствиями интеграции математического сопроцессора в CPU в далеком 1989 году. Во всяком случае, если задуматься и подсчитать, то большую часть времени процессор тратит «на себя» — на всевозможные преобразования, предсказания и многое другое, а не на выполнение программного кода.
Глядя назад, видно, что не все было гладко. Введение коэффициента умножения и полученная в итоге асинхронность, а также увеличение количества стадий конвейера — все это палки о двух концах. С одной стороны, это позволило увеличить тактовые частоты процессора почти до 4 ГГц (и это еще не предел), с другой — получили узкое место в виде шины FSB и проблему с условными переходами. Но всему свое время, и тогда, видимо, это были разумные решения, так как всегда присутствует очень злой экономический фактор.
Нельзя не отметить, что по-настоящему блистательных успехов за последние годы добились в области полупроводникового производства. Уже освоен 90-нанометровый технологический процесс изготовления процессоров х86, который позволяет достигать близких к СВЧ-диапазону тактовых частот, а количество транзисторов в кристалле достигает 170 млн (Pentium 4 EE).
Мы привыкли считать, что процессор — это главное устройство в ПК и что именно он задает тон глобальной компьютеризации. А ведь победоносное шествие архитектуры х86, длящееся более четверти века, началось не конкретно с процессора, а с конечного пользовательского устройства в целом — IBM PC. Тогда еще в компании IBM не догадывались, какое блистательное будущее ждет этот ПК и, не придав проекту никакого значения, сделали его открытым для всех. Именно открытости концепции, успеху программного обеспечения и MS DOS обязан успех IBM PC. А процессор в нем мог стоять любой архитектуры, но так уж получилось, что IBM выбрала i8088 и i8086, а потом уже все закрутилось, завертелось… Но из процессора х86 в итоге не получилось эдакого универсального вычислителя на все случаи жизни или «умного» устройства, вездесущего и все способного сделать, как об этом мечтали раньше. Да и «закон» Гордона Мура (каждые 2 года количество транзисторов в кристалле процессора будет увеличиваться вдвое) стал законом только для Intel, которая поставила его на острие своей маркетинговой политики, а отказываться от данного слова ей неудобно, видимо.

Сегодня можно уже твердо сказать, что архитектура х86 зашла в тупик. Вклад ее в популяризацию компьютера как устройства огромен, и с этим никто не спорит. Однако нельзя быть актуальной вечно. Молодой и сильный некогда жеребец стал старой клячей, которую продолжают запрягать в телегу. Аппетиты пользователей ненасытны, и вскоре архитектура х86 не сможет их удовлетворить. Конечно, переход связан с титаническими усилиями в связи с тем, что многомиллионный мировой парк ПК в своем почти абсолютном большинстве использует процессоры архитектуры х86, и что самое важное, использует программное обеспечение для х86 кода. Одним днем все не перевернуть, нужны годы. Но разработки 64-битных процессоров и программ набирают обороты с завидной скоростью, Intel представила Itanium2, а AMD уже почти год выпускает свои Athlon 64, которые имеют совсем не х86 архитектуру, хотя и полностью совместимы с ней и еще могут выполнять все старые программы. Таким образом, можно сказать, что AMD Athlon 64 положил начало уходу от архитектуры х86 и тем самым открыл переходный период.
Как видите, заявления о том, что процессор — самый быстро развивающийся компонент ПК, далеко не беспочвенны. Представьте себе, какими процессорами будут оснащаться компьютеры наших детей. Подумать страшно!

В Одноклассники


Краткая историческая справка.

Эволюция микропроцессоров исторически подразумевала увеличение разрядности целочисленных регистров , т.е. максимального числа бит, образующих числа, над которыми можно было выполнять элементарные арифметические действия путём исполнения соответствующих команд. Также от этого параметра зависит объём линейно (без всяческих ухищрений, замедляющих работу) адресуемой , к которой может обращаться .
Самый первый микропроцессор Intel 4004 был 4-битным, а основатель семейства x86, т.е. первый процессор, использующий наиболее популярный до сих пор базовый набор команд, Intel 8086 был 16-битным. Эпоха 32-битных микропроцессоров началась с 1985 года с Intel 386, с тех пор вплоть до Intel Pentium4 и AMD AthlonXP включительно система команд только дополнялась (MMX, SSE/SSE2/SSE3, 3Dnow!), но, несмотря на увеличение разрядности внешних шин и шин кэшей вплоть до 256-бит в некоторых случаях, число разрядов целочисленных регистров общего назначения оставалось равным 32.
Тем временем, практически все высокопроизводительные процессоры более поздних, нежели x86, архитектур (преимущественно - варианты RISC) уже давно были 64-битными. (Первый такой процессор, MIPS R3000, появился в 1994 году и был известен в основном по рабочим станциям и серверам SGi). Более того, Intel продвигала уже второе поколение собственных изначально 64-битных процессоров с архитектурой IA64(базирующейся на технологии VLIW) с коммерческим названием Itanium, не обладавших программной x86-совместимостью.
Однако в 2002 году компания AMD представила развитие архитектуры x86 под названием AMD64, представляющее собой очередное расширение набора команд x86, но рассчитанное на работу с 64-битными целочисленными регистрами общего назначения. В "железе" этот набор команд впервые был реализован на процессорах семейства AMD K8: Opteron/Athlon64, полностью программно совместимых и с обычными x86 процессорами.
В течении последующих двух лет стало ясно, что полная реализация потенциала этих процессоров возможна только при работе в операционной системе, использующей соответствующий набор команд и 64-битную адресацию памяти, что, в первую очередь, позволяло без всяких ограничений работать с линейными массивами данных объемом более 4Гб.
В первую очередь на новые процессоры были портированы ОС семейства Linux вместе с достаточно представительным набором критичных к скорости процессора и требующих больших объёмов памяти приложений. Скорость и стабильность работы новых процессоров, а также принципиальные трудности с созданием настольного процессора с архитектурой Intel IA64 сподвигли компанию Microsoft заняться портированием своих ОС на эту платформу.
С этого момента стало ясно, что набор команд AMD64 станет новым индустриальным стандартом, и Intel не осталось ничего другого, как добавить в свои процессоры полный аналог набора команд AMD64, в реализации Intel названный EM64T (Extended Memory 64-bit Technology).

Чем принципиально 64-битные x86 процессоры отличаются от 32-битных?
Помимо возможности быстрой работы с целыми 64-битными числами и прямой адресации несравнимо больших объёмов как виртуальной, так и физической памяти, новый индустриальный стандарт для x86 процессоров ликвидировал три принципиальных недостатка этой архитектуры:
1)Удвоение числа целочисленных регистров общего назначения - по этому параметру все потомки Intel 386 очень сильно отставали от современных RISC и VLIW процессоров. Использование компилятором этих регистров позволяет заметно улучшить эффективность реализации многих алгоритмов.
2)Использование для операций с плавающей точкой не стека, а регистров, используемых в наборе команд SSE2. Очень заметно отражается на производительности, но также требует перекомпиляции программного обеспечения.
3)DEP - Data Execution Protection (защита от передачи на выполнение содержимого сегмента данных при возникновении ошибки переполнения), также называется EVP (Enhanced Virus Protection), сильно затрудняет работу определённых классов вредоносных программ, в первую очередь - червей и троянцев. Не требует перекомпиляции ПО, поддерживается и 32-битными ОС Microsoft, начиная с WindowsXP SP2 и Wndows 2003 Server SP1.

Что нужно для работы 64-битных x86 приложений на моём ПК?
1)64-битный x86 процессор. На момент написания FAQ это были процессоры AMD с поддержкой технологии AMD64 и Intel c EM64T, соответственно. Конкретно речь идёт о AMD Opteron/Athlon64/Turion 64(мобильный аналог Athlon64)/Sempron 64/Phenom64. У Intel поддержка EM64T присутствует у процессоров Celeron D 3X1/3X6, Pentium4 5X1/5X6/6XX, Pentium D, Pentium XE (не Pentium4 XE!), всех Xeon DP с 800МГц с шиной и XeonMP c 667МГц шиной, а также у большинства будущих процессоров Intel за исключением Pentium M и Сeleron M.

Дополнение от января 2008 года - на данный момент набор команд AMD64/EM64T окончательно стал стандартом для всех производимых мобильных, настольных и серверных x86 процессоров Intel и AMD.

Также надо убедиться, что процессор корректно опознаётся BIOS"ом материнской платы (это означает, что в него загружен необходимый микрокод, несоблюдение этого условия может привести к серьёзным проблемам в работе компьютера). В некоторых ситуациях может потребоваться обновление BIOS материнской платы. В первую очередь это касается процессоров Intel, поскольку не все LGA775-материнские платы изначально поддерживали такие процессоры.
2)Операционная система.
На момент написания FAQ доступны следующие ОС:
Microsoft Windows XP Professional x64 Edition, Microsoft Windows 2003 Server x64 Editions (Standart/Enterprise/Datacenter), Windows Server 2008, также на платформу AMD64 перенесены Sun Solaris и различные варианты Linux и FreeBSD,(детальное рассмотрение особенностей unix-подобных ОС выходит за рамки данного FAQ), Windows Vista также имеет x64 версии всех редакций кроме начальных.
3)Драйверы. Все драйверы, работающие в ядре системы должны быть 64-битными, обратной совместимости не предусмотрено. Для наиболее распространённых комплектующих (видеокарты nVidia GeForce и ATi Radeon, чипсеты и дисковые контроллеры Intel, VIA, nVidia) такие драйверы уже написаны.

Будут ли работать обычные приложения на 64-битной ОС Windows?
1)32-битные приложения для Microsoft Windows - да, будут, при этом в некоторых ситуациях возможен прирост производительности по сравнению с выполнением на том же компьютере, но под 32-битной ОC(особенно если приложение использует очень большие объёмы оперативной памяти), но при этом 32-битные приложения не могут обращаться к 64-битным DLL и элементам Active Controls и наоборот. (На практике это выразилось в том, что в составе 64-х битных Windows Internet Explorer оставлен 32-битным для корректной работы со страницами, содержащими ActiveX элементы.)
2) 16-битные приложения для Microsoft Windows - нет, за исключением нескольких программ-инсталляторов.
3) DOS-приложения - нет. (На момент написания FAQ стало известно о портировании на 64-битные версии Windows прекрасно зарекомендовавшего себя OpenSource эмулятора DosBox, что почти полностью снимает возможные проблемы)
4)Приложения Windows для IA64(Itanium) - нет.

Что всё это даст мне в данный момент и что это может дать в будущем?
Для обычных пользовательских повседневных программ перенос их в данный момент на 64-битную платформу не даёт какого-либо качественно скачка в производительности. Исключением, (да и то относительным) являются только некоторые новейшие высокотехнологичные игры.
Наибольшую пользу от перехода на 64-бита получают программы для работы с базами данных, причём чем больше объём используемых данных, тем более заметен выигрыш, программы для CAD/CAE (автоматизированное проектирование, моделирование и т.п.), а также программы для создания цифрового контента (обработка изображений, звука, видео), более подробную информацию уже, как правило, можно узнать на сайте фирмы-разработчика используемого вами ПО - как правило, из сроков готовности 64-битных версий секретов никто не делает.
Из программ, портирование которых на 64-бит Windows завершено или близится к завершению стоит упомянуть Microsoft SQL Server 2000 и 2005, Cakewalk Sonar 4.0, CryTek FarCry, Epic Unreal Tournament 2004, SiSoft Sandra 2005 Полный список ПО, которое находится на разных стадиях переноса под Windows x64 можно найти .

Сравнительная таблица ограничений по максимальному объёму используемой оперативной памяти и числу процессоров для 32 и 64-битных версий операционных систем от Microsoft:

Общие ограничения по объёму используемой памяти 32-Bit 64-Bit
Полное виртуальное адресное пространство 4 ГБ 16 TБ
Виртуальное адресное пространство для 32-битного процесса 2 ГБ (3 ГБ c ключом загрузки /3ГБ) 4 ГБ если программа откомпилирована с ключом /LARGEADDRESSAWARE (2 ГБ без этого)
Виртуальное адресное пространство для 64-битного процесса Не применимо 8 TБ
Paged pool(Выгружаемый стек) 470 МБ 128 ГБ
Non-paged pool(Невыгружаемый стек) 256 МБ 128 ГБ
System Page Table Entry(PTE) 660 МБ to 900 МБ 128 ГБ
Ограничения по физическому объёму памяти и количеству процессоров 32-Bit 64-Bit
Windows XP Professional 4 ГБ / до 2 CPU 128 ГБ / до 2 CPU
Windows Server 2003, Standard Edition 4 ГБ / до 4 CPU 32 ГБ / до 4 CPU
Windows Server 2003, Enterprise Edition 64 ГБ / до 8 CPU 1 TБ / до 8 CPU
Windows Server 2003, Datacenter Edition 64 ГБ / 8 - 32 CPU 1 TБ / 8 - 64 CPU
Windows Server 2008, Web Edition 4 ГБ / до 4 CPU 32 ГБ / до 4 CPU
Windows Server 2008, Standart Edition 4 ГБ / до 4 CPU 32 ГБ / до 4 CPU
Windows Server 2008, Enterprise Edition 64 ГБ / до 8 CPU 2 TБ / до 8 CPU
Windows Server 2008, Datacenter Edition 64 ГБ / до 32 CPU 2 TБ / до 64 CPU
Windows Server 2008, HPC Edition - 128 ГБ / до 4 CPU

Cведения о максимально поддерживаемых объемах памяти для 64-битных версий Windows Vista можно найти .

В сегодняшней статье разберемся, какая платформа лучше подойдет Вашему компьютеру: x64 или x86(x32)? Ведь многие задают себе вопрос: что лучше? 32 или 64 битная версия ОС - решать Вам, но, думаю, лучше знать, как сделать правильный выбор!

Поскольку у Вас уже наверняка установлена операционная системы, Вы можете легко .

Я не буду вдаваться в "дебри" процессорной эволюции и "начинке", а попытаюсь объяснить основные положения.

Давайте вначале разберемся, откуда вообще взялись все эти архитектуры и разрядности?

32-битная архитектура x86 (286-, 386-, 486-совместимые микропроцессоры) названы так по своей -86 концовке. А х32 и х64 - это уже разрядность процессора. Поэтому корректно различать два основных типа архитектур: x86 и х64 (x32 - это некорректное название x86).

Итак, в чем же их отличие?

Это - потребляемость аппаратных ресурсов компьютера. Дело в том, что некоторые Intel и AMD процессоры на x64 не рассчитаны.
Кроме того, x64 рассчитана на не менее 4 GB ОЗУ Вашего ПК . Собственно, для этого она и разрабатывалась.
И третье - какую нагрузку испытывает компьютер при работе. Если Вы - дизайнер, верстальщик или человек, которые использует очень мощные приложения компаний Adobe и прочих мультимедиа-гигантов, то Вам приоритетнее будет х64. Если же у Вас 4

Так что же выбрать?

Поэтому при выборе архитектуры микропроцессора, всегда реально оценивайте мощности и возможности вашего компьютера. Кроме того, для x64 разрядных систем требуются свои(!) драйвера, отличные от x32. Да, x64, может, и будет работать быстрее, но со своими приложениями. А тридцати двух разрядные в свою очередь как работали, так и будут, что там, что там.

Удачи!

Похожие новости:


Разное



2024 wisemotors.ru. Как это работает. Железо. Майнинг. Криптовалюта.