Bir program CPU seviyesinde nasıl yürütülür?


14

Bunun çok yaygın bir soru olduğunu biliyorum. Ama aklımda farklı bir açı var. Sadece burada ifade etmeye çalışacağım.

Bildiğim kadarıyla, bir CPU'nun yürüttüğü her komut makine dilinde ve ALU ve transistörleri sayesinde (donanım seviyesine gidersek) bazı aritmetik işlemler yapmaktır.

Ancak bu yazı yazmaktan daha kolaydır. Peki tüm CPU ekliyor, çıkarıyor vb. İse, o zaman bir program nasıl, bu Merhaba aritmetik işlemlerle yürütülen baskı Merhaba Dünya diyen bir JAVA programı söyleyin?

Demek istediğim bu program nasıl sadece CPU için ek bir şey haline dönüştürülür?

Not: Bu soru bu web sitesi için geçerli değilse özür dilerim.

-----Bölüm iki-----

Tamam. Bu kadar hızlı ve bu coşkuyla cevap verdiğiniz için herkese teşekkürler. Sorumu biraz değiştirip tüm cevaplara yorum yapıp tekrar sormaktan daha iyi olduğunu düşündüm.

İşte burada.

İlk olarak, herkes Merhaba Dünya örneğini özellikle cevapladı. Bu benim hatam. Bunu genel tutmalıydım. Merhaba dünya örneği, çıkış cihazlarını ve işlenmesinin sadece CPU'larla nasıl sınırlı olmadığını ve bu da cevaplarınızda doğru bir şekilde ortaya çıktığını sorguluyor.

Ayrıca birçoğunuz CPU'nun eklemekten daha fazlasını yaptığını fark ettiniz. Buna katılıyorum. Sadece yazmadım ve her şeyi varsaydım. Anladığım kadarıyla, bu süreç:

  1. bellekten talimatı okuyun (veri ve adres veriyolları ve program sayaçlarını kullanarak)

    1. CPU içindeki kayıtta veri saklama
    2. Şimdi ALU, elbette talimatın kodunu çözdükten sonra aritmetik işlemler yapar veya eğer bir komut ise,
    3. Ve sonra çıkış cihazı ve benzeri gibi gerekirse diğer kaynaklarla iletişim kurmak. Bunun ötesindeki süreçler şimdilik önemsiz.

Yani CPU'nun bir komutu çözdüğü ve aritmetik bir işlem yapmaya karar verdiği adım3'te (burada, mevcut talimatı atlamak gibi yapılacak başka bir işlem olmadığını varsayıyoruz ... aritmetik işlemler çoğunlukla yapıldığından ... ) Görselleştirmem burada sona eriyor. Programımdan bir komut nasıl CPU için aritmetik bir işlemdir. Bu aritmetik işlemi yapar ve bu talimat amacına hizmet eder.

Umarım bu sefer kendimi netleştirdim.

PS Burada ALU'nun programlarımızda yaptığımız gerçek aritmetik işlemle sınırlı olmadığını büyük bir varsayımla alıyorum, daha ziyade ikili biçimde olan tüm talimatları, kastedilen sonuç vermek için ekleyerek veya çıkararak vb. pes etmek. Burada yanılıyorsam aşağıdaki cevaplardan daha doğru bir şekilde soruma cevap verin.


Derleyicinin programı makine diline dönüştürdüğünü anlıyorum. Bir programı aritmetik işlem olarak göremiyorum. Programın kendisi iki sayı eklemekle ilgili olsa da, anlaşılabilir ama başka türlü değil ..yet !! :)
user2827893

1
Belki de CPU'ların gerçek talimat setine bakmaya başlamalısınız, örneğin MC6502, Z80 gibi çok basit olanlar ... sonra bellek erişim talimatları, veri işleme talimatları, dallar olduğunu görün ... Daha sonra bunların nasıl olabileceğini tahmin edebilirsiniz. herhangi bir algoritmayı uygulamak için birleştirildi.
TEMLIB

3
Bir CPU kesinlikle eklemekten daha fazlasını yapabilir. Bir CPU'nun karşılaştırmalar ve sıçramalar yapabileceğini belirtmek çok önemlidir.
Theodoros Chatzigiannakis

1
Hala IF (karar alarak) ve MOVE (veri okuma ve depolama) görmeyi kesinlikle reddediyorsunuz, Programlama% 99 IF ve MOVE. Aritmetik ihmal edilebilir. İlk örneğinizin (Merhaba dünya) hiçbir aritmetiği yoktur.
edc65

1
1. Yeni karışıklığınızla yeni bir soru sorduğunuzda, sorduğunuz şeyi değiştirmek yerine bu soruyu düzenlemek yerine iyi yanıtlar alma olasılığınızın daha yüksek olacağını düşünüyorum. Orijinal sorunuza iyi yanıtlar aldınız ve orijinal sorunuz kendi başına durabiliyor gibi görünüyor, neden düzenlemeyi kaldırıp yeni bir soru sormuyorsunuz? 2. Yani, yeni kısmı anlayamıyorum. Yeni bölümle ilgili sorunuz tam olarak nedir? "Görselleştirmemin bittiği yer burası" derken , 3. adımı anlıyor musunuz , yoksa 3. adımı mı anlamıyorsunuz? Eğer yaparsan, ne anlamıyorsun?
DW

Yanıtlar:


7

Basit bir program alıp yerel makine koduna derlemeyi deneyebilirsiniz. (Java normalde JVM kodunu derler, ancak Andrew Tennenbaum'un, yerel olarak çalışan bir CPU'nun nasıl tasarlanacağını açıkladığı bir kitap vardır, bu yüzden yapar.) GCC'de, örneğin, derleyiciye -Sanahtarı verirsiniz .

Bu size, G / Ç gibi zor olan her şeyin işletim sistemini arayarak uygulandığını söyleyecektir. Kaynağı Linux çekirdeğine indirip aynı şeyi yapabiliyor olsanız da, kaputun altında olan şey şudur: her şey bilgisayarın belleğinin durumunu, örneğin çalışan işlemlerin listesini değiştirir veya başka bir şey kullanarak donanımla konuşur onu kontrol eden veya x86 gibi inve outüzerindeki özel CPU talimatlarını kullanarak özel bellek adresleri . Bununla birlikte, genellikle, yalnızca aygıt sürücüleri olarak adlandırılan özel programlar belirli bir donanımla konuşur ve işletim sistemi, donanımı kullanmak için doğru sürücüye istek gönderir.

Özellikle, "merhaba, dünya!" derleyiciniz, dizeyi belirli bir konuma yükleyen (örneğin, bellekteki dizenin adresini %rdikayıt defterine yükleme ) ve calltalimatla birlikte bir kütüphane işlevini çağıran bir dizi talimata dönüştürür. Bu kütüphane işlevi, bir döngü içeren dizenin uzunluğunu bulabilir, ardından sistem çağrısını çağırabilirwrite()dizeden bu bayt sayısını standart çıktı olan dosya tanımlayıcı numarası 1'e yazmak için. Bu noktada, işletim sistemi bu işlemin dosya numarası 1'in ne olduğunu araştırır ve buna ne yazacağına karar verir. Standart çıktıya yazma işlemi ekranınıza yazdırılırsa, baytları bir tampona kopyalamak gibi bir işlem olacaktır, daha sonra terminal programınız tarafından okunur, bu da hangi pencereye hangi harflerin nereye yazılacağını pencereye söyler. Pencereleme sistemi tam olarak neye benzemesi gerektiğine karar verir ve bir aygıt sürücüsüne, video belleğini değiştirerek pikselleri ekrana koymasını söyler.


Teşekkürler @Lorehead. Bu açıklama Merhaba dünya örneği ile iyi görünüyor.
user2827893

5

Anladığınız gibi CPU'nuz kendi içinde aptal. Ancak çevresinde donanım çiplerinin bir mikro kozmosu var. CPU'nun bir satırını başka bir çipe bağlanan yüksek seviyeye ayarlamanıza izin veren bir talimatınız var. O donanım çipi hattı izliyor ve şöyle diyor: "Hey, eğer bu hat yüksekse, diğer hatlarla bir şeyler yaparım."

Bunu kolaylaştırmak için, bu çizgiler birlikte gruplandırılır. Bazıları cihazları adreslemek için kullanılır, bazıları bu adresler için veri aktarmak için kullanılır ve diğerleri yine "Dostum, çipimde önemli bir şey oluyor" satırlarıdır.

Sonunda, CPU'nuz sadece başka bir çipin monitöre sinyali güzel bir şekilde değiştirmesini söyler, böylece "Merhaba Dünya" gibi görünür.

Google'a 7 segmentli bir ekranın çizimi. Gerilim uygularsanız bir segmentin yanmasını sağlayacak teller vardır. Şimdi CPU'nuzun bir çıkış hattını 7 segmentli ekranın bir satırına bağlarsanız ekran yanar. LED'in yanmasına neden olan CPU değil, sadece hatlara voltaj uygular, ancak diğer bazı donanım malzemeleri nedeniyle şık şeyler yapabilir.

CPU'nuz şimdi H için tüm satırları yükseke ayarlarsa, H'de bir CPU'nun ekleyeceği veya çıkaracağı bir sayı olmamasına rağmen 7 segmentte H görüntülenir.

Şimdi, tüm katmanlar 7 segmentli ekran H'yi yapmak için neyin gerekli olduğunu kabul ederse (5 spesifik satırı yüksekte ayarlayın), Java derleyici H'yi görüntülemek için kod yapabilir. Bu elbette oldukça rahatsız edici - böylece katmanlar başlıyor soyut. En alt katman şu şekilde başlayacaktır: "Hey, 26 harf var, her harfe rakam atayalım - 'H' harfine '72' rakamını vermeye ne dersiniz? Sonra bana" 72 numaralı harfi göster "diyebilirsiniz, "Satır 309 yüksek, küme 310 yüksek, satır 498 yüksek, satır 549 yüksek, satır 3 yüksek ayarla" yerine her katman belirli bilgileri nasıl elde edeceğinizi özetlemeye başlar. onları önemsemek.

Yani evet, sayıların veya bitlerin huuuuge eşlemesini, CPU aslında işleyebiliyor, yani zincirdeki herkesin üzerinde anlaştığı anlamına geliyor.


3

Üniversitede CS derecesi programının bir parçası olarak, CPU tanımlayan kayıt aktarma dilinin genişletilmiş bir örneğini inceledim . Farklı bir konu almam ve tanım olarak böyle bir gösterimi kabul eden bir simülatör yazmam için ilham aldım ve Gömülü Sistem Programlama'da (Mart 1989 sayısında) sorduğunuz aynı soruyu cevaplamanın bir yolu olarak yayınladım. bu tür şeyler hakkında sezgisel anlayışlarını geliştirirler.

Sınıfta, bu direnç-aktarım gösterimini kayıtlardaki gerçek mantık kapılarına damıtmaya devam ettik! Kendini yazar: hedef olarak 'A' kaydına ve A = (vaka1) veya (vaka2) koduna sahip olan ve ürün toplamı veya toplamlar ürünü normalize edilmiş form olarak ifade edilen her şeye bakın.

Sadece kursun sonunda bunun gerçek bir CPU olduğunu öğrendim: doğru hatırlıyorsam PDP-8.

Bugün kapı şemasını programlanabilir bir mantık dizi çipine besleyebilirsiniz.

Bunun özü şudur: AND ve OR geçitlerinin sonucu diğer kayıtlara giden bir kayıt ayarlanır. Eklenecek değerlerden biri opcode değeridir.

Öyleyse hayal edin: A: = (opcode == 17 & X + Y) | (opcode == 18 & X + Z) | ...

Modern cpus, boru hatları ve otobüslerle daha karmaşıktır, ancak tek bir ALU gibi bireysel alt birimler bu şekilde çalışır.


2

CPU'yu burada düşünüyorsunuz, ancak 'Hello World' çalıştırırken başka bir bileşen daha var: ekran!

CPU için, bellekteki bir değer, verilen bit sayısı (0'lar ve 1'ler) olarak temsil edilen bir sayıdır.

Ekrandaki harflere nasıl dönüştüğü başka bir hikaye: ekranın belleği de var. Bu bellek (grafik belleği) ekranda 'piksel' ile eşlenir. Her piksel bir değerle kodlanır: eğer çok temel bir tek renkli ekransa, değer sadece yoğunluktur, renkli ekranlar için değer birçok farklı şekilde kodlanabilen Kırmızı Yeşil ve Mavi (RGB) birleşimidir.

Böylece, CPU ekran belleğine belirli bir değeri 'yazdığında' pikseller yanar. Gerçekten harf yazmak için, çok sayıda pikseli aydınlatmak gerekir. Genellikle bir bilgisayarın işletim sisteminde tanımlanmış bir karakter kümesi (aslında birkaç tane) bulunur. (her bir harfin ekranda neye benzemesi gerektiğini gösteren bir tanımla eşleşen 'yazı tiplerini' soyutlama)

Bu nedenle, kod derlendiğinde, CPU'nun grafik belleğinde nereye yazacağını bilmesini sağlayan bu yazı tipi / karakter kümesi vb. Dahil olmak üzere OS kitaplıklarından gelen her türlü şeyi içerir. (Oldukça karmaşık ama genel fikir budur: derleyici, ithal kütüphaneler aracılığıyla sadece 'merhaba dünya' kodunuzdakinden çok daha fazla kod içerir)

Sonunda, şüphelendiğinizde bir sürü şey oldu, ancak tüm bu kodu yazmak zorunda kalmadınız.


1

İşte teorik bilgisayar bilimi alanından sorunuza resmi bir yaklaşım.

Temel olarak, bir CPU'nun hesaplama modeli ile bir turing makinesi arasında bir eşleme tanımlayabiliriz. Akla gelebilecek tüm turing makinesi programları setinin (ve dolayısıyla CPU üzerinde çalıştırılabilir akla gelebilecek tüm programların) sayısının sonsuz olduğuna dair teorik kanıtlar vardır. Bu, doğal sayıları turing makinelerine genişletecek program da dahil olmak üzere her programı benzersiz bir doğal sayıyla tanımlayabileceğimiz anlamına gelir .

CPU'ların hemen hemen her şeyin ikili gösterimdeki doğal sayılar üzerinde hesaplamalar olduğunu bildiğiniz gibi, CPU'ların akla gelebilecek her programı gerçekleştirebilmelerini sağlayabilirsiniz.

Not: Bu aşırı derecede basitleştirilmiştir, ancak bence güzel bir sezgi verir.


1

Yardımcı olabilecek şey, düşüncelerinizi "aritmetik yapmaktan" uzaklaştırmaktır. Gerçekten "Merhaba Dünya" yazdırmak için bilgisayarların kaputun altında ne yaptığını kazmaya çalışıyorsanız, bir seviye daha düşük düşünmek en iyisidir. Bilgisayarın "durumu", açık veya kapalı transistör anahtarları (veya şarj edilmiş veya şarj edilmemiş kapasitörler) tarafından saklanan bir bit kümesi olarak tanımlanabilir. Bilgisayar bu bitleri kurallara göre manipüle eder. Bilgisayarın bu bitleri manipüle etmesine izin verilen yollar, bitlerin 0'dan 1'e veya 1'den 0'a değiştirilmesi işini yapan transistörler şeklinde CPU üzerine yazılır.

Bir ALU "aritmetik" yaptığında, bunun anlamı, bilgisayarın durumunu aritmetik kurallarımızla tutarlı bir şekilde değiştirmesidir. Tek yaptığı bazı bitleri değiştirmekti. O var anlamı biz ek veya subtractions olarak düşünmek gerekir açıklıyor yazılım arkasında. CPU ne yaptığını "bilmiyor". Sadece eyaletten eyalete değişiyor ve hepsi bu (en azından Skynet devralana kadar).

Bu şekilde düşündüğünüzde, "atlama" talimatı gibi daha karmaşık talimatlar farklı değildir. Tek yaptığı bazı bitleri değiştirmek. Bu durumda biz biliyoruz ki bitlerini değiştirmek olur demek bir sonraki talimatın yerini. CPU bunu "bilmiyor", ama biliyoruz. Bu nedenle, bu bitleri kodumuzda bir yerden bir yere "atlamak" için değiştiren talimatı kullanıyoruz.

IO da gerçekten farklı değil, sadece bitleri değiştiriyor. Tek küçük fark, bu bitlerin transistörlere bağlanması ve sonunda ekranınızdaki karakterlerin aydınlatılmasına neden olmasıdır. "Merhaba Dünya" nın aslında basit olduğu birkaç on yıl geriye gidebilirsem, "Merhaba Dünya" için ASCII karakterlerine karşılık gelen bitler yazdıysanız, bu karakterlerin doğrudan ekran. Günümüzde biraz daha karmaşık, çünkü onunla uğraşan grafik kartlarımız ve işletim sistemlerimiz var, ancak temel fikir aynı. Ekranda bir piksel görüntülemek için devreye bağlı veya açık olan bir dizi transistör var. Doğru olanları ayarladık ve ekranda "Merhaba Dünya" beliriyor gibi görünüyor.

Karışıklık basitçe sözdizimine karşı anlambilim meselesidir. Bir ALU'da "yarı eklenen" veya "tam eklenen" davranışı sözdizimidir. Bitleri yerleştirdiğinizde hangi bitlerin çıkacağını tanımlar. Anlambilimi, ekleme yapma yeteneğidir. Siz ve ben, ALU'nun "ekleyebileceğini" biliyoruz, ancak altında ne olduğunu gerçekten anlamak için, bir ALU'nun sadece sözdiziminin bitlerini ve baytlarını manipüle ettiğini hatırlamanız gerekir.


0

CPU'lar şu şekilde çalışır:

  • geçerli komutu al, "geçerli talimat" işaretçisini artır.

  • kodunu çözme (örn. CPU'ya ne yapmasını söyleyen bu talimatın ne olduğunu öğrenin)

  • yürütmek (talimatın söylediklerini yapmak) - talimat "atlama" gibi bir şey varsa, geçerli talimat işaretçisi değiştirilebilir.

  • Sonsuza kadar tekrarla

Modern CPU'lar daha karmaşıktır ve bu sürecin bazı bölümlerini büyük ölçüde örtüşmeye ve hatta tahmin etmeye çalışır (örneğin, CPU "boru hatlarını" dolu tutmak için "mevcut talimat" işaretçisinin çok ötesine geçerken diğer 10 kodun kodu çözülürken çalıştırmaya başlayın), ancak temel süreç gerçekten aynı.

Birçok talimat türü vardır, bunların çoğuna bir örnek:

  • "Taşı" talimatları. Bunlar X'i başka bir X'e kopyalayabilir; burada X bellek (RAM), bir kayıt veya CPU böyle bir durumu destekliyorsa G / Ç alanındaki bir adresdir.

  • Kayıt defterine pop, yığın üzerinde itme kaydı, vb. Dahil olmak üzere yığın manipülasyon talimatları Bunlar, "yığın işaretçisi" kaydını kullanan ve güncelleyen özel bir "taşıma" talimatları örneğidir.

  • İki kayıt veya bellek ve kayıt arasında matematik işlemlerini gerçekleştiren talimatlar. Bu talimatlar bir bayrak kaydını otomatik olarak etkiler. Bu bayraklardan biri, sonuç sıfır olduğunda ayarlanan "sıfır" bayrağı, diğeri ise sonucun en önemli biti ayarlanmışsa ayarlanan "negatif" bayraktır. CPU'ya bağlı olarak başkaları da olabilir.

  • Matematik işlemlerinin özel bir örneği, çıkarma ile aynı olan karşılaştırma sonuçlarıdır, ancak sonuç korunmaz. Bayraklar hala etkilenmektedir.

  • Belirli bayraklar ayarlanmışsa, bir bellek adresine atlayan şube talimatları vardır. Yukarıda belirtilen "sıfır" bayrağını hatırlıyor musunuz? Ayrıca "eğer eşitse" bayrağı olarak iki katına çıkar, bu nedenle BEQ"sıfır" bayrağı ayarlanmışsa aslında dallanan birçok CPU'da olduğu gibi talimatları görürsünüz .

  • Mantıksal işlemler (AND, OR, NOT), kaydırma bitleri ve test bitleri gerçekleştiren talimatlar. CPU'ya bağlı olarak matematik talimatları gibi bayrakları etkileyebilir.

  • Koşulsuz olarak atlayan talimatlar.

  • İade adresini yığına kaydeden ve kaydeden talimatlar ("çağrı") ve yığından adresi alan diğer talimatlar ("dönüş").

  • CPU'yu durduran, CPU'yu tanımlayan veya kesme işleyicilerini çağıranlar gibi özel talimatlar.

  • "İşlem Yok" - neredeyse tüm CPU'larda yalnızca döngüleri tüketen ve devam eden bir "işlem yok" komutu bulunur.

Bu gerçekten sadece bir örnek, daha az talimat içeren CPU'lar ve daha fazla CPU'lar var.

Mesele, bir CPU'daki matematik talimatlarının yanı sıra birçok talimat türü olduğunu göstermektir. Daha üst düzey bir dilde her şey yukarıdaki işlem türlerine ayrılmıştır ve bunlardan sadece bazıları matematik veya ALU tipi talimatlar olacaktır.

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.