Bahasa pemrograman mana yang digunakan untuk menulis program BIOS?

65

Seperti yang saya pahami, kode BIOS / bitstream yang disimpan dalam ROM harus generik (bekerja bersama dengan beberapa tipe CPU atau ISA). Selain itu, saya melihat disebutkan di web bahwa ada kemungkinan untuk membuang kodenya (dan untuk "membongkar" itu).

Jadi, dalam bahasa apa, set instruksi atau kode mesin ditulis? Tidakkah itu membutuhkan prosesor untuk menjalankan operasinya? Jika demikian, saya kira itu akan menggunakan CPU eksternal, lalu bagaimana ia tahu set instruksi spesifik yang digunakan?

Mungkin memiliki prosesor internal?

Refleksi
sumber
9
kemungkinan duplikat dari Bagaimana Cara Kerja Komputer?
nyamuk
39
Posting silang cukup buruk, tetapi ketika berakhir di Pertanyaan Jaringan Panas di kedua versi , itu hanya di luar batas ...
Mason Wheeler
8
"Kode / bitstream BIOS yang disimpan dalam ROM harus generik (bekerja bersama dengan beberapa tipe CPU atau ISA)." - Saya belum pernah mendengar tentang BIOS yang bekerja dengan beberapa ISA. Apakah kamu punya contoh?
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). Saya akan mengatakan "Tidak, justru sebaliknya"
edc65
11
Ini bahkan bukan duplikat dari pertanyaan secara umum seperti "Bagaimana Cara Kerja Komputer?". Tolong jangan tutup sebagai korban penipuan.
Andres F.

Jawaban:

103

BIOS dulu ditulis secara eksklusif dalam bahasa assembly, tetapi transisi dibuat sejak lama untuk menulis mayoritas kode dalam beberapa bahasa tingkat yang lebih tinggi, dan meninggalkan ditulis dalam perakitan sebagai beberapa bagian dari itu mungkin, lebih disukai hanya bootstrapper, (ratusan instruksi pertama yang dilompati CPU setelah start / reset,) dan rutinitas apa pun yang berhubungan dengan kebiasaan khusus dari arsitektur yang mendasarinya.

BIOS sudah ditulis terutama di C pada awal tahun sembilan puluhan. (Saya menulis BIOS di 90% C, perakitan 10% di awal tahun sembilan puluhan.)

Apa yang juga sangat membantu dalam arah ini adalah:

  • Pustaka C yang menargetkan arsitektur tertentu dan menyertakan fungsi untuk menangani kekhasan arsitektur itu, misalnya, fungsi untuk membaca / menulis byte ke / dari port I / O arsitektur x86. Microsoft C selalu menawarkan fungsi perpustakaan untuk hal-hal semacam itu.

  • Kompiler C yang tidak hanya menargetkan arsitektur CPU tertentu tetapi bahkan menawarkan ekstensi ke bahasa C yang dapat Anda gunakan untuk menulis kode yang memanfaatkan fitur CPU khusus. Misalnya, arsitektur x86 mendukung hal-hal yang dikenal sebagai interupsi, yang menjalankan rutin yang dikenal sebagai interrupt handler, dan itu mengharuskan mereka untuk memiliki urutan instruksi masuk / keluar khusus. Sejak awal, Microsoft C mendukung kata kunci khusus yang dapat Anda gunakan untuk menandai fungsi sebagai pengendali interupsi, sehingga dapat dipanggil secara langsung oleh interupsi CPU, sehingga Anda tidak perlu menulis rakitan apa pun untuk itu.

Saat ini saya akan berasumsi bahwa sebagian besar BIOS ditulis dalam C ++, jika tidak dalam bahasa tingkat yang lebih tinggi.

Sebagian besar kode yang membentuk BIOS khusus untuk perangkat keras yang mendasarinya, sehingga tidak benar-benar harus portabel: dijamin bahwa ia akan selalu berjalan pada jenis CPU yang sama. CPU dapat berevolusi, tetapi selama ia mempertahankan kompatibilitas ke belakang dengan versi sebelumnya, ia masih dapat menjalankan BIOS yang tidak dimodifikasi. Plus, Anda selalu dapat mengkompilasi ulang bagian-bagian BIOS yang ditulis dalam C untuk berjalan secara native pada CPU baru yang muncul, jika perlu.

Alasan mengapa kami menulis BIOS dalam bahasa yang lebih tinggi daripada perakitan adalah karena lebih mudah untuk menulisnya dengan cara ini, bukan karena mereka benar-benar harus portabel.

Mike Nakis
sumber
7
Iya. Kadang-kadang Anda bahkan mungkin memiliki motherboard yang terikat tidak hanya untuk arsitektur CPU tertentu, tetapi bahkan ke vendor CPU tertentu. Saat ini Anda dapat membeli motherboard x86 yang hanya kompatibel dengan CPU Intel x86, atau motherboard x86 yang hanya kompatibel dengan CPU AMD x86. BIOS di motherboard ini akan identik dengan tingkat yang besar, karena dalam kedua kasus CPU memahami set instruksi x86, dan sebagian besar periferal identik, tetapi beberapa periferal memiliki perbedaan, yang harus diperhitungkan oleh BIOS.
Mike Nakis
4
@Refleksi mencermati apa yang tampak seperti motherboard secara fisik. Soket CPU akan memiliki pengaturan pin tertentu, yang khusus untuk keluarga CPU yang diterimanya. Anda secara fisik tidak dapat terhubung, katakanlah Intel P4 ke motherboard AMD Opteron
Caleth
14
Istilah "BIOS" mengacu pada "Sistem Input / Output Dasar" pada PC, jadi, memiliki BIOS berarti CPU x86. Sistem IA64 memiliki EFI daripada BIOS, sistem PowerPC mungkin memiliki sistem Open Firmware atau yang eksklusif, sistem Sparc juga memiliki OFW (atau lebih tepatnya OpenBoot), OLPC X0 adalah sistem berbasis x86 yang menggunakan OFW. Bahkan PC tidak lagi menggunakan BIOS, mereka telah beralih ke (U) EFI. OB / OFW menarik, karena dirancang untuk tidak hanya portabel tetapi juga lintas platform. Driver OFW akan bekerja pada sistem OFW apa pun , mereka adalah "Write Once Run Anywhere", terlepas dari CPU ISA.
Jörg W Mittag
14
"Saat ini saya akan berasumsi bahwa sebagian besar BIOS ditulis dalam C ++" Saya tidak akan selalu berasumsi bahwa, Ini mungkin benar tetapi saya bekerja di industri itu dan tentu saja banyak boot loader yang ditulis dalam huruf C sederhana. Orang-orang yang menulis semacam itu barang sering "Old Guard" dan cenderung tidak sepenuhnya percaya C ++.
Sam
6
@ TomDworzanski: Walaupun secara teknis bukan BIOS (yang merujuk secara eksklusif pada barang-barang PC tahun 1981), banyak implementasi IEEE-1275 Open Firmware (yang digunakan untuk peran yang sama seperti BIOS pada Sparc, Platform Referensi Perangkat Keras PowerPC Umum (mis. PowerMac, PowerBook), laptop 100 $ OLPC X0-1) sebagian ditulis dalam bahasa selain assembly / C. OpenBoot , Open Firmware , OpenBIOS semuanya mengandung ...
Jörg W Mittag
11

Sementara secara teori seseorang dapat menulis BIOS dalam bahasa apa pun, kenyataannya modern adalah kebanyakan BIOS ditulis menggunakan Assembly, C, atau kombinasi keduanya .

BIOS harus ditulis dalam bahasa yang dapat dikompilasi ke kode mesin , yang dipahami oleh mesin perangkat keras fisik. Ini menghilangkan bahasa yang ditafsirkan secara langsung atau menengah (Perl, Python, PHP, Ruby, Java, C #, JavaScript, dll) yang sesuai untuk menulis BIOS. (Meskipun, secara teori, seseorang dapat mengimplementasikan salah satu dari bahasa-bahasa ini untuk mengkompilasi langsung ke kode mesin statis atau seseorang dapat menanamkan penerjemah ke dalam BIOS. Sebagai contoh, ada proyek GCJ yang ditinggalkan untuk Java.)

Sebagian besar OEM menerapkan BIOS dengan memperluas kepemilikan, implementasi BIOS umum oleh perusahaan-perusahaan seperti American Megatrends dan Phoenix Techologies . (Anda mungkin pernah melihat salah satu perusahaan yang ditampilkan di layar boot pertama komputer sebelumnya.) Kode sumber untuk implementasi ini tidak tersedia untuk umum, tetapi beberapa di antaranya telah bocor. Saya tidak ingin menautkan ini langsung ke kode sumber C dan assembly, tetapi ada tempat - tempat di Internet di mana kode sumber ini dibahas bagi mereka yang ingin mengintip.

Beberapa produsen perangkat keras, seperti yang menargetkan kinerja tinggi dan pasar game, memenuhi implementasi BIOS mereka dengan fitur kustomisasi, statistik, dan antarmuka pengguna yang menarik yang dirancang untuk implementasi yang tepat. Banyak fitur ini melampaui apa yang ditawarkan dalam produk-produk generik yang diproduksi oleh American Megatrends dan lainnya. Sayangnya, perusahaan-perusahaan ini sering melihat pelepasan kode sumber mereka sebagai risiko keamanan , sehingga sedikit yang diketahui tentang implementasi kelas atas ini karena sedikit yang dibagikan tentang mereka. Seseorang tentu saja dapat menemukan cara untuk mengakses dan meng-compile implementasi BIOS seperti itu tetapi melakukannya mungkin sulit dan mungkin ilegal.

Kembali ke pertanyaan awal, karena kebutuhan untuk menghasilkan kode mesin asli, BIOS harus diimplementasikan dalam bahasa pemrograman yang didukung oleh kompiler kode mesin asli . Meskipun ada banyak bahasa seperti itu dan sementara saya yakin selama beberapa dekade terakhir, beberapa bahasa telah digunakan dalam percobaan, setiap implementasi BIOS terbuka yang saya dapat temukan secara khusus bergantung pada kombinasi C dan / atau rakitan. Implementasi open-source BIOS yang saya lihat untuk membentuk kesimpulan ini termasuk OpenBIOS , tinyBIOS , coreboot , Intel BIOS , dan Libreboot. Saya juga melihat beberapa implementasi BIOS yang sangat tua yang tidak relevan hari ini tetapi juga mengikuti aturan C dan / atau assembly.

Saya pikir itu juga relevan untuk melihat perangkat lunak lain yang dibangun untuk berinteraksi langsung dengan perangkat keras. Kita tahu, misalnya, bahwa Kernel Linux , OS X kernel , dan kernel Windows sebagian besar C dengan beberapa rakitan dan beberapa bahasa tingkat yang lebih tinggi untuk tugas-tugas tertentu. Kita juga tahu bahwa driver perangkat keras di Linux dan driver perangkat keras di Windows sebagian besar ditulis dalam C.

Kembali ke BIOS, saya pikir juga penting untuk mempertimbangkan ekonomi dari bahasa pemrograman yang dipilih. BIOS umumnya ditulis sebagai kebutuhan untuk melengkapi penjualan perangkat keras. Sistem BIOS modern dikenal sebagian besar ditulis dalam bahasa C dan / atau rakitan. Perpindahan ke alat lain akan menambah biaya signifikan pada apa yang umumnya dianggap sebagai produk komoditas yang dapat sangat mempengaruhi penjualan. Tanpa masuk ke Economics 101, saya dapat meyakinkan Anda bahwa mungkin tidak layak bagi OEM untuk menyimpang dari alat yang sudah terbukti benar yang telah terbukti selama beberapa dekade.

Tentu saja ada dan akan menjadi proyek hobi untuk menulis BIOS juga. Ini juga, sejauh ini, tampaknya memilih C dan / atau perakitan. Mungkin suatu hari teknologi lain akan digunakan. Tapi hari ini, pilihannya jelas.

Rich Smith
sumber
4
Ini sedikit nit-picking tetapi C # dan Java tidak ditafsirkan. Mereka mengkompilasi ke byte-code. Ini adalah kode byte yang kemudian ditangani oleh seorang juru bahasa. Tidak mengubah logika paragraf pertama.
Tonny
1
@ Tony Itu benar. Saya menambahkan "ditafsirkan secara langsung atau menengah" menjadi sedikit lebih jelas.
@Tonny biasanya jitter daripada interpreter, yang merupakan perbedaan penting karena dimungkinkan untuk pre-jit semuanya ke asli asalkan teknik dinamis tertentu tidak digunakan. Dengan demikian, secara teoritis dimungkinkan untuk menulis BIOS dalam bahasa .NET atau Java, jika seseorang melakukan keduanya dan memastikan semua dukungan runtime yang diperlukan tersedia. Saya membayangkan upaya melakukan itu akan lebih dari katai kenyamanan yang ditemukan sekalipun.
Jon Hanna
1
@Tonny Sebenarnya C # mengkompilasi ke kode asli msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx sehingga aneh untuk melihatnya dalam daftar bahasa yang lemah / dinamis.
Den
@Den C # biasanya tidak dikompilasi ke kode asli. Produk .Net Asli ini yang Anda tautkan belum dirilis secara resmi. Dari apa yang saya baca, itu akan mengkompilasi kode aplikasi dan kode kerangka kerja yang diperlukan menjadi executable. Menurut FAQ, ini akan ditargetkan pada aplikasi Windows Store pada awalnya, sehingga mungkin perlu waktu untuk didukung lebih luas. Semua yang dikatakan, sepertinya Microsoft mungkin pindah dari model mesin virtual beberapa waktu di masa depan jika semuanya berjalan dengan baik.
4

BIOS aktual untuk komputer akan ditulis dalam beberapa bahasa (mungkin C atau assembly) yang dikompilasi dengan kode biner yang bergantung pada arsitektur; kode ini tidak dapat berjalan pada arsitektur lain (dan bisa dibilang tidak benar-benar perlu, karena sudah sangat spesifik untuk mesin yang dikirim).

Tetapi apakah Anda mungkin berpikir tentang ROM Opsi (yang kadang-kadang disebut BIOS, seperti dalam "Video BIOS" untuk ROM opsi GPU)?

Untuk ROM opsi BIOS yang kompatibel dan lama, mungkin merupakan kode yang dapat dieksekusi bergantung pada ISA (sekali lagi dihasilkan oleh bahasa apa pun yang dapat dikompilasi untuk menargetkan arsitektur yang diinginkan); PCI juga memungkinkan memasukkan kode untuk beberapa ISA dan memungkinkan host untuk memilih gambar biner yang sesuai selama proses boot.

Untuk ROM opsi yang kompatibel dengan UEFI, ada juga format kode byte arsitektur-independen yang dapat dijalankan pada arsitektur yang berbeda, tetapi kode yang bergantung pada ISA juga masih dapat digunakan.

lxgr
sumber