Neden bazı işletim sistemleri olay işleme c yerine asm yazılır?


17

Benim sorum şu anda neden çekirdek işletim sistemi çoğunlukla C dilinde yazıldığında, bazı işletim sistemi olay işlemelerinin hala C gibi daha üst düzey bir dil yerine derleme dilinde yazıldığıdır?


5
"Çoğunlukla c" - ve tahmin et gerisi nedir? ;)
goldilocks

@ goldilocks iyi montajda. Ama neden diğer bölümler c'deyken?
MAKZ

4
Bu konuda uzman değilim ama C ile yapılamayan bazı düşük seviyeli donanımla ilgili şeyler var; bunlar genellikle mimariye özgüdür. "Inline ASM" genellikle bu amaçla C kodunda kullanılır, bu nedenle, örneğin foobar(), bir platformda bir yol ve bir başka yol üzerinde satır içi montaj kullanılarak tanımlanacaktır. Bu, asm kullanımını minimumda tutar, ancak tamamen önlenemez.
goldilocks

Global Tanımlayıcı Tablo İşaretçisi kaydını C olarak nasıl ayarlarsınız?
user253751

Yanıtlar:


24

Dil, CPU kayıtlarına erişimi ve olayları işlerken bir işletim sistemini bağlamdan kurtarmak zorundadır, bu nedenle olay noktasındaki kayıtlara erişmesi ve böylece C spesifikasyonunu kırması gerekir.


Aslında asıl sebep budur. Bazı gömülü C derleyicilerinin kayıtlara hitap etmelerini sağlayan uzantıları vardır (genellikle önceden bildirilmiş global sabitler / değişkenler aracılığıyla). Bunu yapabilirler çünkü sadece bir mimariyi hedeflerler. Ancak genel amaçlı C derleyicileri, bu uzantıları makul hale getirmek için çok fazla farklı mimariyi hedefler. Bu yüzden genellikle sadece bir asm gömme mekanizması
uygularlar

18

C, makinede çalışan makine kodundan bir soyutlamadır (diğer dillerden çok daha yakın olmasına rağmen).

Bu şeyler için C ile ifade edilemeyen ve belki de C derleyici düzeneği tarafından sağlanmayan ekstra optimizasyon için, çoğunlukla satır içi birleştirici şeklinde makine kodu ifadeleri kullanılır .

Çekirdek kaynak kodu ağacında bu, altında arch/<arch>ve belirli bir mimari adı olan include/asm-<arch>yerde saklanır <arch>. Aslında çekirdek kaynağının sadece küçük bir kısmıdır.


6

Bunu C dilinde yapamazsınız :)

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax

X86 korumalı moda girmeye çalışıyorum. Açıkçası ben hala ham makine kodları "yayan" C yapabilirim, ama yine de kesin ofset erişmek için gerekirse - ben çoğunlukla şans dışındayım.

İkinci örnek BootLoader'dır. X86 sistemlerinde, geleneksel önyükleme kodunun tam olarak 512 bayt uzunluğunda ve son iki baytın sırasıyla 0xAA ve 0x55 (veya tam olarak 55 AA) olması gerekir ... C derleyicilerinde böyle bir şeyin kabus ve montajcı olması iş harika bir şekilde.

Meclis'in sadece tercih edilebileceği değil, aynı zamanda tek yolun olduğu daha pek çok durum var.


-5

asm daha incedir ve genellikle kütüphaneler vb. ile yapılan C'den çok daha hızlıdır ve işletim sistemi her zaman bir sürü olayı idare etmektedir. Bu işlev için ince ve hızlı istiyorsun.


2
C derleyici teknolojisini optimize etmek oldukça iyi bir hale geldi. Asmın genellikle C'den çok daha hızlı olacağı bir efsanedir. Her durumda, düşük seviyeli işletim sistemi işlemlerinin asm kullanmasının nedeni bu değildir. Çoğunlukla C'de bellek engelleri gibi ifade edilemeyen işlemlerle ilgilidir ve C olmayan çağrı kuralları vb. İçin dansları kaydeder ...
Celada
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.