Як насправді виглядає машинний код під час запуску?


21

Коли машинний код насправді виконується апаратним забезпеченням та процесором, як це виглядає?

Це виглядатиме як бінарне, як в інструкціях, представлених одиницями та нулями, чи це було б щось, що складається з шістнадцяткових цифр, де кодові коди є байтами, представлені у вигляді шістнадцяткових чисел, які можна розбити на бінарні числа, як байт-код?


24
Ви б побачили, як дроти, ворота та регістри мерехтять на кремнію. Наприклад, visual6502.org/JSSim
Nayuki

4
@Nayuki Я думаю, що ця візуалізація є приголомшливою і заслуговує на те, щоб її перетворили на відповідь!
nalzok

2
Мені це не схоже ні на що
Гай

3
Він насправді навіть не існує, коли він справді "виконаний". Це "JIT компільований" (апаратним!) Пристроєм процесора для мікрокодування, який фактично інструктує ЦП!
xuq01

2
Один з швидких способів зрозуміти, як перекладається комп'ютер, - це створити його з логічних воріт, мені дуже подобається дивитися той, який зробив Бен
Етер

Відповіді:


38

Найкраща відповідь, яку я можу дати, це те, що він насправді не «схожий» ні на що. Інструкція, яку зараз виконує центральний процесор, представлена ​​низкою проводів, частина яких має високу напругу, частина - низької напруги.

Ви можете інтерпретувати високі та низькі напруги як нулі та одиниці, але ви можете однаково добре інтерпретувати групи високих і низьких напруг як шістнадцяткові цифри, або як інструкцію зі складання, як ADD $0 $1 (що найближче до того, як ЦП інтерпретує це). Ці числа і мнемоніка самі по собі є зручністю для читання людьми; внутрішньо, це не що інше, як напруги на проводах.

Із цих варіантів двійкові дані є "найближчими до металу", оскільки нулі та одиниці відображаються безпосередньо на високих і низьких напругах проводів. Але жоден з інших не є коректним, і вони часто є більш корисними: є причина, чому люди дивляться на шістнадцяткові відвали виконуваних файлів, але майже ніколи не бінарні відвали.


Отже, чи можете ви відкрити програму в шестигранному редакторі, і чи переводяться ті байти, представлені в шестнадцятковій версії, до машинного коду, двійкового коду, який може бути керований напругою, присвоєною нулю, і напругою, присвоєною одному?
Тім Ледве

4
@TimHardly Так! Hex просто легше читати. Збірка, аналогічно, читається ще простіше, але її можна механічно перекласти на нулі та одиниці. Ось чому асемблери простіше писати, ніж компілятори.
Драконіс

дякую, все це питання розширило мої знання та очистило мою розгубленість.
Тім Ледве

1
@TimHardly Асемблер просто відображає послідовність символів, таких як "NOP", на ряд бітів типу "10010000" знову і знову, щоб перетворити файл складання в машинний код. Опкоди визначаються процесором, оскільки це частина, яка насправді буде ними користуватися. Усі комп'ютери, які можуть працювати з тими самими виконуваними файлами , дійсно мають однаковий набір опкодів; Набір x86 є найпоширенішим, і він використовується в основному на всіх ПК сьогодні. Ще один поширений - MIPS, який використовується в ряді ігрових консолей.
Драконіс

1
@TimHardly Якщо ваше запитання є, чи може асемблер запитати ЦП, який його опкод для інструкції NOP, відповідь - ні. Асемблер вже повинен знати, який байт виводиться для інструкції, перш ніж вона може працювати. Фактично, асемблер може виводити програму для одного процесора, при цьому він працює на іншому типі процесора.
Містер Лістер

11

"Погляд як" передбачає метафору. Якщо ми візьмемо буквально "як це буде виглядати", це виглядатиме як вишуканий травлений шматок кремнію, що сидить на його материнській платі. Очевидно мета була мета. Щоб побудувати метафору, нам потрібно подивитися, що вона насправді є першою. Тоді ми можемо побудувати прийнятну метафору. Це трохи довго, але, на щастя, закінчується відео метафора для вас.

Машинний код насправді зберігається в пам'яті як біти. Мікросхеми пам'яті, як правило, DRAM , яка зберігає ці біти як напруги на конденсаторі та електронах. Два пов'язані - важко говорити про напруги без електронів. Іноді зручно говорити про те чи інше, але розуміти, що туди, куди йде, інша випливає.

Подорож машинного коду починається з "вибору". Конкретна схема напруг застосовується до проводів мікросхеми оперативної пам’яті, що вказує на те, що саме цей набір бітів повинен бути відправлений до процесора. Чому? Не знаю, все одно. Зазвичай цей сигнал надсилається тому, що ЦП закінчив останню інструкцію і просить нову відповідь як інстинктивну відповідь, як собака, яка просить повторне частування після того, як ти дав їй перше. Цей процес починається з первинного удару в штани, спричиненого природним нестабільністю в процесорі. Коли джерело живлення застосовує постійну напругу до мікросхеми, підвищення напруги в кінцевому підсумку призводить до того, що центральний процесор покладе правильні напруги на мікросхеми оперативної пам'яті, щоб отримати перші вказівки (я трохи передаваю шар BIOS, тому що це не важливо до розповіді. Подивіться).

Сучасна пам'ять паралельно передає дані. Це означає, що біти, що складають машинний код, розділені на "смуги" (32 або 64 є загальними), що є логічним способом промовити проводів 32/64 від оперативної пам'яті до центрального процесора. Напруга на цих лініях піднімається та знижується, як потрібно для передачі її в процесор.

Після того, як його в процесорі, він може піти робити свою роботу. Це сфера мікроархітектури , і вона може ускладнитися, оскільки це буквально галузь на мільярд доларів. Ці напруги впливають на транзистори, які впливають на інші напруги, таким чином, які ми можемо описати як "додавання бітів" або "множення". Вони насправді просто напруги, які представляють ці біти, таким же чином ми можемо накреслити на аркуші паперу 5-символьний рядок "2 + 2 = 4" і сказати, що ми зробили математику. Графіт-олівець - це не число два. Це лише фізичне представлення, яке ми використовуємо для цього числа.

Отже, це робить реальна система на надзвичайно високому рівні. Я пропустив добре ... майже все ... але це досить пристойно, щоб можна було повернутися до свого актуального питання. Як це [метафорично] виглядатиме?

Як це буває, я думаю, що Мартін Молін, можливо, побудував найкращу метафору зі своєю Мармуровою машиною . Код машини кодується (вручну) на деяких смужках Lego Technics посередині як кілочки, а не напруги на конденсаторі. Це більше схоже на EPROM, ніж на DRAM, але обидва зберігають дані. Мармур схожий на електрони, пересуваючись напругами (або силою тяжіння, у випадку з мармуром). І коли електрони рухаються, вони застосовують силу до воріт, які роблять речі.

Його машина проста, порівняно з сучасним процесором, але це не все так погано, наскільки йде метафара. І це привабливо!


1
Машина з мармуру занадто проста для цього у відео. ЦП потребує стан.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen Правда. Я гадаю, якби у мармурової машини було кілька воріт, які дозволяли їй автоматично кидати важелі, а Марину не потрібно було їх перевертати, це було б ближче.
Корт Аммон - Відновіть Моніку

Спасибі! Подібно до питання, яке я задав у відповіді вище цього, чи вважав би зібраний код складання машинним кодом перетворений на напруги та речі?
Тім Ледве

@TimHardly Використання єдиних значень для "збирання", "складання" та "машинного коду". Продукт складання збірки визначається машинним кодом (так, так, це може вважатися таким =)). Що може допомогти, це те, що і збірка, і машинний код вважаються "логічними" поняттями, ближче до математичного поняття "2 + 2 = 4" і далі від графіту на папері, на якому написано це рівняння. Збірка / машинний код - це збірка / машинний код, незалежно від того, зберігається він на магнітному диску, записаний на аркуші паперу, або зберігається в конденсаторах в DRAM.
Корт Аммон - Відновіть Моніку

1
Якщо я можу віск філософський, машинний код є машинним кодом, тому що ми ставимося до нього як до машинного коду. Ми вважаємо це машинним кодом. Я можу навести центральний процесор на байти, що описують звук у форматі .wav, і він дійсно виконує їх як машинний код. В результаті виконання, ймовірно, не принесе нічого корисного (тому що звук не був побудований як машинний код), і він може зупинитися, але він може бути виконаний.
Корт Аммон - Відновіть Моніку

10

Перегляньте це відео , зокрема з 1:00 до 1:17. Саме так виглядає, коли програма працює на комп’ютері. Два ряди вогнів показують поточний вміст регістру адрес та регістру даних. PDP-11 не має реєстру інструкцій, але якби він був, і на передній панелі було світло, яке відображало його вміст, воно виглядало б майже однаково. 16 вогнів - деякі включені, деякі вимкнено.

Якщо вам дуже сподобалися миготливі світильники, у вас може бути більше вогнів для відображення поточного вмісту шести регістрів, покажчика стека, лічильника програми ... для наступних 32768 вогнів ви могли мати світло для кожного біта кешу. Ви навіть могли мати світло на кожен шматочок пам'яті ... але це дійсно було б багато вогнів.

Це PDP11-70, який працює на частоті 15,2 МГц, і для виконання кожної інструкції потрібно близько 1,5 мікросекунд. Людське око може виявити зміни до 1/10 секунди, і за цей час PDP-11 може виконати 60 000 інструкцій. В основному, все це розмиття.


Нічого собі, це приємний приклад, я бачив інших, що подобаються, щось по тих лініях, де можна побачити світло та інші речі. youtube.com/watch?v=yOyaJXpAYZQ
Тім Ледве


6

Дизайнери обладнання, що впроваджують і тестують (і тестують і тестують) процесор, насправді використовують візуальні моделі, щоб побачити, чим займаються їх проекти. Більшість (якщо не всі) інструменти моделювання HDL виводять хвилі з усіх регістрів та проводів, що дозволяє легко налагоджувати. На скріншоті нижче (зроблений звідси ) показані ці хвилі з симулятора VCS для процесора RISC-V, який виконує кілька інструкцій.

DVE хвилі для RISC-V

Це досить простий приклад, який показує невеликий підмножина логіки, що бере участь у повному дизайні процесора. Ви можете відкрити ці погляди для всього процесора і спостерігати, як дані поширюються за логікою. Якщо ви хочете, щоб машинний код працював, як ви вже згадували, ви можете подивитися на хвилі реєстру інструкцій або шину, яку процесор використовує для читання інструкцій із пам'яті. Більшість переглядачів хвиль мають гнучкі параметри перегляду для шин та регістрів, які дозволяють відображати їх значення у вигляді двійкових, шістнадцяткових, восьмеричних та навіть у вигляді міток перерахунків. У деяких ви навіть можете визначити власні функції для відображення бітових шаблонів відображуваних значень.

Варто зазначити, що це лише представлення імітації процесора. Немає способів отримати такі види перегляду вже виготовленого процесорного чіпа.


2

Уявіть, що сліпий чоловік спотикається по алеї, що будується. Скрізь є дірки та розриви, тому природно він повинен падати. Не цей сліпий чоловік, бо він має прокрутку з папером із вказівками, коли чекати, коли рухатись, куди рухатися та як маніпулювати своїм оточенням, щоб досягти кінця дороги. Ось що таке збірка, сліпо слідуючи спискам інструкцій - вони мають сенс лише для цієї алеї та для цього сліпого. Теоретично можна навіть реконструювати 3d-модель із самих інструкцій (Decompiling).

Кожна зміна платформи обумовлює необхідність перекомпілювати інструкції для сліпого чоловіка. Вам потрібно знати обладнання (компоновку будівельного майданчика), вводити людину вказівки про наміри (Кодекс високого рівня) на кшталт "Я хочу, щоб ви перестрибували всі огорожі, з якими ви стикаєтесь поспіль, поки у вас не буде 12 огорож позаду" і здібності незрячих (ЦП). Чи є у нього короткочасна пам'ять, здатність робити кілька справ одночасно?

Отримати всю цю інформацію та сформувати узгоджене прокручування інструкцій - завдання компілятора.

Тож чи можу я описати, як виглядає програма? Ні. Але чи можемо ми описати, як було б почувати це? Так, було б схоже на стрибок і біг, як дзеркала-край, не бачачи чогось, дотримуючись точного списку інструкцій, куди б ви не взяли.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.