Bir BIOS programını yazmak için hangi programlama dili kullanılır?


65

Anladığım kadarıyla ROM'da tutulan BIOS kodu / bit akımı genel olmalıdır (birden fazla CPU türü veya ISA ile birlikte çalışır). Ek olarak, web’de kodunu atmanın (ve “sökülmesi”) mümkün olduğunu belirtmiştim.

Peki hangi dilde komut seti veya makine kodu yazılmıştır? İşlemlerini gerçekleştirmek için herhangi bir işlemciye ihtiyaç duymuyor mu? Öyleyse, harici CPU'yu kullanacağını tahmin ediyorum, o zaman kullanılan kişinin özel komut setini nereden biliyor?

Belki de dahili bir işlemcisi vardır?



39
Çapraz gönderme yeterince kötüdür, ancak her iki sürümde de Sıcak Ağ Soruları sona erdiğinde , bu
Mason Wheeler

8
"ROM'da tutulan BIOS kodu / bit akımı genel olmalıdır (birden fazla CPU türü veya ISA ile birlikte çalışır)." - Ben asla birden Uluslararası Denetim Standartlarının ile çalışan bir BIOS duymuş. Bir örnek var mı
chx

6
As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). "Hayır, tam tersi"
derim

11
Bu, uzaktan "Bilgisayar Nasıl Çalışıyor?" Kadar genel bir sorunun bir kopyası bile değildir. Lütfen dupe olarak kapatmayın.
Andres F.

Yanıtlar:


103

BIOS'lar yalnızca assembly dilinde yazılmıştı, ancak geçiş, kodun çoğunluğunu daha yüksek bir dilde yazmak için uzun zaman önce yapıldı ve montajda mümkün olduğu kadar az bölümü, tercihen sadece önyükleyici, (CPU'nun başlatıp sıfırladıktan sonra atladığı ilk yüzlerce talimat) ve rutinleri ne olursa olsun temel mimarinin belirli tuhaflıkları ile ilgilidir.

BIOS'lar zaten C'lerde doksanların başlarında olduğu gibi yazılmıştı. (Doksanlı yılların başında% 90,% 10 montajda bir BIOS yazdım.)

Bu yönde de büyük ölçüde yardımcı olan şey:

  • Belirli bir mimariyi hedefleyen ve bu mimarinin özellikleriyle ilgilenmek için işlevler içeren, örneğin x86 mimarisinin I / O bağlantı noktalarına / baytlarını okuma / yazma işlevleri gibi C kütüphaneleri. Microsoft C her zaman bu tür şeyler için kütüphane işlevi sunmuştur.

  • Yalnızca belirli bir CPU mimarisini hedef alan değil, aynı zamanda özel CPU özelliklerinden yararlanan kod yazmak için kullanabileceğiniz C diline uzantılar sunan C derleyicileri. Örneğin, x86 mimarisi, kesinti işleyicileri olarak bilinen yordamları çağıran kesinti olarak bilinen şeyleri destekler ve özel giriş / çıkış komutları dizisine sahip olmalarını gerektirir. Microsoft C, ilk günlerden itibaren, bir işlevi kesme işleyicisi olarak işaretleyebileceğiniz özel anahtar kelimeleri destekledi, bu nedenle doğrudan bir CPU kesmesi tarafından çağrılabilir, bu nedenle bunun için herhangi bir derleme yazmanıza gerek kalmazdı.

Bugünlerde, BIOS'un daha yüksek bir dilde olmasa da, C ++ dilinde yazılmış olduğunu varsayacağım.

BIOS'u oluşturan kodun büyük çoğunluğu altta yatan donanıma özgüdür, bu nedenle gerçekten taşınabilir olması gerekmez: her zaman aynı CPU türünde çalışacağı garanti edilir. CPU gelişebilir, ancak önceki sürümlerle geriye dönük uyumluluğu koruduğu sürece, hala BIOS'u değiştirilmemiş olarak çalıştırabilir. Ayrıca, gerektiğinde ortaya çıkacak yeni bir CPU'da yerel olarak çalışmak için her zaman C ile yazılmış BIOS bölümlerini yeniden derleyebilirsiniz.

BIOS'ları meclis seviyesinden daha yüksek dillere yazmamızın nedeni, gerçekten taşınabilir olmaları gerektiği için onları bu şekilde yazmaktan daha kolay olmasıdır.


7
Evet. Bazen yalnızca belirli bir CPU mimarisine değil, belirli bir CPU satıcısına bile bağlı bir anakartınız olabilir. Günümüzde yalnızca Intel x86 CPU'larla uyumlu bir x86 anakartı veya yalnızca AMD x86 CPU'larla uyumlu bir x86 anakartı satın alabilirsiniz. Bu anakartlardaki BIOS büyük ölçüde aynı olacaktır, çünkü her iki durumda da CPU x86 komut setini anlar ve çevre birimlerinin çoğu aynıdır, ancak bazı çevre birimlerinin BIOS'un hesaba katması gereken farklılıkları vardır.
Mike Nakis

4
@ Yansıma, bir anakartın fiziksel olarak nasıl göründüğüne yakından bakın. CPU soketi, kabul ettiği CPU ailesine özgü belirli bir pin düzenlemesine sahip olacaktır. Fiziksel olarak bir Intel P4
söyleyerek

14
"BIOS" terimi, bir bilgisayarın "Temel Giriş / Çıkış Sistemi" anlamına gelir, bu nedenle bir BIOS'a sahip olmak bir x86 CPU anlamına gelir. IA64 sistemleri BIOS yerine EFI'ye sahip, PowerPC sistemleri bir Açık Ürün Yazılımı sistemine veya özel bir ürüne sahip olabilir, Sparc sistemleri de OFW'ye (ya da daha doğrusu OpenBoot'a) sahip, OLPC X0 OFW'yi kullanan x86 tabanlı bir sistem. Bilgisayarlar bile artık BIOS kullanmıyorlar, (U) EFI'ye geçtiler. OB / OFW ilginç, çünkü sadece taşınabilir değil aynı zamanda platformlar arası olacak şekilde tasarlandı. OFW sürücüleri herhangi bir OFW sistemi üzerinde çalışacaklardır , CPU ISA'sına bakmaksızın "Her Yere Çalıştırılan Bir Kere Yaz" dırlar.
Jörg W Mittag

14
"Bugünlerde BIOS'un çoğunun C ++ ile yazılmış olduğunu varsayardım" diyerek bunu kesinlikle kabul etmedim, Doğru olabilir, ancak o sektörde çalışıyorum ve kesinlikle birçok önyükleyici düz C yazıyor. Bunların çoğu "Eski Muhafız" dır ve hala C ++ 'a tamamen güvenmemeye meyillidir.
Sam

6
@TomDworzanski: Teknik olarak BIOS olmasa da (sadece eski 1981 PC-lerine atıfta bulunur), IEEE-1275 Open Firmware'in birçok uygulaması (Sparc'taki BIOS ile benzer bir rol için kullanılır, PowerPC Ortak Donanım Referans Platformu (örn. PowerMac, PowerBook), 100 $ dizüstü bilgisayar OLPC X0-1) kısmen montaj / C dışındaki dillerde yazılmıştır. OpenBoot , Firmware Aç , OpenBIOS hepsi içerir…
Jörg W Mittag

11

Teoride kişi BIOS'u herhangi bir dilde yazabiliyor olsa da, modern gerçeklik çoğu BIOS'un Assembly, C veya ikisinin bir kombinasyonu kullanılarak yazılmasıdır .

BIOS , fiziksel donanım makinesi tarafından anlaşılan makine kodunu derleyebilecek bir dilde yazılmalıdır . Bu, BIOS yazımı için uygun olan, doğrudan veya orta sözlü çeviri dillerini (Perl, Python, PHP, Ruby, Java, C #, JavaScript vb.) Ortadan kaldırır. (Teoride, biri bu dilden birini doğrudan statik makine koduna derlemek için uygulayabilir veya diğeri tercümanı BIOS'a yerleştirebilir. Örneğin, Java için terkedilmiş GCJ projesi vardır .)

Çoğu OEM, Amerikan Megatrends ve Phoenix Techologies gibi şirketler tarafından verilen özel, genel BIOS uygulamalarını genişleterek bir BIOS kullanıyor . (Muhtemelen daha önce bir bilgisayarın ilk açılış ekranında bu şirketlerden birini görmüştünüz.) Bu uygulamaların kaynak kodu halka açık değil, ancak bir kısmı sızdırılmış. Buna doğrudan C ve derleme kaynak koduyla bağlantı kurmak istemiyorum, ancak internette göz atmak isteyenler için bu kaynak kodun tartışıldığı yerler var .

Bazı donanım üreticileri, yüksek performans ve oyun pazarlarını hedefleyenler gibi, BIOS uygulamalarını kişiselleştirme özellikleri, istatistikler ve tam uygulamaları için tasarlanmış çekici kullanıcı arayüzleriyle doyururlar. Bu özelliklerin çoğu, Amerikan Megatrends ve diğerleri tarafından üretilen jenerik ürünlerde sunulanların ötesine geçmektedir. Ne yazık ki, bu şirketler genellikle kaynak kodlarının yayımlanmasını bir güvenlik riski olarak görmektedir, bu üst seviye uygulamalar hakkında çok az şey bilinmektedir, çünkü bunlar hakkında çok az şey paylaşılmaktadır. Elbette böyle bir BIOS uygulamasına erişmek ve bunları derlemek için yollar bulabiliriz, ancak bunu yapmak zor ve muhtemelen yasa dışı olabilir.

Özgün soruya geri dönersek, yerel makine kodu üretme ihtiyacı nedeniyle, bir yerel makine kodu derleyici tarafından desteklenen bir programlama dilinde bir BIOS uygulanmalıdır . Bu tür birçok dil var ve son birkaç on yıldan beri emin olduğum halde, deneylerde birkaç dil kullanılmış olmasına rağmen, bulabildiğim her açık BIOS uygulaması özellikle C ve / veya montaj kombinasyonuna dayanıyor. Bu sonuca varmak için baktım açık kaynaklı BIOS uygulamaları içerir OpenBIOS , tinyBIOS , coreboot , Intel BIOS ve Libreboot. Ayrıca bugünle alakalı olmayan çok eski BIOS uygulamalarına da baktım, aynı zamanda C ve / veya montaj kuralına uydum.

Doğrudan donanımla etkileşimde bulunmak için oluşturulmuş diğer yazılımlara da bakmak gerektiğini düşünüyorum. Örneğin, Linux Çekirdeği , OS X çekirdeği ve Windows çekirdeğinin belirli görevler için bazı meclislerde ve bazı üst düzey dillerde büyük ölçüde C olduğunu biliyoruz . Biz de biliyoruz Linux üzerinde donanım sürücüleri ve Windows üzerinde donanım sürücüleri C. ölçüde yazılır

BIOS'a geri döndüğümde, seçilen programlama dilinin ekonomisini göz önünde bulundurmanın da önemli olduğunu düşünüyorum. BIOS genellikle donanım satışlarını tamamlamak için bir zorunluluk olarak yazılmıştır. Modern BIOS sistemlerinin büyük ölçüde C ve / veya montaj olarak yazıldığı bilinmektedir. Başka bir araca geçilmesi, genel olarak satışları olumsuz yönde etkileyebilecek emtia ürünleri olarak kabul edilenlere önemli maliyetler katacaktır. Ekonomi 101'e girmeden, on yıllardır kanıtlanmış denenmiş ve doğru araçlardan sapmanın muhtemelen bir OEM'e değmeyeceği konusunda sizi temin ederim.

Elbette BIOS'u yazmak için bir hobi projesi de var ve olacak. Bu da şimdiye kadar, C ve / veya montajı seçiyor gibi görünüyor. Belki bir gün başka teknolojiler kullanılacaktır. Ancak bugün, seçimi iyi tanımlanmıştır.


4
Bir miktar nitelemeye rağmen, C # ve Java yorumlanmıyor. Bayt kodunu derlerler. Daha sonra bir tercüman tarafından ele alınan bayt kodudur. İlk paragrafın mantığını değiştirmez.
Tonny,

1
@Tonny Bu doğru. Biraz daha net olması için "doğrudan ya da orta düzeyde yorumlanmış" ifadesini ekledim.

@Tonny normalde tercümandan ziyade bir titizliktir, bu önemli bir ayrımdır, çünkü belli dinamik teknikler kullanılmadığı sürece hepsini yerel olarak önceden kullanmak mümkündür. Bu nedenle, eğer hem bunu yaptı hem de gereken tüm çalışma zamanı desteğinin mevcut olduğundan emin olsaydı, bir BIOS'u .NET veya Java dilinde yazmak teorik olarak mümkün olurdu. Bunu yapmanın çabalarını, bulunan herhangi bir kolaylık cüceden daha fazla olacağını hayal ediyorum.
Jon Hanna,

1
@Tonny Aslında C #, msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx yerel kodunu derler, bu yüzden zayıf / dinamik diller listesinde görmek gariptir .
Den

@Den C # tipik olarak yerel koda derlenmez. Bu, bağladığınız Net yerel ürün henüz resmi olarak yayınlanmadı. Okuduklarımdan itibaren, uygulama kodunu ve gerekli çerçeve kodunu yürütülebilir bir dosyada derleyecektir. SSS’ye göre, bu başlangıçta Windows Mağazası uygulamalarında hedeflenecektir, bu nedenle bunun daha yaygın olarak desteklenmesi biraz zaman alabilir. Tüm söylenenler, Microsoft her şey yolunda giderse gelecekte sanal makine modelinden uzaklaşabilecek gibi görünüyor.

4

Bir bilgisayar için gerçek BIOS, mimariye bağlı ikili kod için derlenmiş bir dilde (muhtemelen C veya montaj) yazılır; bu kod başka bir mimaride çalıştırılamaz (ve gönderildiği makineye zaten çok özel olduğu için tartışmaya gerçekten gerek duymaz).

Ancak, muhtemelen Seçenek ROM'larını mı düşünüyorsunuz (bazen GPU opsiyon ROM'unda "Video BIOS" da olduğu gibi BIOS olarak da adlandırılır)?

Gerçek, eski BIOS uyumlu seçenek ROM'ları için, bunlar muhtemelen ISA'ya bağlı çalıştırılabilir kod olacaktır (yine istenen mimariyi hedeflemek için derlenebilecek herhangi bir dil tarafından oluşturulan); PCI da izin verir birden Uluslararası Denetim Standartlarının dahil kodu ve önyükleme işlemi sırasında uygun ikili görüntüyü seçmek için ev sahibi verir.

UEFI uyumlu seçenek ROM'lar için, farklı mimarilerde çalıştırılabilen mimariden bağımsız bir bayt kodu biçimi de vardır, ancak ISA'ya bağlı kod da kullanılabilir.

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.