Makine kodu çalıştırılırken gerçekte neye benziyor?


21

Makine kodu aslında donanım ve CPU tarafından yürütülürken neye benziyor?

Birler ve sıfırlar tarafından temsil edilen talimatlarda olduğu gibi ikili gibi mi görünecek yoksa bayt kodu gibi ikili sayılara ayrılabilen onaltılık sayılar şeklinde sunulan onaltılık sayılardan oluşan onaltılık basamaklardan oluşan bir şey mi olurdu?


24
Gördüğünüz şey silikon üzerinde titreyen teller, kapılar ve kayıtlardır. Örneğin, visual6502.org/JSSim
Nayuki

4
@Nayuki Bence bu görselleştirme harika ve bir cevaba dönüştürülmeyi hak ediyor!
nalzok

2
Bana hiçbir şey gibi görünmüyor
Gaius

3
Gerçekten "idam edildiğinde" bile yok. CPU üzerindeki bir (donanım!) Cihazı tarafından mikrokod için "derlenmiş" JIT, aslında CPU'ya talimat veriyor!
23u1801

2
Bir bilgisayarın nasıl tercüme ettiğini anlamanın hızlı bir yolu, mantık kapılarından bir tane inşa etmektir, Ben Eater tarafından
yapılanı

Yanıtlar:


38

Verebileceğim en iyi cevap, gerçekten hiçbir şey gibi "görünmüyor". Şu anda CPU tarafından yürütülen talimat, bazıları yüksek voltajlı, bazıları düşük voltajlı bir dizi kablo ile temsil edilmektedir.

Yüksek ve düşük voltajları sıfır ve voltaj olarak yorumlayabilirsiniz, ancak yüksek ve düşük voltaj gruplarını onaltılık basamaklar olarak veya ADD $0 $1(CPU'nun bunu nasıl yorumladığına en yakın olan) gibi bir montaj talimatı olarak eşit derecede iyi yorumlayabilirsiniz . Bu sayılar ve anımsatıcıların kendisi insanların okuması için kolaylıklardır; dahili olarak, tellerdeki voltajlardan başka bir şey değildir.

Bu seçeneklerden ikili, metale en yakın olanıdır, çünkü sıfırlar ve olanlar doğrudan teller üzerindeki yüksek ve düşük voltajlarla eşleşir. Ancak diğerlerinin hiçbiri yanlış değildir ve genellikle daha yararlıdırlar: insanların çalıştırılabilir dosyaların onaltılık dökümlerine bakmasının bir nedeni vardır, ancak neredeyse hiç ikili dökümlere sahip değildir.


Yani, onaltılık düzenleyicide bir program açabilir ve onaltılık olarak temsil edilen baytlar, sıfıra atanan bir voltaj ve bire atanan bir voltaj tarafından çalıştırılabilen makine kodu ikili değerine çevrilebilir mi?
Tim Neredeyse

4
@TimHardly Yep! Onaltılık okumak daha kolaydır. Montaj, benzer şekilde, okunması daha da kolaydır, ancak mekanik olarak sıfırlara ve sıfırlara çevrilebilir. Bu yüzden derleyiciler yazmak derleyicilere göre daha kolaydır.
Draconis

teşekkürler, tüm bu soru bilgimi genişletti ve karışıklığımı sildi.
Tim Neredeyse

1
@TimHardly Bir montajcı, bir montaj dosyasını makine koduna dönüştürmek için "NOP" gibi bir karakter dizisini "10010000" gibi bir dizi bitle eşleştirir. Opcodes, CPU tarafından belirlenir, çünkü bunları gerçekten kullanacak olan kısımdır. Aynı yürütülebilir dosyaları çalıştırabilen tüm bilgisayarlar gerçekten de aynı opcode setine sahiptir; x86 seti en yaygın olanıdır ve günümüzde hemen hemen tüm PC'lerde kullanılmaktadır. Bir başka yaygın olan da bir dizi oyun konsolunda kullanılan MIPS.
Draconis

1
@TimHardly Sorunuz varsa, montajcı CPU'ya NOP talimatı için op kodunun ne olduğunu sorabilir mi, cevap hayır. Montajcı, komutun çalışabilmesi için hangi baytın verileceğini zaten bilmelidir. Aslında, bir montajcı, kendisi farklı bir işlemci tipinde çalışırken, bir işlemci için bir program çıktısı verebilir.
Bay Lister

11

"Benzemek" bir metafor anlamına gelir. Kelimenin tam anlamıyla "neye benzeyeceğini" alırsak, anakartında oturan süslü bir silikon parçası gibi görünecektir. Açıkçası mecaz amaçtı. Metaforu oluşturmak için, ilk önce ne olduğuna bakmamız gerekiyor. Sonra kabul edilebilir bir metafor inşa edebiliriz. Bu biraz uzun, ama neyse ki, sizin için bir video metaforu ile bitiyor .

Makine kodu aslında bellekte bit olarak saklanır. Bellek yongaları tipik olarak DRAM bir kondansatör ve elektron gerilimlerden olarak bitleri depolar. İkisi birbirine bağlı - elektronlar olmadan voltajlar hakkında konuşmak zor. Bazen biri veya diğeri hakkında konuşmak uygun olur, ancak birinin nereye gittiğini, diğerinin takip ettiğini anlamak.

Makine kodunun yolculuğu bir "getirme" ile başlar. RAM çipinin kablolarına, bu özel bit kümesinin CPU'ya gönderilmesi gerektiğini gösteren belirli bir voltaj modeli uygulanır. Neden? Bilmiyorum umrumda değil. Tipik olarak bu sinyal gönderilir, çünkü CPU son talimatı bitirir ve birincisini verdikten sonra ikinci bir muamele isteyen bir köpek gibi içgüdüsel bir yanıt olarak yeni bir tane ister. Bu işlem, CPU'daki doğal dengesizlikten kaynaklanan pantolonlarda bazı ilkel vuruşlarla başlar. Bir güç kaynağı çipe sabit bir voltaj uyguladığında, voltajdaki artışlar sonunda CPU'nun ilk talimatları almak için RAM çiplerine doğru voltajları koymasına neden olur (BIOS katmanını biraz elle tutuyorum, çünkü önemli değil Hikayeye bakın.

Modern bellek, verileri paralel olarak aktarır. Bu, makine kodunu oluşturan bitlerin "şeritlere" ayrıldığı anlamına gelir (32 veya 64 yaygındır), bu da 32/64 kabloları RAM'den CPU'ya söylemenin mantıklı bir yoludur. Bu hatlardaki voltaj, CPU'ya iletmek için gerektiği gibi yükseltilir ve düşürülür.

CPU'dayken işini yapabilir. Bu mikromimari alanıdır ve karmaşık olabilir çünkü bu kelimenin tam anlamıyla milyar dolarlık bir endüstridir. Bu gerilimler, diğer bitleri etkileyen transistörleri, "bit ekleme" veya "çarpma" olarak tanımlayabileceğimiz şekillerde etkiler. Hepsi sadece bu bitleri temsil eden voltajlardır, aynı şekilde bir kağıt üzerine 5 karakter dizesini "2 + 2 = 4" karalayabilir ve matematik yaptığımızı söyleyebiliriz. Kalem grafiti iki numara değil. Sadece bu sayı için kullandığımız fiziksel temsil.

Yani gerçek sistemin yaptığı şey, muazzam derecede yüksek bir seviyede. İyi atladım ... hemen hemen her şey ... ama asıl sorunuza geri dönebilecek kadar iyi. [Mecazi olarak] neye benzeyecekti?

Olduğu gibi, Martin Molin'in Mermer Makinesi ile en iyi metaforu inşa etmiş olabileceğini düşünüyorum . Makine kodu, bir kapasitördeki voltajlardan ziyade, ortadaki bazı Lego Technics şeritlerine mandal olarak kodlanır (elle). Bu daha gibidir EPROM DRAM daha, ancak her iki tutma verileri. Mermerler elektronlara benzer, gerilimlerle (veya mermerler durumunda yerçekimi) hareket ettirilirler. Ve elektronlar hareket ettikçe, bir şeyler yapan kapılara kuvvet uygularlar.

Onun makinesi modern bir CPU'ya kıyasla basit, ama metaforlar kadar kötü değil. Ve akılda kalıcı!


1
Mermer makinesi videoda bunun için çok basit. Bir CPU'nun duruma ihtiyacı vardır.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen Gerçek. Mermer makinenin, kolları çevirmek zorunda kalmadan Marin yerine kolları otomatik olarak atmasına izin veren birkaç kapıya sahip olsaydı, daha yakın olurdu.
Cort Ammon - Monica'yı yeniden

Teşekkürler! Bunun cevabında sorduğum soruya benzer şekilde, birleştirilmiş Montaj kodu gerilimlere ve şeylere çevrilen makine kodu olarak kabul edilir mi?
Tim Pek

@TimHardly "Assembly", "Assembly" ve "Machine Code" için yalnızca anlamları kullanarak Assembly'nin montajının ürünü makine kodu olarak tanımlanmıştır (bu nedenle evet, bu = olarak kabul edilebilir)). Yardımcı olabilecek bir şey, hem montaj hem de makine kodunun, "2 + 2 = 4" matematiksel kavramına daha yakın olan ve bu denklemin yazıldığı kağıt üzerindeki grafitten daha fazla "mantıksal" kavramlar olarak kabul edilmesidir. Montaj / makine kodu, ister manyetik bir diskte depolanıyor, ister bir kağıt üzerine yazılıyor, ister DRAM'deki kapasitörlerde depolanıyor olsun, montaj / makine kodudur.
Cort Ammon - Monica'yı

1
Eğer felsefi ağda yapabilirsem, makine kodu makine kodu gibi çünkü makine kodu gibi davranırız. Bunu makine kodu olarak düşünüyoruz. Bir CPU'yu .wav formatında bir sesi tanımlayan baytlara işaret edebilirim ve gerçekten de makine kodu olarak çalıştıracaktır. Ortaya çıkan yürütmenin yararlı bir şey yapması olası değildir (ses, makine kodu olarak yapılandırılmadığından) ve durabilir, ancak yürütülebilir.
Cort Ammon - Monica'yı

10

Check out Bu videoyu özellikle 01:00 1.17 ile. Bir program bir bilgisayarda çalışırken tam olarak böyle görünür. İki ışık sırası adres kaydının ve veri kaydının geçerli içeriğini gösterir. PDP-11'in bir talimat kaydı yok, ancak bir tane varsa ve içeriğini göstermek için ön tarafta ışıklar olsaydı, hemen hemen aynı görünecekti. 16 ışık - bazıları açık, bazıları kapalı.

Eğer yanıp sönen ışıkları gerçekten sevdiyseniz, altı yazmaçın, yığın işaretçisinin, program sayacının mevcut içeriğini göstermek için daha fazla ışığa sahip olabilirsiniz ... 32768 ışık daha için önbellek her biti için bir ışık olabilir. Her bellek biti için bir ışığa bile sahip olabilirsiniz ... ama bu gerçekten çok fazla ışık olurdu.

Bu, 15.2 MHz'de çalışan bir PDP11-70'dir ve her komutun yürütülmesi yaklaşık 1.5 mikrosaniye sürer. İnsan gözü 1/10 saniyeye kadar olan değişiklikleri tespit edebilir ve bu süre içinde PDP-11 60.000 talimatı yürütebilir. Temel olarak, her şey bir bulanıklık.


Vay canına, bu güzel bir örnek, bunun gibi başkalarını gördüm, bu çizgiler boyunca ışıkları ve diğer şeyleri görebileceğiniz bir şey. youtube.com/watch?v=yOyaJXpAYZQ
Tim Pek


6

İşlemciyi uygulayan ve test eden (ve test eden ve test eden) donanım tasarımcıları aslında tasarımlarının ne yaptığını görmek için görsel modeller kullanırlar. Çoğu (hepsi değilse de) HDL simülasyon araçları, kolay hata ayıklamaya olanak sağlamak için tüm kayıtların ve tellerin dalga görünümlerini çıkarır. Aşağıdaki ekran görüntüsü ( buradan alınmıştır ), birkaç talimatı çalıştıran bir RISC-V işlemci için VCS simülatöründen gelen bu dalgaları gösterir.

RISC-V için DVE Dalgaları

Bu, tam işlemci tasarımında yer alan mantığın küçük bir alt kümesini gösteren oldukça basit bir örnektir. Bu görünümleri tüm işlemci için açabilir ve verilerin mantık yoluyla yayılmasını izleyebilirsiniz. Makine kodunun çalıştığını görmek istiyorsanız, belirttiğiniz gibi, talimat kaydı veya dalgaların işlemcinin talimatları bellekte okumak için kullandığı veri yoluna bakabilirsiniz. Çoğu dalga görüntüleyici, değerlerini ikili, onaltılı, sekizli ve hatta numaralandırma etiketleri olarak görüntülemenizi sağlayan otobüsler ve kayıtlar için esnek görüntüleme seçeneklerine sahiptir. Bazılarında, bit desenlerinin görüntülenen değerleri eşleştirmek için kendi işlevlerinizi bile tanımlayabilirsiniz.

Bunun sadece işlemcinin simülasyonunun bir temsili olduğunu belirtmek gerekir. Önceden üretilmiş bir işlemci çipi için bu tür görünümleri elde etmenin bir yolu yoktur.


2

Kör bir adamın yapım aşamasında bir sokaktan aşağı tökezlediğini düşünün. Her yerde delikler ve yarıklar var, bu yüzden doğal olarak düşmeli. Bu kör adam değil, çünkü yolun sonuna ulaşmak için talimatlarını, ne zaman beklemesini, ne zaman taşınacağını, nereye taşınacağını ve çevresini nasıl değiştireceğini gösteren bir kağıt kaydırma var. Meclis budur, körü körüne takip edilen talimatlar listesi - sadece bu sokak ve bu kör adam için mantıklıdır. Teorik olarak bir 3d modeli sadece talimatlardan yeniden oluşturabilirsiniz (Decompiling).

Platformdaki her değişiklik, kör adam için talimatları yeniden derlemeyi gerekli kılar. Donanımı (şantiyenin düzeni), "Arkanızda 12 çit buluncaya kadar üst üste karşılaştığınız tüm çitlerin üstünden atlamanızı istiyorum" gibi insan tipi niyet talimatlarını (Üst Düzey Kod) bilmeniz gerekir. körlerin yetenekleri (CPU). Kısa süreli hafızası, aynı anda birkaç şey yapabilme yeteneği var mı?

Tüm bu bilgileri almak ve tutarlı bir talimat kaydırma oluşturmak derleyicinin işidir.

Bir programın nasıl göründüğünü açıklayabilir miyim? Hayır. Ama bunu yürütmenin nasıl bir his olduğunu açıklayabilir miyiz? Evet, bir şey görmeden ayna kenarları gibi, sizi nereye götürürse götürsün, talimatların tam bir listesini izleyerek, bir zıpla ve koş gibi hissedeceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.