Как инструкция по сборке превращается в изменения напряжения на процессоре? - PullRequest
42 голосов
/ 14 сентября 2010

Я работаю в C и CPython в течение последних 3 - 5 лет.Предположим, что моя база знаний здесь.

Если бы мне пришлось использовать инструкцию по сборке, например MOV AL, 61h, для процессора, который его поддерживал, что именно находится внутри процессора, который интерпретирует этот код и отправляет его как сигналы напряжения?Как, вероятно, будет выполнена такая простая инструкция?

Сборка даже выглядит как язык высокого уровня, когда я пытаюсь представить множество шагов, содержащихся в MOV AL, 61h или даже XOR EAX, EBX.

РЕДАКТИРОВАТЬ: я прочитал несколько комментариев, спрашивающих, почему я ставлю это как встроенный, когда семейство x86 не распространено во встроенных системах.Добро пожаловать в мое собственное невежество.Теперь я полагаю, что если я не знаю об этом, то, вероятно, есть и другие, которые не знают об этом.

Мне было трудно выбрать любимый ответ, учитывая усилия, которые вы все вложили в свои ответы, но ячувствовал себя вынужденным принять решение.Не обижайте, ребята.

Я часто нахожу, что чем больше я узнаю о компьютерах, тем меньше понимаю, что на самом деле знаю.Спасибо, что открыли мой разум для микрокода и транзисторной логики!

РЕДАКТИРОВАТЬ # 2: Благодаря этой теме, я только что понял, почему XOR EAX, EAX быстрее, чем MOV EAX, 0h.:)

Ответы [ 12 ]

34 голосов
/ 15 сентября 2010

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

Это мой относительно короткий ответ, а не Петцольдс ... и, надеюсь, в соответствии с тем, о чем вы любили.

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

Теперь, когда существует транзистор, это послужило способом использовать транзистор в качестве переключателя, например, выключателя света. Радиоприемник похож на диммерный выключатель света, вы можете включить его в любом месте от полного до полного выключения. Выключатель света без диммера либо включен, либо выключен, в середине переключателя есть какое-то волшебное место, где он переключается. Точно так же мы используем транзисторы в цифровой электронике. Возьмите выход одного транзистора и подайте его на вход другого транзистора. Выход первого, конечно, не такой слабый сигнал, как радиоволна, он заставляет второй транзистор полностью включаться или выключаться. это приводит к концепции TTL или транзисторно-транзисторной логики. По сути, у вас есть один транзистор, который управляет высоким напряжением или позволяет назвать его 1, а на этом нулевом напряжении, давайте назовем это 0. И вы расположите входы с другой электроникой, чтобы вы могли создавать И-вентили (если оба входа Если 1, то выход равен 1), ИЛИ вентили (если один или другой вход равен 1, то выход равен 1). Инверторы, NAND, вентили, вентили NOR (или с инвертором) и т. Д. Раньше был справочник по TTL, и вы могли купить 8 или около того чипов с одним или двумя или четырьмя воротами (NAND, NOR, И, и т. Д.) Функции внутри, два входа и выхода для каждого. Теперь нам не нужны те, которые дешевле создавать программируемую логику или выделенные микросхемы с миллионами транзисторов. Но мы все еще думаем с точки зрения И, ИЛИ, а НЕ ворот для проектирования аппаратного обеспечения. (обычно больше похоже на nand и nor).

Я не знаю, чему они учат сейчас, но концепция та же самая, поскольку для памяти триггер можно рассматривать как две из этих пар TTL (NANDS), связанные вместе с выходом одной, поступающей на вход другой.Оставим это на этом.Это в основном один бит в том, что мы называем SRAM, или статический ramСрам занимает в основном 4 транзистора.Драм или динамический таран памяти, которые вы вставляете в свой компьютер, самостоятельно берут один транзистор на бит, поэтому для начала вы можете понять, почему драм - это то, что вы покупаете за гигабайты.Биты Sram помнят, что вы их установили, пока не отключится питание.Драм начинает забывать то, что вы сказали ему, как только вы говорите, в основном, драм использует транзистор еще одним третьим способом, есть некоторая емкость (как в конденсаторе, не будем вдаваться в это здесь), которая похожа на крошечную перезаряжаемую батарею,как только вы зарядите его и отсоедините зарядное устройство, оно начнет разряжаться.Представьте себе ряд стаканов на полке с небольшими отверстиями в каждом стакане, это ваши биты драм, вы хотите, чтобы некоторые из них были такими, чтобы у вас был помощник, чтобы заполнить стаканы, которые вы хотите, чтобы они были.Этот помощник должен постоянно заполнять кувшин и идти вниз по ряду, держать «однобитовые» стаканы достаточно заполненными водой, а «нулевые» стаканы должны оставаться пустыми.Таким образом, в любой момент, когда вы захотите увидеть, какие у вас есть данные, вы можете просмотреть и прочитать их и нули, ища уровни воды, которые определенно выше среднего уровня, равного единице, и уровней, определенно ниже середины, равных нулю.при включенном питании, если помощник не может держать очки достаточно полными, чтобы отличить один от нуля, они в конечном итоге будут выглядеть как нули и истощатся.Это обмен на большее количество бит на чип.Короткая история здесь заключается в том, что за пределами процессора мы используем драм для нашей объемной памяти, и есть вспомогательная логика, которая заботится о том, чтобы сохранять единицы в единицу и нули в ноль.Но внутри чипа регистр AX и регистры DS, например, хранят ваши данные с помощью триггеров или sram.И для каждого бита, о котором вы знаете, например, биты в регистре AX, вероятно, есть сотни или тысячи или больше, которые используются для ввода и выгрузки битов из этого регистра AX.

Вы знаете, что процессоры работают нанекоторые тактовые частоты, в наши дни около 2 гигагерц или два миллиарда часов в секунду.Подумайте о часах, которые генерируются кристаллом, это еще одна тема, но логика рассматривает эти часы как напряжение, которое становится высоким, равно нулю, высокому и равному нулю при этой тактовой частоте 2 ГГц или что-то еще (достижения геймбоя составляют 17 МГц, старые ставки около 75 МГц,оригинальный IBM PC 4,77 МГц).

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

Так что теперь мы можем делать такие вещи, как, скажем, если часы равны единице, а моя переменная состояния говорит, что я в инструкции извлечениязатем нужно переключить несколько вентилей, чтобы адрес нужной инструкции, находящийся в счетчике программ, вышел на шину памяти, чтобы логика памяти могла дать мне инструкцию для MOV AL, 61h.Вы можете посмотреть это в руководстве по x86 и обнаружить, что некоторые из этих битов кода операции говорят, что это операция mov, а целью являются младшие 8 бит регистра EAX, а источником mov является непосредственное значение, что означает егонаходится в ячейке памяти после этой инструкции.Таким образом, мы должны сохранить эту инструкцию / код операции где-нибудь и извлечь следующую ячейку памяти в следующем тактовом цикле.так что теперь мы сохранили mov al, немедленный и у нас есть значение 61h, считанное из памяти, и мы можем переключить некоторую транзисторную логику так, чтобы бит 0 этого 61h сохранялся в триггере 0 бита al и бит 1 в бит 1 и т. д..

Как все это происходит, спросите вы?Подумайте о функции python, выполняющей некоторую математическую формулу.вы начинаете в верхней части программы с некоторыми входными данными в формулу, которые входят в переменные, у вас есть отдельные шаги в программе, которые могут добавить сюда константу или вызвать функцию квадратного корня из библиотеки и т. д.верните ответ.Аппаратная логика выполняется аналогичным образом, и сегодня используются языки программирования, один из которых очень похож на C. Основное отличие состоит в том, что ваши аппаратные функции могут иметь сотни или тысячи входов, а выход - один бит.На каждом тактовом цикле бит 0 регистра AL вычисляется с помощью огромного алгоритма, в зависимости от того, как далеко вы хотите посмотреть.Подумайте о той функции квадратного корня, которую вы вызвали для своей математической операции. Эта функция сама по себе является одним из этих некоторых входных данных, создающих вывод, и она может вызывать другие функции, например, умножение или деление.Таким образом, у вас, вероятно, есть где-то бит, который вы можете считать последним шагом перед битом 0 регистра AL, и его функция: если такт равен единице, то AL [0] = AL_next [0];иначе AL [0] = AL [0];Но есть более высокая функция, которая содержит следующий бит, вычисленный из других входных данных, и более высокая функция и более высокая функция, и многие из них создаются компилятором так же, как три строки Python могут превратиться в сотни или тысячилиний ассемблера.Несколько линий HDL могут стать сотнями или тысячами или более транзисторами.Аппаратные люди обычно не смотрят формулу самого низкого уровня для определенного бита, чтобы найти все возможные входные данные и все возможные AND, OR и NOT, которые требуются для вычисления, больше, чем вы, вероятно, проверяете ассемблер, сгенерированный вашими программами.но ты мог бы, если бы захотел.

Примечание о микрокодировании, большинство процессоров не используют микрокодирование. Вы попадаете в него, например, с x86, потому что это был прекрасный набор инструкций для своего времени, но на первый взгляд, он пытается идти в ногу со временем. другие наборы команд не нуждаются в микрокодировании и используют логику непосредственно, как я описал выше. Вы можете думать о микрокодировании как о другом процессоре, использующем другой набор команд / язык ассемблера, который эмулирует набор команд, который вы видите на поверхности. Не так сложно, как при попытке эмулировать Windows на Mac или Linux на Windows, и т. Д. Слой микрокодирования разработан специально для работы, вы можете подумать, что есть только четыре регистра AX, BX, CX, DX, но есть еще много внутри. И естественно, что одна сборочная программа каким-то образом может выполняться по нескольким путям выполнения в одном или нескольких ядрах. Так же, как процессор в вашем будильнике или стиральной машине, программа микрокода проста и мала, отлажена и записана на аппаратном обеспечении, мы надеемся, никогда не нуждаемся в обновлении прошивки. По крайней мере, в идеале. но, как, например, ваш ipod или телефон, вы иногда хотите исправить ошибку или что-то еще, и есть способ обновить ваш процессор (BIOS или другое программное обеспечение загружает патч при загрузке). Скажем, вы открываете батарейный отсек для пульта ДУ телевизора или калькулятора, вы можете увидеть дыру, где вы можете увидеть несколько металлических контактов подряд, может быть, три или 5 или много. Для некоторых пультов и калькуляторов, если вы действительно хотите их перепрограммировать, обновите прошивку. Обычно нет, хотя, в идеале, этот пульт идеален или достаточно совершенен, чтобы пережить телевизор. Микрокодирование дает возможность выводить на рынок очень сложный продукт (миллионы, сотни миллионов транзисторов) и исправлять большие и исправляемые ошибки в полевых условиях. Представьте себе программу на 200 миллионов строк Python, которую ваша команда написала, скажем, за 18 месяцев, и вам придется ее доставить, иначе компания не получит продукт для соревнований. То же самое, за исключением небольшой части кода, которую вы можете обновить в поле, остальное должно быть высечено в камне. для будильника или тостера, если есть ошибка или вещь нуждается в помощи, просто выбросьте ее и получите другую.

Если вы копаетесь в википедии или просто гуглите, то можете посмотреть наборы инструкций и машинный язык для таких вещей, как 6502, z80, 8080 и другие процессоры. Может быть 8 регистров и 250 команд, и из числа транзисторов вы можете почувствовать, что эти 250 инструкций по сборке все еще являются языком очень высокого уровня по сравнению с последовательностью логических элементов, необходимых для вычисления каждого бита в триггере за такт цикл. Вы правы в этом предположении. За исключением микрокодированных процессоров, эта логика низкого уровня никоим образом не программируется, вы должны исправлять аппаратные ошибки с помощью программного обеспечения (для аппаратного обеспечения, которое будет или будет доставлено, а не утилизировано).

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

19 голосов
/ 14 сентября 2010

Редактировать: Вот пример процессора (6502), который был смоделирован с использованием python / javascript НА УРОВНЕ ТРАНЗИСТОРА http://visual6502.org Вы можете вставить свой код, чтобы увидеть, как он делает то, что делает .

Редактировать: Отлично 10 000м Уровень обзора: Душа новой машины - Трейси Киддер

Мне было трудно представить это, пока я не начал микрокодирование. Тогда все это имело смысл (абстрактно). Это сложная тема, но в очень очень высоком уровне.

По сути, думайте об этом так.

Инструкция процессора - это, по сути, набор зарядов, хранящихся в электрических цепях, составляющих память. Существует схема, которая приводит к тому, что эти заряды переносятся из памяти внутрь процессора. Попав внутрь ЦП, заряды устанавливаются как входные данные для подключения схемы ЦП. По сути, это математическая функция, которая приведет к увеличению электрической мощности, и цикл продолжится.

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

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

14 голосов
/ 14 сентября 2010

Это вопрос, который требует не только ответа в StackOverflow, чтобы объяснить.

Чтобы узнать об этом от самых основных электронных компонентов до базового машинного кода, прочитайте Искусство электроники, Horowitz and Hill . Чтобы узнать больше о компьютерной архитектуре, прочитайте Организация и дизайн компьютеров Паттерсона и Хеннесси . Если вы хотите углубиться в более сложные темы, прочитайте Архитектура компьютера: количественный подход, Хеннесси и Паттерсон .

Кстати, в «Искусстве электроники» есть и сопутствующее лабораторное руководство . Если у вас есть время и ресурсы, я бы настоятельно рекомендовал провести лабораторные работы; Я на самом деле брал уроки Тома Хейса, на которых мы построили множество аналоговых и цифровых схем, кульминацией которых стал компьютер из чипа 68 КБ, некоторого ОЗУ, некоторых PLD и некоторых дискретных компонентов. Вы вводите машинный код непосредственно в оперативную память, используя шестнадцатеричную клавиатуру; Это был взрыв и отличный способ получить опыт на самых низких уровнях компьютера.

13 голосов
/ 16 сентября 2010

Объяснение всей системы в любой детали невозможно обойтись без целых книг, но вот обзор очень упрощенного компьютера очень высокого уровня:

  • На самом низком уровне находятся физика и материалы (например, транзисторы из легированного кремния).
  • Используя физику и материалы, вы можете получить логический элемент NAND .
  • Используя затвор NAND, вы можете получить все другие базовые логические элементы (И, ИЛИ, XOR, НЕ и т. Д.) Или для эффективности построить их непосредственно из транзисторов, включая версии с более чем двумя входами.
  • Используя базовые логические элементы, вы можете получить более сложные схемы, такие как сумматор , мультиплексор и т. Д.
  • Кроме того, используя базовые логические элементы, вы можете получить элементы цифровых схем с состоянием, такие как триггер , часы и т. Д.
  • Используя ваши более сложные статические схемы, вы можете получить элементы более высокого уровня, такие как счетчики , память , регистры , арифметико-логическая единица и т. д.
  • Теперь вам нужно просто склеить ваши высокоуровневые кусочки так, чтобы:
    • Значение выходит из памяти
    • Значение интерпретируется как инструкция путем отправки ее в соответствующее место (например, АЛУ или память) с использованием мультиплексоров и т. Д. (Основные типы команд: чтение из памяти в регистр, запись из регистра). -в памяти, выполнение операций над регистрами и переход к выполнению команды при условии.)
    • Процесс повторяется со следующей инструкцией

Чтобы понять, как инструкция по сборке вызывает изменение напряжения, вам просто нужно понять, как каждый из этих уровней представлен уровнем ниже. Например, инструкция ADD приведет к распространению значения двух регистров в ALU, в котором есть схемы, которые вычисляют все логические операции. Затем мультиплексор на другой стороне, получая сигнал ADD из инструкции, выбирает желаемый результат, который распространяется обратно в один из регистров.

8 голосов
/ 14 сентября 2010

Это большой вопрос, и в большинстве университетов есть целый семестровый класс, чтобы ответить на него. Таким образом, вместо того, чтобы дать вам какое-то ужасно убитое резюме в этой маленькой коробке, вместо этого я направлю вас к учебнику, в котором есть вся правда: Организация и проектирование компьютеров: аппаратно-программный интерфейс Паттерсона и Хеннесси .

7 голосов
/ 14 сентября 2010

Более простое введение, но все же очень хорошее введение в компьютер с провода до
http://img.amazon.com/images/I/31GBgcA5PML._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU15_.jpg

Код Чарльза Петцольда

4 голосов
/ 16 сентября 2010

ОЧЕНЬ коротко,

Инструкция машинного кода хранится в процессоре в виде последовательности битов. Если вы посмотрите на MOV в таблице данных процессора, вы увидите, что у него есть шестнадцатеричное значение, например (например) 0xA5, специфичное для инструкции MOV. (Существуют различные типы MOV инструкции с разными значениями, но давайте пока проигнорируем это).

0xA5 hex == 10100101 binary.

* (это не реальное значение кода операции для MOV на X86 - я просто выбираю значение в целях иллюстрации).

Внутри процессора это хранится в «регистре», который действительно является массивом триггеров или защелок, которые хранят напряжение:

+5 0 +5 0 0 +5 0 +5

Каждое из этих напряжений подается на вход ворот или набора ворот.

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

Вывод этих ворот подает на другой уровень ворот или обратно на себя. Этот уровень поступает на следующий, затем на следующий и т. Д.

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

Register->(clock)->Gate A->(clock)->Gate B->pin
                                          ->latch

(игнорируя обратную связь для различных типов ворот и структур более высокого уровня)

Эти операции происходят в определенной степени параллельно, как это определено базовой архитектурой. Одна из причин того, что «более быстрые» процессоры - скажем, 2,0 ГГц против 1,0 ГГц - работают лучше, состоит в том, что более высокая тактовая частота (значение ГГц) приводит к более быстрому распространению от одного набора вентилей к следующему.

Важно понимать, что при очень высоком уровне * * * * * * процессор всего лишь меняет напряжение на контактах. Вся великолепная сложность, которую мы наблюдаем при использовании устройства, такого как ПК, проистекает из внутренней схемы вентилей и схем внешних устройств / периферийных устройств, подключенных к процессору, таких как другие процессоры, ОЗУ и т. Д. Магия Процессор - это шаблоны и последовательности, в которых его контакты изменяют напряжение, и внутренняя обратная связь, которая позволяет состоянию ЦП в один момент вносить вклад в его состояние в следующий. (В сборке это состояние представлено флагами, указателем / счетчиком команд, значениями регистров и т. Д.)

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

Надеюсь, это поможет. У меня также есть хорошее образование в области ЭЭ и большой опыт разработки встраиваемых систем, поэтому эти абстракции имеют смысл для меня, но, возможно, не очень полезны для неофита.

1 голос
/ 16 сентября 2010

Черновик книги "Микропроцессорное проектирование" в настоящее время находится в сети на Wikibooks.

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

1 голос
/ 14 сентября 2010

Самым базовым элементом в цифровой цепи должен быть Logic Gate . Логические элементы можно использовать для построения логических схем для выполнения логических арифметических операций или декодеров или последовательных схем, таких как Триггеры . Триггер можно представить как 1-битную память. Это основа более сложных последовательных схем, таких как счетчики или регистры (массивы битов).

A микропроцессор - это просто набор секвенсоров и регистров. "Инструкции" для микропроцессора - это не больше, чем просто наборы битов, которые последовательно помещаются в некоторые регистры, чтобы запускать определенные последовательности расчеты по «данным». Данные представлены в виде массивов битов ... и теперь мы на более высоком уровне.

0 голосов
/ 22 сентября 2015

Я думал об этом и гуглил как сумасшедший.Люди отвечают на такие вещи, как «бла-бла пишет в RAM», но меня действительно интересует, что означает «запись».

Вы всегда начинаете с ввода кода, верно?Который затем компилируется, собирается, машинный код и т. Д. И т. Д. ... как это превращается в напряжения на транзисторах?Но ждать!Давайте вернемся немного назад.Когда вы набираете код, говорите, что хотите написать «напечатать« Hello World »» на любом языке.Когда вы нажимаете «p» (первая буква «печати») на клавиатуре, вы фактически перенаправляете электрический ток, который подается через розетку через определенный путь к определенному набору транзисторов.Таким образом, вы уже сохраняете 0 В и + 5 В на этом шаге.Это не генерируется позже!

То, как эти напряжения на последующих этапах сбрасываются, хорошо ... электротехника на всех уровнях.

Надеюсь, это ответит на ваш вопрос.

...