İşletim sistemleri

Merhaba, az önce aklıma bir kaç soru takıldı onları sormak için bu konuyu açtım. Sorularım şunlar:

1- Windows çok kullanılan bir işletim sistemi ve sistemin bir kısmı Assembly ile yazıldı ama işlemcilerin kendi Assembly dilleri var bu durumda nasıl işletim sistemleri bilgisayarlarda rahatlıkla çalışıyor ? Her Assembly dili için ayrı ayrı mı geliştiriliyorlar ?

2- İşletim sistemlerinde C de kullanılıyor, işlemci C kodlarını nasıl anlıyor ? İşlemcinin anlayabildiği tek dil Assembly değil mi ?

1 Beğeni

Yorumlayıcı veya derleyici yazmış olduğumuz kodları işlemcinin anlayabileceği makine kodlarına çeviriyor. Sadece C için değil tüm diller için.

2 Beğeni

İşlemcilerin mimarileri var. Bunlardan biri ARM mesela. NT çekirdeği ARM’ da çalışamaz. Kişisel bilgisayarda kullanılan mimariyi şu anda hatırlamıyorum, ama CISC mimarisini temel alan x64 mimarisi hatırladığım kadarıyla. Bir de RISC diye bir mimari var ki bu da ARM’ ın bir üst kategorisi zaten. Yani demek istediğim işlemcilerde de karışıklık olmaması için bir standartlaşma var. Bahsettiğiniz karışıklık mikrodenetleyicilerde var.

İşlemcinin anlayabileceği tek dil Assembly değil, makine kodu. Makine kodu dediğin şey ise senin verdiğin elektrik sinyallerinden, yani 0 ve 1’lerden başka bir şey değil. Biraz daha bilgi edinmek için şu videolara bakabilirsiniz. İşi tam kavramak istiyorsanız eğer mikrodenetleyicilerle beraber çalışmanız gerekir.

Dipnot: Mikro denetleyici dediğimiz şey ilkel bir işlemciden başka bir şey değildir.

Dipnot 2: Bu videoları anlamak için ise önce transistörlerin nasıl çalıştığını anlamanız gerekir. Transistörlerin nasıl çalıştığını anlamak için ise elektriğin nasıl davrandığını anlamak gerekir.

Dionot 3: Şu anki mikrodenetleyiciler ve işlemcilerin tamamı CMOS teknolojisiyle üretilmektedir. CMOS ise MOSFET tür transistör teknolojisine verilen isimdir.

5 Beğeni

Calisilacak her islemci mimarisi icin farkli assembly kodu yaziliyor.
Windows iyi bir ornek degil cunku sadece Intel mimarisinde calisiyor.

Evet.

Islemci C kodunun derlendigi instruction’lari anliyor/calistiriyor. Instruction’lari assembly dili gibi dusunebilirsin; aralarinda 1:1 eslesme var.

Islemcinin anlayabildigi tek sey kimi tellerin voltajlari. Calistirilmak icin sunulan tel voltajlariyla instruction’lar arasinda 1:1 eslesme var.

CISC olarak kabul edilen x86 (ve x86-64) mimarisi.

RISC bir siniflandirma (“az instruction’li” gibi dusunebilirsin). ARM, bu sinifta oldugunu beyan eden bir mimari ailesi.

Mikrodenetleyicilerin de mimari aileleri var. Hatta islemciye ozel fonksiyonlara ozel instruction’lar yerine register/MMIO uzerinden erisildigi icin aile ici farklar daha az olabiliyor.

Bu ters olmus sanirim. Mikrodenetleyici, hafiza ve cevrebirimleri eklenmis islemci.

2 Beğeni

Benim anladığım kadarıyla assembly, sıradan bir programlama diliydi. Ama bilgisayar ve mimarisindeki evrim öyle boyutlara ulaştı ki, bilgisayar organizasyonundaki birimler arasındaki iletişimi sağlayan yapı daha karmaşık hale geldi. Bu yüzden assembly artık, bilgisayar birimlerinin organizasyonunu sağlamak için, onlara has üretilen bir dil haline geldi. Bizim programlama dilleri ise, assembly ile bizim aramızdaki iletişimi sağlayan bir yapı haline gelerek ayrıştı.

Pek emin olmamakla birlikte, derleyicilerin ve yorumlayıcıların gelişime süreci bana böyle geliyor.

Yine emin değilim. Zaten emin olmak da iyi bir şey değil.

Assembly hic bir zaman “bir” programlama dili olmadi. (Belki dunya uzerinde assembly’si olacak sadece bir tane islemci varken…) Assembly dillerinin geneli adina diyorsan, en azindan son 50 senede buyuk bir degisiklige ugramadiklarini soyleyebilirim. 80’lerdeki instruction set’lerine, bugun geldikleri noktalara, veya yeni uretilenlere bakarsan ayni seyi goreceksin: islemcinin mimarisini ve kapasitesini yansitiyorlar.

Buyuk cogunluk ile sadece islemciyi yonettikleri icin, bilgisayar mimarisindeki birimler ve aralarindaki iletisimin karmasiklasmasindan etkilenmediler. Pratikte X yapmak icin yazilmasi gereken assembly kodu miktari artti belki, ama bu dilin kendisini/sadeligini etkilemedi.

RAM’in kilobyte’larla olculdugu, sabit disklerin yayginlastigi donemlerdeki programlarin degisimiyle beraber assembler’larin makro, sabit ifade (24*60*60) gibi hayat kolaylastirici ozelliklere kavustuklarini tahmin ediyorum. Bu durumda bu programlarin girdisi olan assembly dilleri kullanim kolayliginda seviye atlamis sayilabilir. Oyleyse assembly dillerindeki en buyuk degisimin bu oldugunu tahmin ediyorum.

3 Beğeni

Islemci C kodunun derlendigi instruction’lari anliyor/calistiriyor. Instruction’lari assembly dili gibi dusunebilirsin; aralarinda 1:1 eslesme var.

Yani C derlendiği için işletim sistemi anlayabiliyor öyle mi ? Yani şurda ki gibi: Compilation Process in C language - Tutorial And Example

Assembly hic bir zaman “bir” programlama dili olmadi.

Anladığım kadarıyla Assembly her farklı işlemci mimarisi için verilen genel ad.

(Belki dunya uzerinde assembly’si olacak sadece bir tane islemci varken…)

Ne demek istediğinizi tam anlamadım. Yukarıda işlemcinin Assembly den değil voltajdan anladığını söylemiştiniz.

Emin değilim. Hala araştırıyorum. Mimarileri öğrenmeye çalışıyorum.
Ama kafama takılan şu oldu, hayal etmeye çalıştığımda, en ilkel haliyle bilgisayar organizasyonunu düşünüyorum, mutlaka tek bir işlemci ile organize olmuş bir yapı için bu böyle evrilmiştir diye düşünüyorum.

Bir de şu var, assembly kullanarak, bildiğimiz bilgisayardaki programları yazabilen insanlar var, işlevsel olarak baktığımızda bu açıdan bir programlama dili olarak da geliyor. Belki başka tanımlamalar varsa tabi onu bilemem ama, yüksek seviyeli programlama dili gibi kullananları da gördüm.

Böyle olunca da, böyle bir evrimsel süreç var gibi bir izlenim uyandırdı bende.

Isletim sisteminin anladigi kisim calistirilabilir dosya. (ELF/.exe/.so/.dll) Icindeki kodu islemciye pasliyor.

Evet. “Yazi dili” gibi genel bir isim.

Yazi ilk icat edildiginde dunyada sadece bir tane yazi dili vardi. Ikincisi ciktigindan beri “yazi dili” asla tek bir dilden bahsetmedi.

Burada da islemcinin assembly dili oldugunu soyledim. Celiskiyi goremiyorum.

Bir programlama dili grubu. Veya cok diyalekte sahip bir programlama dili.

Python’da bir fonksiyonu “f()” seklinde cagirabildigini, kosullu calismanin “if hede: hodo” seklinde oldugunu soyleyebilirsin. Bunu “assembly” icin yapamiyorsun.

“X dili Y dili gibi kullaniliyorsa, X dilinin evrimsel sureci Y dilininkine benziyordur.”

Kotu bir onerme degil, fakat dogru olmak zorunda degil.

Burayi anlamadim. "Ilkel"den kasit “basit” mi? O zaman en ilkel bilgisayar tek islemcilidir, evet.

“Bu boyle evrilmistir” derken kim nereye evrilmistir onu anlamadim.

3 Beğeni

Evet en ilkel haliyle derken, en basit haliyle…(Ya alışkanlık, genelde primitive kullanıyoz ya ondan :smiley: kusura bakma)
Yani tek işlemcili bir assembly yapısından, daha yüksek seviyeli diller grubuna hatta daha sonra sıradan scriptlere doğru bir evrim…

1 Beğeni

Bu isini kolay yapmak isteyen bir programcinin tercihlerinin evrimi sanki.

Neyse, konuyu kaybettim. Bir sorun olursa sorarsin :slight_smile:

1 Beğeni

Kusura bakma geç gördüm ama bi sorum var, programlar Assembly den sonra makine diline çevriliyorlar son olarak, makine dili hangi dil ? Makine dili olarak aratınca 2 farklı sonuç çıkıyor birisi Assembly diğeri 0 ve 1ler.

Bilmiyorum, “makine dili” terimini ilk kullanan sensin. Ne demek istedin? Programlar genelde assembly’den sonra calistirilabilir dosyalara cevriliyorlar.

0 ve 1’ler sayi, neyi temsil ettiklerini soylemedigin surece bir ise yaramiyorlar. Kedimin resmi de olabilirler.

1 Beğeni

Şundan bahsediyorum: Makine dili - Vikipedi

Aciklamasi surada yapilmis: Machine code - Wikipedia

Turkcesi sayilar ve sayi sistemlerine fazla takilmis. Daha dilin taniminda dildeki islemlerin sayilarinin ikilik tabandaki yazilma sekillerinden bahsediyor. Ingiliz edebiyatini tanimlarken “kimisi saga, kimisi sola kivrilan harflerle yazilan” diye baslamak gibi bir sey.

Yolladığınız linkteki yazıyı okudum ve bahsettiğiniz şeyi anladım “Programlar genelde assembly’den sonra calistirilabilir dosyalara cevriliyorlar.” demiştiniz. Assembly’nin makine kodu olarak geçmesinin sebebini yolladığınız linkteki yazıda açıklıyor:

A much more human friendly rendition of machine language, called assembly language, uses mnemonic codes to refer to machine code instructions, rather than using the instructions’ numeric values directly, and uses symbolic names to refer to storage locations and sometimes registers. For example, on the Zilog Z80 processor, the machine code 00000101 , which causes the CPU to decrement the B processor register, would be represented in assembly language as DEC B .

Yani Assembly makine kodunun insanlar tarafından okunabilir hali, 0 ve 1 ler ile kod yazmak ile Assembly ile yazmanın arasında bir fark yok.

1 Beğeni

“Makine kodu” kullanilan bir terim degil cunku insanlar assembly kullansalar bile ciktisi calistirilabilir bir dosya, veya mikroislemci programlaniyorsa hex dosyasi oluyor.

“0 ve 1’ler ile” kod yazan kimse yok ama zaten su kadar soru sormak yerine herhangi bir islemcinin assembly manuelini acip baksaydin, her instruction ve opcode’un sayi karsiligi (ve tersi) oldugunu gorurdun. (Arada kizarim boyle :​)

2 Beğeni

Assembly, makine makine dilinin insan diline birebir çevrimi gibi düşünülebilir sanırım. Eğer assembly kod yazarsan onu derlemezsin. Çevirmek yeter. Bu arada C derlenirken de assembly kodu oluşturuluyor. C derleyici önce gerekli birleştirmeleri yapıp tek bir dosya hazırlıyor sonra da onu assembly’ye çeviriyor diye biliyorum. Ya da en azından assembly kodu üretmesi sağlanabiliyor. Sonra o assembly assembler tarafından derlenip linker tarafından linkleniyor.

Bir C kodundan assembly çıktı almak için: gcc -S hello.c
Bu komut çalıştığında genelde hello.s isminde dosya oluşur. İşte o assembly kodu.

Not: Ben gcc kullanıyorum. Başka derleyicilerde nasıl olur bilmem :smiley:

2 Beğeni

“0 ve 1’ler ile” kod yazan kimse yok ama zaten su kadar soru sormak yerine herhangi bir islemcinin assembly manuelini acip baksaydin, her instruction ve opcode’un sayi karsiligi (ve tersi) oldugunu gorurdun.

Hiç aklıma gelmemişti ama bakıcam şimdi.

(Arada kizarim boyle :​)

:scream:

1 Beğeni