Термин «разрядность» часто используют при описании вычислительных устройств и систем, понимая под этим число бит, одновременно хранимых, обрабатываемых или передаваемых в другое устройство. Но именно применительно к центральным процессорам (ЦП), как к наиболее сложным представителям вычислительного железа, не делимым на отдельные детали (до тех пор, пока кто-то не придумал, как продать отдельно кэш или умножитель внутри чипа), понятие разрядности оказывается весьма расплывчатым. Продемонстрировать это поможет умозрительный пример.

Представьте себе, что вокруг благодатные 80-е, в мире (всё ещё) десятки производителей ЦП, и вы работаете в одном из них над очередным поколением. Никаких 256-битных SSE8, встроенных GPU и 5-канальных контроллёров памяти на свете пока нет, но у вас уже есть готовый 16-битный процессор (точнее, «16-битный» пишется в технической документации), в котором 16 бит везде и во всём — от всех внешних шин до архитектурного размера обрабатываемых данных. Реальным примером такого ЦП могут быть первые однокорпусные (правда, не однокристальные) ЦП для архитектуры DEC PDP-11. И вот приходит задание руководства — разработать новое, обратно совместимое поколение этого же ЦП, которое будет 32-битным — не уточняя, что понимается под последним. Именно это понимание и предстоит прояснить в первую очередь. Итак, наш главный вопрос: что именно надо удвоить по разрядности в нашем пока насквозь 16-битном ЦП, чтобы получившийся процессор мог называться 32-битным? Чтобы решать задачу было легче, применим два подхода: систематизируем определения и посмотрим на примеры.Систематизируем

Первое, что приходит в голову — разрядность чего именно считать? Обратимся к определению любой информационной системы: её три основных функции — это обработка, хранение и ввод-вывод данных, за которые отвечают, соответственно, процессор(ы), память и периферия. Учитывая, что сложная иерархически самоподобная система состоит из многих компонент, можно утверждать, что такое разделение функций сохраняется и на компонентном уровне. Например, тот же процессор в основном обрабатывает данные, но он также обязан их хранить (для чего у него есть относительно небольшая память) и обмениваться с другими компонентами (для этого есть разные шины и их контроллёры). Поэтому будем функционально разделять разрядности обработки, хранения и обмена информации.

Рискну предположить, что все производители любого программируемого «железа», особенно процессоров, на 90% стараются не для конечных пользователей, а для программистов. Следовательно, с точки зрения производителей процессор должен выполнять нужные команды нужным образом. С другой стороны, детали структуры кристалла (топологические, электрические и физические параметры отдельных транзисторов, вентилей, логических элементов и блоков) могут быть скрыты не только от пользователя, но и от программиста. Выходит, что разрядность надо отличать и по реализации — физическую и архитектурную.

Следует добавить, что программисты тоже бывают разные: большинство пишут прикладные программы на языках высокого уровня с помощью компиляторов (что делает код до некоторой степени платформонезависимым), некоторые пишут драйверы и компоненты ОС (что заставляет более внимательно относиться к учёту реальных возможностей аппаратной части), есть творцы на ассемблере (явно требующем знания целевого процессора), а кто-то пишет сами компиляторы и ассемблеры (аналогично). Поэтому под программистами далее будем понимать именно тех, для кого детали аппаратной реализации важны если не для написания программы вообще, то хотя бы для её оптимизации по скорости — «архитектурная» разрядность чего-либо будет относиться именно к программированию на родном машинном языке процессора или более удобном ассемблере, не залезая при этом в нутро ЦП (это уже вопросы микроархитектуры, которую мы для большего различия и назвали физической реализацией). Описанные нюансы всё равно влияют на всех программистов, т.к. языки высокого уровня почти всегда переводятся компиляторами в машинный код, а компиляторы тоже должен кто-то написать. Исключения в виде интерпретируемых языков тоже не стоят в стороне — сами интерпретаторы тоже создаются с помощью компиляторов.

Осталось рассмотреть, разрядность какой именно информации нам интересна. Что вообще потребляет и генерирует ЦП в информационном смысле? Команды, данные, адреса и сигнально-управляющие коды. О последних речь не идёт — их разрядность жёстко зафиксирована в конкретной аппаратной реализации и в большинстве случаев программно не управляема. Чуть трудней с командами — в семействе архитектур RISC, например, разрядность любого обращения к памяти должна быть равна физической разрядности шины данных процессора, в т.ч. и при считывании кода (кроме некоторых послаблений в современных ARM и PowerPC). Это хорошо для ЦП — нет проблем с невыровненным доступом, все команды имеют одинаковую, либо переменную, но просто вычисляемую длину. Зато плохо для программиста — RISC это усечённый набор команд, которые ещё и занимают больше места, чем при более компактном кодировании (для того же алгоритма нужно больше команд, но и для того же числа команд надо больше байтов). Поэтому именно CISC-парадигма завоевала наибольший подход с её разнообразием и переменной длинной команд, не равной разрядности чего-либо. Разумеется, все современные ЦП внутри — настоящие RISC, но это только физически, а не архитектурно. Остались только два вида информации — данные и адреса. Их и рассмотрим.Собираем

У нас имеется три критерия видов разрядности: функциональный (обработки, хранения и обмена), реализационный (физическая и архитектурная) и типовой (данных и адресов). Итого уже 12 видов этой непонятной штуки. Предположим, что на каждую комбинацию критериев для нашего исходного ЦП мы отвечаем «16-битная» (и физическая разрядность обработки данных, и архитектурная хранения адресов, и все остальные). Теперь посмотрим, какие из этих вопросов обязательно должны давать ответ «32-битная», чтобы получившийся процессор оказался именно таким.

Начнём с архитектурной части. Должен ли ЦП хранить данные и адреса в логическом 32-битном формате, чтобы называться 32-битным? Насчёт данных, очевидно, да, а вот по поводу адресов всё не так просто. Почти все 8-битные (по данным) ЦП имеют возможность хранить 16-битные адреса в парах регистров (иначе им не видать распространённой на этих платформах 16-битной адресации), но от этого их не называют 16-битными. Может быть, если ЦП сможет хранить 32-битные данные, но всего-то 16-битные адреса, его уже можно называть 32-битным.

На аналогичные вопросы об архитектурных вычислениях над 32-битными данными и адресами, а также программно 32-битном обмене данных с программно 32-битной адресацией ответ может быть таким же — с данными надо, а с адресами не факт.

Перейдём на физическую реализацию. Должен ли ЦП хранить данные и адреса в физически 32-битном формате? Оказывается, не обязательно, т.к. для 32-битных операндов можно спарить регистры, чем успешно пользовались ещё 8-битные ЦП, начиная с i8080. А зилоговские 16-битные Z8000 могли даже счетверять регистры, получая 64-битный аргумент (только для данных). Это не так эффективно, т.к. полный объём данных, умещающийся в регистровом файле, не увеличится, но это и не требовалось. Зато всегда есть возможность обратиться и к старшей, и к младшей половине виртуального 32-битного регистра — камень в огороды архитектур IA-32 и MC68k, где можно обращаться только к младшей половине (в IA-32 — ещё и с префиксом, что замедляет выполнение).

Идём далее. Должен ли ЦП обрабатывать данные и адреса 32-битными физическими порциями? Оказывается, и это не требуется, операнды можно обрабатывать половинками в функциональных устройствах 16-битного размера. Стоит вспомнить процессор Motorola MC68000, применявшийся в первых Макинтошах, Амигах, Атари и других популярных машинах — он считался 32-битным, в нём есть 32-битные регистры, но нет ни одного 32-битного ФУ (оно появилось только в 68020). Зато есть целых три 16-битных АЛУ, два из которых умеют спариваться при выполнении 32-битной операции. У i8080 и Z80 8-битные АЛУ выполняли 16-битные операции для вычисления адреса последовательно над его байтами. Позже эта история повторилась с набором SSE и его 128-битными операндами, которые поначалу обрабатывались на 64-битных ФУ.

Наконец, обмен: нужно ли процессору физически принимать и передавать данные 32-битными порциями с 32-битной адресацией? На первый вопрос дали ответ почти все производители ЦП, выпустив чипы с половинной шириной шины: 8 бит для 16-битного i8088, 16 бит для 32-битных MC68000/010 и i80386SX/EX/CX, и даже 8 бит для 32-битного MC68008. С физической разрядностью шины адреса куда веселее. Начнём с того, что для многобайтовых шин данных (т.е. начиная с 16-битной) физическая адресация памяти может происходить по словам или по байтам. В первом случае на шину адреса всегда подаётся адрес слова, а шина данных считывает или записывает нужную его часть — от отдельного байта до слова целиком. Для обозначения разрядности доступа может применяться отдельная шина байт-маски (в архитектуре x86 такой приём начал применяться со времён i386 — по биту на каждый байт шины данных), либо комбинация управляющих сигналов с младшими битами шины адреса, которые в этом режиме не нужны (для 32-биной шины данных адрес слова нацело делится на 4, а потому младшие 2 бита шины адреса всегда равны нулю) — так было до выхода i386. Случай же адресации байтов возможен лишь при динамической подстройке ширины шины и из широко известных ЦП применялся только в MC68020/030. В результате к сегодняшнему дню используется именно адресация слов вместе с байт-маской, поэтому физическая разрядность шины адреса оказывается меньше её логической ширины на число бит, на единицу меньшее разрядности шины данных в байтах. Из чего следует, что 32-битная физическая шина адреса может быть только при 8-битной шине данных, на что ни один архитектор и инженер в здравом уме не пойдёт по очевидным соображениям.

Но это ещё не всё. Зачем нам вообще 32-битная физическая или логическая адресация? Середина-конец 80-х, на рынке только-только появились мегабитные микросхемы памяти, типичный объём памяти для ПК пока что измеряется сотнями килобайт, но чуть позже — мегабайтами. А 32-битная адресация позволит получить доступ к 4 ГБ физического ОЗУ! Да кому вообще такое может понадобиться в ближайшие лет 20 в персоналках?! Неудивительно, что первые популярные «32-битные» ЦП имели совсем не 32 бита логической ширины шины адреса: MC68000 имел 24 (23 физических + 1 для управления разрядами), а MC68008 — и вовсе 20. Intel 386SX (вышедший на 3 года позже оригинального полностью 32-битного i80386), помимо уполовинивания шины данных, сократил и шину адреса до 24 (23 физических) бит, а его встраиваемые версии 386EX/CX имели 26-битную шину. Более того, первые чипсеты, позволявшие оперировать 32-битными адресами, появились лишь в 90-х, а первые материнские платы, имевшие достаточное число слотов памяти, чтобы набрать >4 ГБ модулями максимального на тот момент размера — лишь в 2000-х. Хотя первые ЦП с 64-битной физической шиной адреса (IBM/Motorola PowerPC 620) появились аж в 1994 г.. Выводим

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

Как известно, любую хорошую идею можно довести до абсурда, и тогда она сама себя дискредитирует. Увеличение разрядности ЦП — не исключение. На этом месте архитектурщик сразу должен задаться вопросом — а зачем всё это? Увеличивать разрядность данных хорошо для ускорения работы с ними (часто требуется обрабатывать значения, не умещающиеся в 16 бит), а адресов — для получения возможности оперировать большими объёмами данных (ограничение в 64 КБ для 16-битной адресации, кое-как ослабленное сегментной моделью IA-16, сковывало программистов уже в середине 80-х). Можно, конечно, сделать страничную адресацию с программно переключаемыми банками (могли же 8-битные ЦП адресовать 1 МБ на популярных дешёвых ПК и игровых приставках), но ценой усложнения программ и замедления доступа к памяти. Аналогично — разве имеет смысл делать 32-битность для данных такой, что она почти не ускоряет производительность по сравнению с обработкой 32-битных чисел на 16-битной платформе под управлением программы, а не микрокода? Таким образом мы только упростим программирование, сэкономив на числе команд, но не получим скачок в скорости. Из чего мы приходим к выводу — увеличение разрядности должно реализовываться так, чтобы оно реально привело к качественному (больше памяти) и количественному (быстрее операции) скачку возможностей архитектуры. «Больше памяти» здесь относится именно к качественному развитию, т.к. многие алгоритмы и приложения вообще откажутся работать при недостатке ОЗУ, в то время как даже медленный процессор всё равно рано или поздно программу выполнит. Виртуальная память с дисковой подкачкой бессмысленна при менее чем 32-битной реализации.

Но означает ли всё это, что в ЦП как можно больше ресурсов, и аппаратных, и архитектурных, должны быть 32-битными, чтобы его можно было бы назвать полноценным 32-битным процессором? Совсем нет. Возьмём тот же MC68000 — у него 32-битная архитектура для данных и адресов и 32-битные регистры, но 16-битные АЛУ и внешняя шина данных и 24-битная физическая внешняя адресация. Тем не менее, недостаточная «32-битность» не мешает ему обгонять появившийся на 3 года позже «16-битный» 80286: на популярном в 1980-е бенчмарке Dhrystones MC68000 на 8 МГц набирает 2100 «попугаев», а 286 на 10 МГц — 1900 (также 16-битный i8088 на 4,77 МГц — 300).

Но всё это нам не поможет ответить на вопрос — что же такое разрядность процессора? В момент, когда мы уже было пришли к некоему заключению, на сцене появляется новый герой — тип данных. Всё вышеизложенное имело отношение лишь к целочисленным вычислениям и их аргументам. Но ведь есть ещё и вещественные. Кроме того, пока что мы оперируем скалярными величинами, но есть ещё и векторные. А ведь, по слухам, Intel намерена встроить вещественный сопроцессор прямо внутрь своего нового 80486 (напомню: на дворе у нас, условно — 80-е годы). С учётом того, что внутреннее физическое и архитектурное представление данных (с адресами FPU не работает) 80-битное — как же тогда называть «четвёрку» — «32/80-битным» процессором? Вернёмся обратно в настоящее — как называть Pentium MMX, который откусил 64 бита от каждого 80-битного скалярного вещественного регистра и назвал их целочисленным векторным регистром? А Pentum Pro/II с 256-битной шиной данных между кэшем L2 и ядром? (Ещё ранее MIPS R4000 и его варианты имели внутренний контроллёр L2 с внешней 128-битной шиной до самого кэша.) А как назвать Pentium III с его 128-битными регистрами XMM, хотя в каждом таком векторе могут пока храниться лишь 32-битные компоненты, а обрабатываться лишь парами в 64-битных ФУ, но не четвёрками? А как воспринимать готовящиеся сейчас для новых архитектур (в частности, Intel Larrabee) команды векторной адресации типа Scatter и Gather, где части векторного регистра воспринимаются как адреса, а не данные, и потому адресация тоже может считаться ххх-битной?

Современный спор о переходе с 32-битной на 64-битную платформу повторяет эту историю с дополнениями, ещё более подсаливающими и так разнообразное по вкусу блюдо. Прежде всего, если посмотреть на темпы удвоения разрядности (что бы под ней не понимали) однокристальных ЦП, то окажется, что переход от первых 4-битных к первым 32-битным произошёл всего за 8 лет — c 1971 г. (i4004) по 1979 г. (MC68000 и куда менее известный NS32016). Следующее удвоение до 64 бит потребовало 10 лет — i860 имел 32-битное целое скалярное АЛУ и 32-битные универсальные регистры со спариванием, но 64-битные FPU и целочисленное векторное ФУ, 64-битные внешние шины и, впервые, внутреннюю 128-битную шину ядро-кэш. А пока 64 бита добрались до ПК — прошло ещё лет 15, хотя 64-битный доступ к памяти (через 64-битную же шину данных, но для «32-битного» процессора) появился уже в первых Pentium в 1993 г.. А дело в том, что для целочисленных скалярных вычислений два главных типа операндов — данные и адреса — пока достаточно было иметь лишь 32-битными. Об избыточности 32-битной адресации для 80-90-х гг. уже сказано, но и жёсткая необходимость в 64-битных целочисленных вычислениях, в отличие от 32-битных, также до сих пор не возникала, да и не просматривается и сейчас. Для целых чисел диапазон от –2·10 9 до 2·10 9 или от 0 до 4·10 9 покрывает подавляющее большинство нужд, а редкие моменты 64-битности вполне удовлетворяются дедовским способом — операциями над частями операндов с переносом, что не так уж сильно медленнее и доступно с первых моментов появления 32-битных архитектур. Дополнительной пикантности добавляет тот факт, что 64-битная арифметика над целыми числами в архитектуре x86 появились ещё до AMD64 и EM64T, причём сразу векторная — начиная с набора SSE2 (2001 г.) существуют команды paddq и psubq для сложения и вычитания целых 64-битных компонентов, а команды 32-битного перемножения для любой архитектуры дают 64-битное число (команды деления, соответственно — его принимают; аналогично для многих 16-битных платформ, включая IA-16).

Разрядности некоторых процессоров для ПК

Критерий Разрядность
Функциональный обработки хранения обмена
Реализационный физич. архитектурн. физич. архитектурн. физич. архитектурн.
Типовой (D: данных; A: адресов) D A D A D A D A D A D A
i8080/85, Z80 8 8 8-16 16 8 8 8-16 16 8 16 8-16 16
Z8000 16 16 8-64 16 16 16 8-64 16 8-16 23 8-64 23
MC68000/010 (MC68008) 16 16 8-32 32 32 32 8-32 32 8-16 (8) 24 (20) 8-32 32
MC68020/030 32 32 8-32 32 32 32 8-32 32 8-32 32 8-32 32
i8086/186* (i8088/188*) 16 16 8-16 16 16 16 8-16 16 8-16 (8) 20 8-16 20
i80286 16 16 8-16 16 16 16 8-16 16 8-16 24 8-16 24
i80386DX 32 32 8-32 32 32 32 8-32 32 8-32 32 8-32 32
i80386SX (EX/CX) 32 32 8-32 32 32 32 8-32 32 8-16 24 (26) 8-32 32
i860 32/64|64 32 8-64/64|64 32 32/64/32 32 8-64/64/64 32 64 64 8-64 64
i80486 32/80 32 8-32/80 32 32/80 32 8-32/80 32 32 32 8-80 32
Pentium, K5 (Pentium Pro) 32/80 32 8-32/80 32 32/80 32 8-32/80 32 64 32 (36) 8-80 32 (51)
Pentium MMX (Pentium II) 32/80|64 32 8-32/80|64 32 32/80|64 32 8-32/80|64 32 64 32 (36) 8-80 32 (51)
K6 (K6-2) 32/80| 64(/64) 32 8-32/80| 64(/64) 32 32/80| 64(/64) 32 8-32/80| 64(/64) 32 64 32 8-80 32
Athlon 32/80| 64/64 32 8-32/80| 64/64 32 32/80| 64/64 32 8-32/80| 64/64 32 64 36 8-80 51
Athlon XP 32/80| 64/64 32 8-32/80| 64/32-128 32 32/80|64/128 32 8-32/80| 64/128 32 64 36 8-128 51
Pentium III (Pentium 4/M, Core) 32/80| 64/64 32 8-32/80| 64(+128)/32-128 32 32/80| 64(+128)/128 32 8-32/80| 64(+128)/128 32 64 36 8-128 51
Pentium 4 D/EE (Athlon 64*) 64/80| 64/64 64 8-64/80|64 + 128/32-128 64 64/80|64 + 128/128 64 8-64/80|64 + 128/128 64 64(+16) 40 8-128 52
Atom 32-64/80| 64/64-128 64 8-64/80|64 + 128/32-128 64 64/80|64 + 128/128 64 8-64/80|64 + 128/128 64 64 36 8-128 51
Core 2 (i7*) 64/80| 128/128 64 8-64/80|64 + 128/32-128 64 64/80|64 + 128/128 64 8-64/80|64 + 128/128 64 64 (192+16) 40 8-128 52
Athlon II*, Phenom (II)* 64/80| 128/128 64 8-64/80|64 + 128/32-128 64 64/80|64 + 128/128 64 8-64/80|64 + 128/128 64 128+16 40 (48) 8-128 52

* — Мультиплексированная шина данных и адреса (для ЦП с интегрированным контроллёром памяти — только межпроцессорная)
«A/B|C/D» — для данных указана разрядность скалярного целого / вещественного | векторного целого / вещественного доменов
«X+Y» — имеет домены этого вида двух разрядностей
«X-Y» — в зависимости от команды или ФУ принимает все промежуточные значения с целой степенью двойки

Если вы дочитали до этого места, то объявленная цель статьи, скорее всего, уже достигнута, а Идеальное Конечное Точное Определение разрядности так и не найдено. Может быть, его вообще нет, и это даже хорошо. В конце концов, если компьютер это главный инструмент для работы с информацией, то каждая IT-технология это метод улучшения работы компьютера. Разрядность сама по себе ничего не даст в отрыве от всего остального арсенала высоких инфотехнологий. PDA/коммуникаторы, мобильники, нетбуки, медиа-плееры и прочая карманная электроника, а также гигантское количество встроенных контроллёров и бортовых компьютеров отлично работают, увеличивая свою популярность и без всякой 64-битности. Так зачем тогда переходят на большие разрядности? Зачем, например, никому пока не нужная 64-битность в Intel Atom для нетбуков, где 8 ГБ памяти мало того, что никому не нужны, так ещё и за пару часов досуха выжмут батарею, а научные или экономические вычисления (где могут потребоваться 64 целых бита) никто запускать не будет? Один из возможных ответов: «потому что мы можем». Дополнительная пара миллионов транзисторов для удвоения ещё оставшихся 32-битными блоков утонет каплей в море вентилей, уже потраченных на всё остальное в этом же чипе. Галопирующий прогресс микроэлектроники как главного паровоза IT сделал интегральный транзистор таким дешёвым, что теперь лакомый для любого маркетолога шильдик «64 bit» обойдётся потребителю в десяток лишних центов, обеспечивая совсем не бутафорское, а вполне реальное ускорение на 10-50 % в 1-5 % приложений. И если мелкая овчинка стоит почти бесплатной выделки, почему нет?

Если 32- битный процессор может обрабатывать примерно 4 ГБ ОЗУ (то есть 2 32 = 4 294 967 296 ‘ role=»presentation»> 2 32 = 4 294 967 296 ) байтов, почему мой Arduino Mega 2560 имеет 8 КБ SRAM, если 8- битный процессор позволяет обрабатывать только 256 байт ( 2 8 ‘ role=»presentation»> 2 8 )? Или я неправильно читаю следующую страницу?

Большинство 8-битных процессоров имеют 16-битные адресные шины, позволяющие им адресовать 64 КБ, именно потому, что 256 байтов действительно недостаточно, чтобы сделать очень много! Это просто означает, что им нужно загружать два байта вместо одного, каждый раз, когда им нужно загрузить адрес. Немного медленнее, но терпимо, учитывая их размер.

(И да, есть много исключений, в основном, разработанных, когда 64k стали слишком маленькими, но здесь мы говорим об основной идее).

The address bus and data bus are separated so they may have different sizes. For any specific address bus sizes there are a lot of techniques to address more memory than the register bit width

The most common way is increasing the address bus width somehow by

using multiple registers for the address

  • AVR имеет R26..R31, который может быть спарен с 16-битным X , Y и Z регистры адресации данных позволяют максимально использовать 64 КБ ОЗУ. Те , в свою очередь , могут быть соединены с RAMPX , RAMPY , RAMPZ чтобы получить доступ к более высоким адресам ОЗУ в еще большие версии. Он также имеет SPH старшие байты указателя стека в дополнение к SPL вариантам с более чем 256 байтами ОЗУ 1
  • Intel 8080 и Zilog Z80 — это 8-битные процессоры, но у них есть пары регистров, такие как H & L , B & C , D &, E которые можно использовать вместе как 16-битный адресный регистр

используя один большой специальный регистр больше натурального размера для адресации

  • Intel 8051 is an 8-bit microcontroller, i.e. it has 8-bit data address. However it uses 16-bit instruction address and has 2 16-bit registers: PC and DPTR for addressing in instruction space.
  • AVR имеет 16 или 22-битный регистр ПК

using a special register for the high part of the address. When addressing some memory, by default the 8 low bits of the address will be taken from the 8-bit immediate or 8-bit register on an 8-bit microcontroller, whereas the high bits will be replaced by the other address register’s value.

  • A special case of this is segmented memory, which is used by the 16-bit x86. In this technique the memory is divided into multiple segments of size 64KB (2 16 bytes). Normal access is inside a single segment by default so they can use 16-bit address for near data. Data that are further apart must be addressed specifically by segment value, therefore 2 registers must be used for far addressing.
  • ПИК микроконтроллер , чей базовая линия и серия середины диапазона может иметь 13 или 14-битный адрес, является еще одним примером. При использовании call или goto инструкции 8 или 9 младших битов адреса указываются непосредственными, а оставшиеся берутся из текущего программного счетчика. Таким образом, для доступа ко всему, что находится рядом с текущим сегментом, используется только 1 инструкция, в то время как для дальнейших адресов потребуется 2 инструкции (для установки старших битов).
  • Другим примером является архитектура MIPS, которая также сочетает младший 26-битный непосредственный адрес с старшими 6 битами PC при безусловном переходе.

Еще один способ добиться этого — банкинг памяти . Это полезный метод, который до сих пор используется в некоторых архитектурах. В этой модели память делится на несколько банков . Каждый раз вы можете обратиться только в конкретный банк. Часто существует глобальный банк или диапазон адресов, которые всегда видны в любое время, но для других частей вы должны поменять банк при необходимости.

  • Intel 8051 использует банки памяти для регистров. Он имеет 32 регистра, но только 8 из них видны одновременно.
  • x86 PAE и ARM LPAE , с большим физическим адресным пространством, сопоставленным с небольшим виртуальным адресным пространством
  • Another application for this is the Address Windowing Extensions on Windows which can be used by 32-bit x86 apps in PAE mode in order to access more than 2/3GB of memory. It’s not exactly like a memory bank on microcontrollers but can be seen as such, because the big address range can be think of small windows/banks that is small enough to fit in the app’s address space. If the app needs to use data in some window it will map that window into its current address space.
  • DOS also has some types of bank switching like expanded memory or extended memory due to its limited range of addressable memory.

Существует также не совсем распространенная техника, но ее можно найти в Intel 8051 . Как микроконтроллер с 8-битным адресом данных, он может иметь не более 256 адресов. Половина пространства (верхняя часть) используется для регистров специальных функций ( SFR ), ограничивая реальную ОЗУ адресуемой только 128 байтами. Однако современные производители серии 8051 нашли умный способ преодолеть это, разделив доступ к памяти . Прямая адресация будет обращаться к SFR, а косвенная — к регистрам, которые будут обращаться к большей части ОЗУ, что означает, что теперь у вас есть 256 + 128 = 384 адресуемых байта.

Самые маленькие ядра имеют ?256 байтов адресного пространства данных (то есть ?128 байтов ОЗУ после удаления портов ввода-вывода и других зарезервированных адресов) и ?8192 байта (8 КиБ) программного ПЗУ. Они имеют только 8-битный указатель стека (в SPL) и поддерживают только 12-битные относительные инструкции перехода / вызова RJMP / RCALL. (Поскольку счетчик программы AVR считает 16-битные слова, а не байты, 12-битное смещение достаточно для адресации 213 байт ПЗУ.)

Дополнительные возможности адресации памяти предоставляются по мере необходимости для доступа к доступным ресурсам:

  1. Модели с> 256 байтами адресного пространства данных (?256 байтов ОЗУ) имеют 16-битный указатель стека с верхней половиной в регистре SPH.
  2. Модели с ПЗУ> 8 КБ добавляют 2-х (22-битные) инструкции JUMP и CALL. (Некоторые ранние модели страдают ошибками, если за инструкцией пропуска следует инструкция из 2 слов.)
  3. Модели с ПЗУ> 64 КиБ добавляют инструкцию ELPM и соответствующий регистр RAMPZ. Инструкции LPM расширяют адрес ПЗУ до нуля; Инструкции ELPM предшествуют регистру RAMPZ для старших битов. Это не то же самое, что более общая инструкция LPM; существуют «классические» модели только с формой ELPM с нулевым операндом (ATmega103 и at43usb320). Когда доступно автоинкремент (большинство моделей), он обновляет весь 24-битный адрес, включая RAMPZ.
  4. (Редкие) модели с ПЗУ> 128 КиБ имеют трехбайтовый программный счетчик. Для вызова и возврата подпрограммы используется дополнительный байт стекового пространства, имеется новый регистр EIND для предоставления дополнительных старших битов для косвенных переходов и вызовов, а также есть новые расширенные инструкции EIJMP и EICALL, которые используют EIND: Z в качестве адреса назначения. (В предыдущих инструкциях IJMP и ICALL Z был расширен до нуля.)
  5. (Редкие) модели с адресным пространством ОЗУ> 64 КиБ расширяют пределы адресации 16-битной ОЗУ с помощью регистров RAMPX, RAMPY, RAMPZ и RAMPD. Они обеспечивают дополнительные старшие биты для режимов адресации, которые используют пары регистров X, Y или Z соответственно или инструкции прямой адресации LDS / STS. В отличие от доступа к ПЗУ, нет четких «расширенных» инструкций; вместо этого регистры RAMP используются безоговорочно.

Почти все 8-битные процессоры имеют некоторую способность формировать 16-битный адрес из младшей и старшей частей. На некоторых процессорах, включая оригинальный 8080, существуют регистры, предназначенные для хранения верхней и нижней части адреса (хотя с точки зрения программиста могут существовать некоторые регистры, такие как указатель стека 8080, которые не предлагают инструкции для их адресации отдельно). В некоторых других процессорах нет регистров, предназначенных для верхней или нижней половины адреса, но адреса собираются «на лету». Например, на 6502 инструкция «LDA $ 1234, X» загружает аккумулятор с адресом, образованным путем добавления $ 1234 в 8-битный регистр X [предположим, что он содержит $ F0]. Выполнение этой инструкции будет проходить в 4 или 5 шагов:

  1. Завершите запись в регистр из предыдущей инструкции (если есть) и загрузите код операции ($ BD)
  2. Получить первый байт операнда после кода операции ($ 34) во время инструкции по декодированию
  3. Получить второй байт операнда ($ 12) при добавлении ранее извлеченного байта в регистр X
  4. Считайте память по адресу, сформированному путем объединения второго байта операнда с результатом ALU [т.е. $ 1224]. Введите второй байт операнда в ALU, чтобы добавить ноль или единицу в зависимости от того, сгенерировал ли предыдущее добавление перенос
  5. Чтение памяти по адресу, сформированному путем замены верхней половины на результат ALU [$ 1334]

Передача считанного байта в аккумулятор будет перекрывать выборку следующей инструкции. Кроме того, для многих операций, если шаг 3 не сгенерировал перенос, шаг 4 считал бы правильный адрес, и выполнение могло бы перейти непосредственно от шага 4 к следующей инструкции, минуя шаг 5.

Если вы изучите последовательность операций, то заметите, что архитектура с прямым порядком байтов имеет определенное преимущество над архитектурой с прямым порядком байтов, в этом случае в большинстве случаев (хотя и не той, что показана), даже если ALU выполняет цикл для выполнения Кроме того, можно считывать байт с вычисленного адреса, не ожидая результата ALU, поскольку обычно выбираемый старший байт будет старшим байтом целевого операнда. На машине с прямым порядком байтов с 8-битным ALU индексированная загрузка будет занимать не менее 5 циклов (поскольку нижняя половина адреса не будет считана до шага 3 и, следовательно, будет вычислена на шаге 4).

Рассмотренная в параграфах 4.4 и 4.5 структура в виде операционного и управляющего автоматов дает наглядное представление о принципах построения и функционирования процессоров, предназначенных для умножения и деления двоичных чисел. В отличие от специализированных процессоров универсальные процессоры включают в себя большое число различных цифровых узлов и каналов для обмена информацией между ними, поэтому обладают широкими функциональными возможностями. Для более глубокого понимания принципов построения микропроцессоров и микропроцессорной обработки информации целесообразно рассмотреть простейший 8-разрядный процессор (рис. 5.1), отличительные особенности которого от рассмотренных процессоров для умножения/деления двоичных чисел состоят в следующем:

  • • операционный автомат представляет собой арифметико-логическое устройство (АЛУ), построенное на основе двоичного сумматора со схемами ускоренного переноса (см. параграф 4.6);
  • • управляющий автомат строится на основе программируемой логики, которая хранится в постоянной памяти;

Рис. 5.1. Структура 8-разрядного процессора

• дополнительно введены регистры, образующие внутреннюю память микропроцессора.

Внутренняя шина данных соединяет между собой отдельные узлы процессора. 16-разрядная шина адреса (ША) предназначена для обращения к ячейкам внешней памяти и определяет их число, равное 216 = 64К (К = 210 = 1024), внутренняя шина управления (на рис. 5.1 не показана) служит для передачи управляющих сигналов, признаков состояния процессора и периферийного оборудования.

Когда говорят о разрядности процессора х64, это значит, что он имеет 64-разрядную шину данных, и 64 бита он обрабатывает за один такт.

Разрядность процессора определяет размер обработки данных за один такт, которыми процессор обменивается с оперативной памятью. Если размер данных за такт равен 1 байту, то процессор называют восьмиразрядным (8 bit), если размер 2 байта процессор шестнадцатиразрядный (16 bit), если размер равен 4 байтам, то процессор тридцатидвухразрядный (32 bit), если размер равен 8 байтам, то процессор шестидесяти четырех разрядный (64 bit).

Первыми процессорами х86 были 16-разрядными. Но с выпуском процессора 80386 архитектура стала иметь разрядность равную 32. На смену 32-битной архитектуре были предложены 64-битная архитектура в 2002 году фирмой AMD в процессорах линейки К8 (тогда процессоры маркировались как x86-64 и в последствии заменена на AMD64). Не отставая от конкурента, Intel предложили новое обозначение — EM64T (Extended Memory 64-bit Technology). Хотя различий в архитектуре не было никаких: разрядность внутренних регистров 64-битных процессоров удвоилась (с 32 до 64 бит), а 32-битные команды x86-кода получили 64-битные аналоги. Так же, благодаря расширению разрядности шины адресов объем адресуемой процессором памяти значительно увеличился.

Польза для Windows x64

Основная польза это поддержка оперативной памяти больше 4 Гб. Каждая ячейка оперативной памяти имеет адрес и в 32-х битной операционной системе он записывается как двоичный код длиной в 32 символа. Получаем — 2^32=4294967296 байт = 4 ГБ.

Иначе говоря, в 32-битной операционной системе, ячейки памяти расположенные за границей в 4Gb не получат адреса и не будут использованы.
В 64-х битных операционных системах размер адресной памяти равен 2^64= 18446744073709551616 = 16 Гб. Однако, Windows 7 Professional, Windows 7 Enterprise, Windows 7 Ultimate могут поддерживать до 192 Gb оперативной памяти, а операционные системы для серверов Windows Server 2008 до 2 Tb.

Повышение производительности приложений в Windows x64

Не стоит думать, что при повышении разрядности в два раза – во столько же раз повысится и производительность. Как показывают тесты, в операционных системах х64 производительность выше всего на 10-15%, чем в ОС с разрядностью х32.

Большинство современных процессоров основано на 64-х битной архитектуре. Это, по большей части, означает, что информация в системе передается блоками по 64 бита. Тем не менее, еще не ушли в мир иной и процессоры с иной архитектурой. Есть даже новые экземпляры — правда, их создают энтузиасты для каких-то своих целей. Ранее одним из наиболее известных восьмибитных процессоров был Intel 8008, появившийся в начале 1970-х.

Конечно, те процессоры достаточно примитивны по сравнению с современными, но свою работу они выполняли на «отлично». На днях в сеть попала информация о собранном из подручных материалов 8-битном процессоре, который функционирует без проблем, хотя и смотрится несколько странно. Его создал пользователь YouTube Пауло Константино (Paulo Constantino).

На первый взгляд, разработка Константино выглядит, как скопище проводов (на второй взгляд тоже). Но в состав конструкции входят не только провода. Процессор смонтирован на монтажной плате, которая позволяет создавать макеты самых разных схем — от простейших до самхы сложных.

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

Его процессор может воспроизводить тему из Mario, но вот программировать систему достаточно сложно. Проблема в том, что к системе не подключена клавиатура, поэтому все необходимо делать вручную. Спустя некоторое время разработчик планирует добавить клавиатуру, чтобы работать было удобнее. Тогда процессор сможет показать все, на что он способен.

8-битный процессор — интересный проект, но наиболее масштабная работа такого рода — Megaprocessor. Он представляет собой 16-ти битный процессор с четырьмя регистрами общего назначения. На отдельных панелях размещаются схемы различного назначения, включая память, арифметический блок, ввод/вывод и некоторые другие. В этой системе используется 16-ти разрядный блок АЛУ и 16-ти разрядный сумматор. Megaprocessor оснащен 10 000 светодиодов, мигание которых демонстрирует каждый этап процесса вычислений, показывая направление движение данных по схеме. Объем памяти составляет 256 байт.

В схеме использовано более 27000 транзисторов — это только для блока памяти. Общее же число транзисторов в этой системе свыше 40 тысяч. Масса процессора, который работает на частоте 20 килогерц — 500 килограммов.

Автор этой разработки — инженер-электронщик из Великобритании. Его зовут Джеймс Ньюман. Как-то он захотел разобраться в мельчайших подробностях в принципе работы процесса. Ну и лучший из способов сделать это — собрать процессор своими руками.

«Компьютеры непрозрачны. Смотря на них, нельзя понять, как они работают. Что я хотел сделать — это забраться внутрь и понять, что происходит. Проблема в том, что это невозможно осуществить с процессорами обычного размера. Но мы можем построить большой процессор своими руками — и тогда будет понятно, что происходит внутри. Для отображения потоков данных стоит добавить еще и светодиоды — что и было сделано», — говорит Джеймс Ньюман. Теперь за работой Megaprocessor можно наблюдать в режиме реального времени, и любой человек может понять, из каких элементов состоит процессор и как работает каждый блок.

Использовать процессор можно для самых разных целей, но инженер выбрал игру тетрис для того, чтобы показать принцип работы всей системы. Во время игры все процессы, которые происходят во время работы системы, показываются в режиме реального времени при помощи индикаторов. Количество самых разных соединений в системе превышает 100 000.

На свой проект Ньюман потратил без малого потратил около 40000 фунтов стерлингов. Сейчас, возможно, уже и больше, поскольку он постоянно продолжает совершенствовать систему.

Изначально инженеру казалось, что он сможет реализовать свой проект за год. Но пришлось потратить более пяти лет, при том, что Megaprocessor продолжает совершенствоваться.

Как работает 8 разрядный процессор