Comments 63
Да.
Нередко слова «сокращённый набор команд» понимаются как минимизация количества инструкций в системе команд. В действительности, инструкций у многих RISC-процессоров больше, чем у CISC-процессоров.[6][7] Некоторые RISC-процессоры вроде транспьютеров фирмы INMOS (англ.) имеют наборы команд не меньше, чем, например, у CISC-процессоров IBM System/370; и наоборот — CISC-процессор DEC PDP-8 имеет только 8 основных и несколько расширенных инструкций.
На самом деле, термин «сокращённый» в названии описывает тот факт, что сокращён объём (и время) работы, выполняемый каждой отдельной инструкцией — как максимум один цикл доступа к памяти, — тогда как сложные инструкции CISC-процессоров могут требовать сотен циклов доступа к памяти для своего выполнения.[8]
При этом время выполнения одинаковых команд на процессорах RISC и CISC принципиально не отличается. Т.е. если взять подмножество команд CISC, соответствующих командам RISC, то получится, что это практически одно и то же. Только в CISC есть другое, непересекающееся с RISC подмножество команд. Именно этим они и отличаются — набором команд, а не временем их исполнения.
Просто разная идеология.
ADD A, M
, и процессор вам сам затянет операнд из указанной в регистрах H и L ячейки памяти. Там нельзя указать адрес непосредственным операндом команды, но по косвенной адресации все инструкции процессора умеют тянуть данные прямо из памяти.В данном случае особенность CISC в увеличенном количестве действий за инструкцию (для некоторого подмножества инструкций).
Вы правы. Добавлю в статью.
"Количество действий за такт от набора команд в общем случае не зависит вообще." - не факт. Я тут пытался придумать собственный процессор. И разложить его по тактам генератора. И с удивлением обнаружил, что это, кхм, не просто. Чисто технически, триггер срабатывает по фронту импульса (возможны варианты, я знаю). А значит, если мы хотим выполнить что-то вроде "push AX", то процесс займёт несколько тактов: "такт1 - прочитать код операции и защёлкнуть в регистре операций, декодировать, выставить разные сигналы типа адреса, такт2 - защёлкнуть данные в памяти, такт 3 - выполнить декремент указателя стека". Выполнить это за один такт, кажется, невозможно. Отсюда очевидно, что количество действий на такт напрямую зависит от набора команд. Если команда - это сложение пары чисел из памяти, то действий будет ещё больше, так как невозможно достать из памяти за один раз два разных числа.
(да-да-да, я знаю, что я опоздал на 10 лет).
Я как-то не уловил, каким образом ваш комментарий подтверждает ваш же тезис.
В CISC архитектурах часто встречается большее количество действий на команду, это да. Но количество действий на такт от этого не зависит никак.
Похоже, я немного запутался. Что мы считаем за действие? Команду? Или что-то помельче, например сложение пары регистров/запись в память?
p.s. в целом как-то сумбурно и в одну кучу, IMHO
И так что такое битность процессора? Многие считают, что это битность шины данных. Но это не так.Почему?
Далее можно было не писать.Почему? Потому что следующие предложения ничего не поясняют, и я как читатель чувствую себя дибилом в кругу умных.
Например для установки ножки в STM32 в высокое и низкое состояние используется разные регистры, что позволяет иметь атомарность на уровне переферии.
Тоже самое… если начинаете говорить в лицах, то как то логичнее заканчивайте мысль:
"… используются разные регистры BSRR/BSR для атомарного, и ODR для не атомарного..."
Автор понимает все. Это попытка донести минимум информации о процессоре. Как я уже сказал, в дальнейшем все будет НАМНОГО подробнее.
Касающихся, например, работы кэша.
«Если коротко процессор анализирует часть кода, что бы предугадать прыжки и доступ в память и зараннее просит кеш получить эти данные из памяти».
Процесссор не анализирует код, он использует информацию об уже произошедших обращениях к памяти. Это совершенно разные вещи. Тем более, что предвыборка, как таковая, для работы кэша вовсе не обязательна.
И это нельзя списать на то что «потом будет подробнее». Потому что «подробнее» и «по-другому» не одно и то же.
Насчет предвыборки — в тех-же Intel с четыремя ядрами, которые Вы, как программист, видете, параллельно работает пятое ядро на предсказаниях и предвыборке, которое дает рекомендацию кешу на предпрочтение. И предсказание работает НЕ только на статистике предыдущих выборок.
Если не верите — почитайте какой-нибудь учебник по проектированию процессоров. Даже классический Харрис сойдет — его перевод кстати сейчас ДМК планируют в печатной форме выпустить…
Я специально исключил термины и названия, что бы не путать новичков. И мне надо это исправить :). Да с "почему" бред вышел. Там предложения было сокращено и несколько абзацов исчезли. Почему должен был относиться к другому предложению.
Как-то сумбурно и недостаточно широко. Если это всё, что вы знаете, то в лучшем случае вы придумаете какой-нибудь MIPS. Я бы добавил ещё как минимум про микрокод, delay slot-ы и стековые архитектуры.
И да, мне кажется, или PIC/PIE вообще никакого отношения к процессорным архитектурам не имеют?
Да. Хочу статью :)
Когда я в своё время на дипломе предложил память и арифметику тактировать по-разному, с отсуствием ожидания готовности (синхрон, всё считано) — меня заклевали так, что пришлось почти всё переделывать… даже слова были типа «техническое хулиганство» и прочий «авантюризм» (когда получаешь недопуск к защите это, скажу я вам, оч-чень неприятно)… (просто там почти на порядок быстродействие поднять удалось на той же элементной базе по сравнению с тогдашней типовой учебной схемой, если бы вышло чуть хуже — никто б не возбудился)…
Так и создаётся впечатление, что все идеи «оттуда».
https://en.wikipedia.org/wiki/Transmeta_Crusoe
the Crusoe runs a software abstraction layer, or a virtual machine, known as the Code Morphing Software (CMS). The CMS translates machine code instructions received from programs into native instructions for the microprocessor. In this way, the Crusoe can emulate other instruction set architectures (ISAs).
То же самое можно сказать про любую машину с микрокодом. А еще я могу вспомнить машину МИР 60х гг.
Системные вызовы используется в Операционных системах для того что бы программы могли общаться с операционной системой например просить ОС прочитать файл. Очень похоже на прерывания. Аналогично исключениям не всегда присутствуют в процессоре
Это сущность уровня ОС. Иногда в наборе инструкций есть специальный(е) опкод(ы) для большего удобства (типа svc в arm), которые порождают event и, соответственно, прерывание как реакцию на него. Но говорить, что системные вызовы есть на уровне процессора как-то странно.
В таком режиме программа или ОС имеют полный доступ к памяти в обход MMU/MPU.
Привилегированный режим не означает отключение MMU и MPU, они могут управляться в этом режиме (не всегда, иногда может производиться блокировка MPU после его конфигурации и следующий раз можно конфигурировать только после reset'а; не знаю есть ли такие режимы для MMU у кого-нибудь).
Что такое PIE? (PIC не использую для избежания путаницы с МК PIC). PIE это техник благодаря которому компилятор генерирует код который будет работать в любом месте в памяти. Это техника в совмещении с MPU позволяет компилировать высокие языки программирования которые будут работать и с MPU.
Высокие языки программирования — это хорошо, смешно. PIC, конечно, генерирует position independent code, который содержит ещё таблицы для загрузчика, чтобы можно было заставить этот код работать после расположения по определенному адресу. И эта функциональность предоставляется ОС. Что означает последняя фраза — мне неведомо, написано очень криво.
Пример совмещения является MIPS16 в MIPS и Thumb-I/II в ARM.
Вы thumb и thumb2 не путайте. Thumb2 поддерживает операции с 3 регистрами вида ADD Rd, Rn, <operand2>
и ADD Rd, Rn, #<imm12>
; <operand2>
может содержать регистр с опциональным сдвигом на константу или другой регистр (типа ADD Rd, Rn, Rm, LSL #3
).
И вправду там thumb 2 откуда то взялся! Сейчас исправлю.
И ошибка в PIE получилась смешная.
Кажеться вы пропустили часть чуть выше. Я чуть выше описал, что оно не всегда присутсвует.
U, the 'User/Supervisor' bit, controls access to the page based on privilege level. If the bit is set, then the page may be accessed by all; if the bit is not set, however, only the supervisor can access it. For a page directory entry, the user bit controls access to all the pages referenced by the page directory entry. Therefore if you wish to make a page a user page, you must set the user bit in the relevant page directory entry as well as the page table entry.
Из http://wiki.osdev.org/Paging.
Я имел ввиду, что можно обойти MPU и использовать память предназначенную только для супервизора.
Почему? Потому что нельзя создать унивирсальную архитектуру.
Как раз на возможности создать универсальную архитектуру базируется всё ИТ, если Тьюринг вам о чём-то говорит. Возможно имелась ввиду оптимальность?
Да говорит :) Подразумевалась архитектура, которая будет решать все задачи. Нельзя создать процессор, который будет маленьким и поддерживать много операций. Нельзя создать процессор, который будет дешевым и будет функциональным. Итд.
Кеш и Гарвард связанны, но когда мы будем создавать свой процесор кеша не будет. Поэтому здесь много моментов пропущенно.
Про многоядерность будет во второй части.
Акумуляторы в современных процессорах не используеться.
Скорее "Чтобы я хотел, чтобы читающий знал до перехода к практике".
Спасибо за замечания!
Reduced Instruction Set Computer — Архитектура с уменьшенным временем выполнения инструкций
Штоэээа?
Аразве не архитектура с «упрощённым набором инструкций» (буквально)?
CISC — Complex Instruction Set Computer — ее особенность в увеличенных количествах действий за такт.
Штоэээа?
Прям таки «за такт», а не за машинный цикл?
И вообще, разве это не подразумевает «сложные инструкции», с «богатой семантикой»?
Архитектура фон Неймана
[...]
Особенностью таких архитектур была общая шина данных и инструкций
Штоэаа?
Фон Нейман — это архитектура с общей памятью программ и данных.
К «общей шине» она не имеет непосредственного отношения.
Большинство современных архитектур это программный фон Нейман, однако никто не запрещает делать аппаратный Гарвард.
Обожемой…
Архитектура гарварда
Harvard
Особенность этой архитектуры является отдельная шина данных и инструкций.
Гарвардская архитектура имеет раздельную память программ и данных.
Легче реализуется.
Микропрограммные устройства практически автоматом реализуются в гарвардсткой архитектуре.
Может эмулировать архитектуру фон Неймана — изображая из себя «микроядро» и реализуя его функциональность при соотв. аппаратной поддержке.
Что такое конвейеры? Если сказать очень глупым языком это несколько параллельных действий за один такт.
Удивительно, но это так.
Хотя стоит отметить, что при конвейеризации параллельно исполняются отдельные этапы исполнения команды — т.е. когда цикла исполнения команды (машинный цикл) состоит из нескольких тактов — в каждом из них одновременно выполняются разные этапы разных (последовательно расположенных) команд.
Что такое регистр статуса? Это регистр который хранит состояние процессора. Например находится ли процессор в привилегированном режиме, чем закончилась операция последнего сравнения.
Используется в связке с Masked Execution.
Ойфто? 0_0
Идут множество споров насчет того сколько должно быть операндов в арифметических инструкциях. Например в MIPS используется вариант с 3-мя регистрами. 2 операнда, 1 регистр записи.
Это, вообще говоря, следует отнести к архитектурным особенностям.
Возможна трёхадресная, двухадресная, одноадресная и безадресная системы команд.
Трёхадресная: A < — B * C, результат операции "*" между B и C помещается в регистр A, все регистры произвольно адресуемые.
Двухадресная: B < — B * C.
Одноадресная: A < — A* C, здесь A — фиксированный регистр-аккумулятор. Обычно мнемоника либо включает его, либо подразумевается — MOVA, к примеру. Возмодны одноадресные команду «просто» — инверсия операнда, к примеру.
Безадресная — операции на стеке с помещением результата в него же.
Фон Неймановская архитектура обычно реализует двухадресную или одноадресную (с аккумулятором) систему команд, Гарвардская — может иметь трёхадресную.
И так что такое битность процессора? Многие считают, что это битность шины данных. Но это не так. Почему? В ранние переоды микроконтроллеров и микропроцессоров шина могла быть например 4-х битной но передавала пакетами по 8 бит.
Внезапно!
Первый Пентиум имел 64-битную шину данных, но 32-битное АЛУ.
В общем, с этим всё непросто — хотя чаще битность считают по АЛУ.
Атомартность операций обеспечивает потоко-независимое исполнение за счет инструкций который выполняют несколько действий за один Псевдо такт.
Атомарность — это непрерываемость исполнения.
Например, инструкция практически всегда является атомарной, бо не может быть прервана «на половине» прерыванием.
И вы кончено слышали о такой вещи, как Cache Miss или промах по кешу. Это операция которая не была предустмотренна процессорам или процессор не успел закешировать эту часть памяти. Что достаточно часто является проблемой замедления доступа к памяти. Промах проходит незаметно для программы, но не остается не заметными просадки в производительности. Так же переключения контекстов например при прерываниях тоже заставляет страдать кеш ибо небольшой код сбивает конвейер и кеш для собственных нужд.
Shadow Registers
В современных процессорах часто используеться техника теневых регистров. Которые позволяют переключаться между прерываниями и пользовательским кодом практически без задержек связанных с сохранением регистров.
Стек? Я видел Стек в .NET и в Java! Что же. Вы частично правы. Стек существует, но он никогда не был апаратным в большинства процессорах.
М-ммм.
Что имеется в виду?
Отдельная память для стека — иле отсутствие специализированных инструкций (push/pop/call/ret) — работающих в связке со специализированным регистром-указателем стека SP?
Например в MIPS его по просту нет. Спросите КАК ТАК ТО?! Ответ прост.
«It's a BAD».
Например в действительно древних УС-ках стека тоже не было — и это не есть гуд.
Конец
Низачод.
Будь я Вашим преподом в СШ — именно такую оценку я бы Вам выставил.
Не раскрыты темы микропрограмм, АЛУ, DSP — а в остальном чрезвычайно много э-ээ, неверного.
Низачод.
- RISC прочитайте мой коментарий чуть выше
- CISC слегка подредактировал.
- Вы правы. Какой-то бред в итоге получился. Хотел укоротить, вынес вперед ногами весь смысл.
- Согласен здесь все не просто. Надо было мне больша букАв про битность. А то получилось просто небольшое опровержение мифа.
- Не много не понял.
- Shadow registers и кеш. Не вижу вашего текста.
- Отсутсвие инструкций. Здесь стоит не согласится. Я считаю, что инструкции PUSH и POP не нужны. Посмотрите на код генерируемый GCC он использует указатель стека для локальных переменных используя инструкции ld и st относительно указателя стека в MIPS. Я считаю MIPS эталоном RISC ядер. Хотя это сугубо личное мнение.
- Прочитайте текст далее. Конец ПЕРВОЙ главы нулевой части. Это не конец. Это начало (хоть и не удачное). И судить ПОКА о всей серии рано.
Гарвардская архитектура имеет раздельную память программ и данных.
Легче реализуется.
Микропрограммные устройства практически автоматом реализуются в гарвардсткой архитектуре.
Может эмулировать архитектуру фон Неймана — изображая из себя «микроядро» и реализуя его функциональность при соотв. аппаратной поддержке.
Сейчас вообще в микроконтроллерах часто применяется modified harvard, о которой автор вообще не упомянул. И modified harvard, например, позволяет читать данные из instruction memory и наоборот. Плюс часто реально используется общая память, которая разделяется на уровне i- и d-cache или соответствующих шин.
Стек существует, но он никогда не был апаратным в большинства процессорах. Например в MIPS его по просту нет. Стек это просто доступ к памяти которую не нужно резервировать (очень грубое определение). Стек используется для вызова функций, передачи аргументов, сохранения регистров для того чтобы востановить их после выполнения функции и т.д.
Ну если Вы знаете, как обрабатывать прерывания без аппаратного стека возвратов, то с нетерпением жду следующую статью.
И Вы таки правы, Ваше определение стека очень грубое и, по моему мнению, настолько грубое, что даже и неверное.
Стек? Я видел Стек в .NET и в Java! Что же. Вы частично правы. Стек существует, но он никогда не был апаратным в большинства процессорах. Например в MIPS его по просту нет. Спросите КАК ТАК ТО?! Ответ прост. Стек это просто доступ к памяти которую не нужно резервировать (очень грубое определение). Стек используется для вызова функций, передачи аргументов, сохранения регистров для того чтобы востановить их после выполнения функции и т.д.
Если она аппаратно не реализуется тогда его нужно реализовать явно для обработки(возврата к инструкциям до вызова и возврата состояния регистров) функций и прерываний?
Хорошая статья, жду продолжения. Как раз тоже решил попробовать реализовать свой процессор на базе ПЛИС.
Здесь мы будем затрагивать ПЛИС. Но пока рано :)
Небольшая статья, которая мне помогла https://embeddedmicro.com/tutorials/lucid/basic-cpu
> недостатком является большое зависимости производительности процессора от шины
В статье очень много таких странных грамматических несогласований, и орфографических ошибок («она пригодиться нам в статьях с практикой.»). А тут вообще непонятно, что имелось в виду:
> Так же несколько инструкций в начале кода будет занято инструкциями для Таблицы прерываний.
«Инструкции для таблицы прерываний» это вектора прерываний, что ли? Тогда они обычно не инструкции, если не применён стиль i8080. Если же данный стиль — то лучше было описать в статье с реализацией прерываний.
Рекомендую тщательно вычитать и исправить.
По отдельным пунктам:
> CISC — Complex Instruction Set Computer — ее особенность в увеличенных количествах действий за инструкцию.
Основные признаки CISC:
1. Ориентация на написание ассемблерного кода человеком, или компилятором, транслирующим типичные операции ЯВУ дословно, без их переработки. Во времена слабых компиляторов (считаем, до середины 80-х) это неизбежно.
2. Как следствие (1) — стремление к ортогональности операций и адресации операндов, и предоставление средств для идиоматических действий типа «доступ по адресу, снимаемому с вершины стека».
3. Экономия памяти под инструкции. Этот признак не имеет причиной концепцию CISC, но современен ему (основные разработки шли в условиях дорогой, но быстрой памяти, сравнимо со скоростью процессора). Отсюда — обязательность разной длины инструкций.
Яркие примеры — PDP-11, VAX, M68K. Упоминать здесь x86 не совсем адекватно. У x86, например, у основного блока команд допускается не более одного операнда в памяти (исключения вроде MOVS крайне редки). В этом смысле, x86 — полу-RISC. Ещё жёстче это, например, в линии S/360...z/Arch в блоке RX-команд — в памяти только второй источник, но не первый источник, он же приёмник.
Просто о количествах действий тут говорить нельзя. Например, можно увеличить указатель стека, сняв один из операндов со стека, но не делают инструкции, в которых увеличивается указатель стека, когда стек вообще не участвует. Линия с явным заданием нескольких одновременных действий это EPIC (многими считается как вариант VLIW), но это другая линия.
> Reduced Instruction Set Computer — Архитектура с уменьшенным временем выполнения инструкций (из расшифровка RISC можно подумать, что это уменьшенное количество инструкций, но это не так)
Не так, но и не по-вашему. RISC это уменьшенная сложность одной инструкции. А по второй расшифровке — Rational Instruction Set Computer — оптимизация построения на типичные применения с отбрасыванием лишнего, и на современные компиляторы с их логикой работы.
Время выполнения одной инструкции может быть в типичном случае даже выше, за счёт подъёма всех до 4-5 тактов, но это компенсируется простотой построения параллельного исполнения.
> Архитектура фон Неймана
Есть и другой метод называния — принстонская архитектура (а фон Неймана — общее у принстонской и гарвардской).
> У данной архитектуры большим недостатком является большое зависимости производительности процессора от шины.
Это существенно только для реализаций, исполняющих всю команду за один такт. Такие используются, да, в очень «мелких» реализациях, но как только мы выходим за пределы встраивания процессора в двухкопеечную монету, общая шина к памяти перестаёт быть узким местом. На нынешнем x86 она не является таковым. На мелких RISC конфликты доступа за память только немного притормаживают конвейер.
> В x86 регистров достаточно мало.
Было мало. В современных имеем, даже считая 32-битку,
1) 8 основных (eax, ebx, ecx, edx, esp, ebp, esi, edi)
2) 8 FP или MM
3) 8 XMM/YMM/ZMM
4) 8 предикатных (K0-K7) (AVX512)
и значительную часть целочисленных операций можно использовать на них всех, и тем более эти регистры можно применять для временного сохранения значений без доступа к памяти.
В 64 битах добавляется ещё 8 основных и 8 XMM/YMM/ZMM. Это уже больше, чем 32.
Пока остановился. Ещё раз сводное — в таком виде статья просто бесполезна. Лучше всё описанное вводить постепенно, и на реальных примерах. Потом, после всего цикла, уже можно сделать что-то похожее на эту статью в качестве резюме, но тогда и формулировки каждого пункта будут совсем другими.
Собственная платформа. Часть 0.1 Теория. Немного о процессорах