Когда машинный код фактически выполняется аппаратным обеспечением и процессором, как он выглядит?
Будет ли он выглядеть как двоичный, как в инструкциях, представляемых единицами и нулями, или это будет нечто, состоящее из шестнадцатеричных цифр, где коды операций - это байты, представленные в виде шестнадцатеричных чисел, которые можно разбить на двоичные числа, например, байт-код?
computer-architecture
cpu
Тим Хард
источник
источник
Ответы:
Лучший ответ, который я могу дать, это то, что он на самом деле не «выглядит». Инструкция, выполняемая в настоящее время ЦП, представлена серией проводов, некоторые из которых имеют высокое напряжение, а некоторые имеют низкое напряжение.
Вы можете интерпретировать высокое и низкое напряжение как нули и единицы, но вы можете одинаково хорошо интерпретировать группы высоких и низких напряжений как шестнадцатеричные цифры или как инструкцию по сборке
ADD $0 $1
(которая наиболее близка к тому, как процессор интерпретирует ее). Эти цифры и мнемоника сами по себе удобны для чтения; внутренне это только напряжение на проводах.Из этих вариантов двоичный является «ближайшим к металлу», в котором нули и единицы отображаются непосредственно на высокое и низкое напряжение на проводах. Но ни один из них не является неправильным, и они часто более полезны: есть причина, по которой люди смотрят на hex-дампы исполняемых файлов, но почти никогда не бинарные.
источник
«Похоже» подразумевает метафору. Если мы возьмем буквально «как это будет выглядеть», это будет выглядеть как причудливый гравированный кусок кремния, сидящий на материнской плате. Ясно, что метафора была целью. Чтобы построить метафору, нам нужно посмотреть, что это на самом деле в первую очередь. Тогда мы можем построить приемлемую метафору. Это немного долго, но, к счастью, оно заканчивается для вас видео метафорой.
Машинный код фактически сохраняется в памяти в виде битов. Микросхемы памяти, как правило, DRAM , которые хранят эти биты в виде напряжений на конденсаторе и электронах. Два связаны - трудно говорить о напряжениях без электронов. Иногда удобно говорить об одном или другом, но понимаешь, что куда идет один, другой следует.
Путь машинного кода начинается с «выборки». Конкретная структура напряжений применяется к проводам микросхемы ОЗУ, указывая, что этот конкретный набор битов должен быть отправлен в ЦП. Почему? Не знаю, все равно. Обычно этот сигнал отправляется, потому что процессор завершил последнюю инструкцию и запрашивает новую в качестве инстинктивного ответа, как собака, запрашивающая второе угощение после того, как вы дали ему первое. Этот процесс начинается с некоторого первоначального удара в штаны, вызванного естественной нестабильностью в процессоре. Когда источник питания подает постоянное напряжение на микросхему, повышение напряжения в конечном итоге приводит к тому, что процессор подает правильные напряжения на микросхемы ОЗУ, чтобы получить первые инструкции (я немного помахал рукой по слою BIOS, потому что это не важно к истории. Ищите это).
Современная память передает данные параллельно. Это означает, что биты, составляющие машинный код, разделены на «дорожки» (32 или 64 являются общими), что является логическим способом передачи 32/64 проводов из ОЗУ в ЦП. Напряжение на этих линиях повышается и понижается по мере необходимости для передачи его в процессор.
Оказавшись в процессоре, он может делать свою работу. Это сфера микроархитектуры , и она может усложниться, потому что это индустрия на миллиард долларов. Эти напряжения влияют на транзисторы, которые влияют на другие напряжения, способами, которые мы могли бы описать как «добавление битов» или «умножение». На самом деле это всего лишь напряжения, которые представляют эти биты, точно так же, как мы могли бы набросать 5-символьную строку «2 + 2 = 4» на листе бумаги и сказать, что мы занимались математикой. Карандашный графит не номер два. Это просто физическое представление, которое мы используем для этого числа.
Вот что делает настоящая система, на чрезвычайно высоком уровне. Я хорошо пропустил ... почти все ... но достаточно прилично, чтобы вернуться к вашему актуальному вопросу. Как бы это [метафорически] выглядело бы?
Когда это происходит, я думаю, что Мартин Молин, возможно, создал лучшую метафору со своей Мраморной машиной . Машинный код кодируется (вручную) на некоторых полосках Lego Technics в середине в виде колышков, а не напряжений на конденсаторе. Это больше похоже на EPROM, чем на DRAM, но оба хранят данные. Мрамор подобен электронам, движущимся под действием напряжения (или гравитации в случае мрамора). И когда электроны движутся, они прикладывают силу к воротам, которые что-то делают.
Его машина проста, по сравнению с современным процессором, но это не так уж плохо, если говорить о метафорах. И это броско!
источник
Посмотрите это видео , в частности с 1:00 до 1:17. Это именно то, как это выглядит, когда программа работает на компьютере. Две строки индикаторов показывают текущее содержимое регистра адресов и регистра данных. PDP-11 не имеет регистра команд, но если бы он был и на передней панели были огни, чтобы показать его содержимое, он выглядел бы почти так же. 16 лампочек - некоторые из них включены, некоторые выключены.
Если вам действительно нравятся мигающие индикаторы, у вас может быть больше индикаторов для отображения текущего содержимого шести регистров, указателя стека, счетчика программы ... для дополнительных 32768 индикаторов вы можете иметь индикатор для каждого бита кэша. Вы могли бы даже иметь свет для каждого бита памяти ... но это действительно будет много света.
Это PDP11-70, который работает на частоте 15,2 МГц, и выполнение каждой инструкции занимает около 1,5 мкс. Человеческий глаз может обнаружить изменения вплоть до 1/10 секунды, и за это время PDP-11 может выполнить 60000 инструкций. В основном все размыто.
источник
Разработчики аппаратного обеспечения, внедряющие и тестирующие (и тестирующие и тестирующие) процессор, фактически используют визуальные модели, чтобы увидеть, что делают их конструкции. Большинство инструментов моделирования HDL (если не все) выдают волновые изображения всех регистров и проводов, что упрощает отладку. На снимке экрана ниже (взятом отсюда ) показаны эти волны от симулятора VCS для процессора RISC-V, выполняющего несколько инструкций.
Это довольно простой пример, который показывает небольшое подмножество логики, задействованной в полной конструкции процессора. Вы можете открыть эти представления для всего процессора и наблюдать, как данные распространяются через логику. Если вы хотите, чтобы машинный код работал, как вы упомянули, вы можете посмотреть на волны для регистра команд или шины, которую процессор использует для чтения инструкций из памяти. Большинство средств просмотра волн имеют гибкие параметры просмотра для шин и регистров, которые позволяют отображать их значения в виде двоичных, шестнадцатеричных, восьмеричных и даже в виде меток перечисления. В некоторых вы даже можете определить свои собственные функции для отображения битовых комбинаций отображаемых значений.
Стоит отметить, что это всего лишь представление о симуляции процессора. Нет никакого способа получить такого рода представления для уже изготовленного процессорного чипа.
источник
Представьте себе слепого, спотыкающегося по строящемуся переулку. Везде есть дыры и трещины, поэтому, естественно, он должен упасть. Не этот слепой, потому что у него есть бумажный свиток с инструкциями, когда ждать, когда двигаться, куда двигаться и как манипулировать своим окружением, чтобы достичь конца дороги. Вот что такое собрание, слепо соблюдаемые списки инструкций - они имеют смысл только для этого переулка и для этого слепого. Теоретически вы можете даже восстановить 3d-модель по одной инструкции (декомпиляция).
Каждое изменение на платформе, заставляет пересобирать инструкции для слепого. Вам нужно знать аппаратное обеспечение (расположение строительной площадки), инструкции о намерениях, набранные человеком (код высокого уровня), например: «Я хочу, чтобы вы перепрыгивали через все заборы, с которыми вы сталкивались подряд, пока у вас не было 12 заборов позади вас», и способности слепых (CPU). Есть ли у него кратковременная память, способность делать несколько вещей одновременно?
Сбор всей этой информации и создание последовательной прокрутки команд - задача компилятора.
Так я могу описать, как выглядит программа? Нет. Но можем ли мы описать, каково это было бы выполнить? Да, это будет похоже на прыжок и бег, как зеркало, не видя чего-либо, следуя точному списку инструкций, куда бы вы ни приехали.
источник