Подтвердить что ты не робот

Как инструкция по сборке переходит в изменение напряжения на ЦПУ?

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

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

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

EDIT: я прочитал несколько комментариев, спрашивающих, почему я включил это как встроенное, когда x86-семейство не является распространенным явлением во встроенных системах. Добро пожаловать в мое невежество. Теперь я полагаю, что, если я не знаю об этом, вероятно, другие не знают об этом.

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

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

EDIT # 2: благодаря этой теме я просто понял, почему XOR EAX, EAX быстрее, чем MOV EAX, 0h.:)

4b9b3361

Ответ 1

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

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

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

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

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

Вы знаете, что процессоры работают с некоторой тактовой частотой, в эти дни около 2 гигагерц или два миллиарда часов в секунду. Подумайте о часах, которые генерируются кристаллом, еще одна тема, но логика видит, что часы как напряжение, которое поднимается высоко и нулевое высоко и нулевое при этой тактовой частоте 2ghz или что-то в этом роде (игровой процесс составляет 17 МГц, старые ipods около 75 МГц, оригинал ibm pc 4.77mhz).

Таким образом, транзисторы, используемые в качестве коммутаторов, позволяют нам набирать напряжение и превращать его в те и другие нули, которые мы знакомы как с инженерами-технологами, так и с инженерами-программистами, и заходим так далеко, чтобы дать нам логические функции AND, OR и NOT. И у нас есть эти волшебные кристаллы, которые позволяют нам получить точные колебания напряжения.

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

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

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

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

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

Ответ 2

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

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

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

По существу думать об этом так.

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

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

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

Ответ 3

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

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

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

Ответ 4

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

  • На самом низком уровне есть физика и материалы (например, транзисторы из легированного кремния).
  • Используя физику и материалы, вы можете получить логический логический элемент NAND.
  • Используя NAND-gate, вы можете получить все остальные логические логические элементы (AND, OR, XOR, NOT и т.д.) или для повышения эффективности их создания непосредственно из транзисторов, включая версии с более чем двумя входами.
  • Используя основные логические ворота, вы можете получить более сложные схемы, такие как adder, multiplexer и т.д.
  • Также используя основные логические ворота, вы можете выводить элементы цифровой схемы состояния, такие как flip flop, clock и т.д.
  • Используя ваши более сложные величественные схемы, вы можете получить более высокоуровневые фрагменты, такие как счетчики, memory, регистры, арифметико-логический блок и т.д.
  • Теперь вам просто нужно приклеить ваши куски высокого уровня, чтобы:
    • Значение выходит из памяти
    • Значение интерпретируется как команда, отправляя его в соответствующее место (например, ALU или память) с использованием мультиплексоров и т.д. (Основные типы команд считываются из памяти в регистр, записываются из регистра -into-memory, выполнить операции-на-регистры и перейти к инструкции по условию.)
    • Процесс повторяется следующей инструкцией

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

Ответ 5

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

Ответ 7

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

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

0xA5 hex == 10100101 binary.

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 8

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

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

Ответ 9

Черновик книги "Microprocessor Design" в настоящее время онлайн в Wikibooks.

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

Ответ 10

Ну вот один ужасно забитый итог: -)

A MOV AL, 61h снова является понятной для человека формой кода, которая подается в ассемблер. Ассемблер генерирует эквивалентный шестнадцатеричный код, который в основном представляет собой последовательность байтов, понимаемую процессором, и которая является тем, что вы сохранили в памяти В встроенной системной среде сценарии компоновщика дают вам тонкий контроль над местом размещения этих байтов (отдельные области для программы/данных и т.д.) В памяти.

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

Ответ 11

что именно находится внутри процессора, который интерпретирует этот код и отправляет его как сигналы напряжения

Я бы хотел сказать "оборудование", но более верный ответ: " microcode '.

Ответ 12

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

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

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

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