Pertanyaan saya adalah mengapa saat ini beberapa penanganan peristiwa sistem operasi masih ditulis dalam bahasa assembly daripada bahasa tingkat yang lebih tinggi seperti C, ketika kernel itu sendiri kebanyakan ditulis dalam bahasa C?
17
foobar()
Akan didefinisikan, menggunakan perakitan inline, satu arah pada satu platform dan cara lain pada beberapa lainnya. Ini membuat penggunaan asm menjadi minimum, tetapi tidak bisa sepenuhnya dihindari.Jawaban:
Bahasa mengabstraksi akses ke register CPU, dan OS ketika menangani peristiwa harus menyelamatkan konteks, sehingga ia membutuhkan akses ke register pada titik acara, sehingga melanggar spesifikasi C.
sumber
C adalah abstraksi dari kode mesin yang berjalan pada mesin (meskipun jauh lebih dekat daripada kebanyakan bahasa lainnya).
Untuk hal-hal itu pernyataan kode mesin yang tidak dapat diekspresikan dalam C, dan mungkin untuk optimasi tambahan yang tidak disediakan oleh rakitan kompiler C digunakan, sebagian besar dalam bentuk assembler inline .
Dalam pohon kode sumber kernel ini disimpan di bawah
arch/<arch>
dan diinclude/asm-<arch>
mana<arch>
adalah nama arsitektur tertentu. Ini sebenarnya hanya sebagian kecil dari sumber kernel lengkap.sumber
Anda tidak dapat melakukan ini di C :)
Sedang mencoba masuk ke mode terproteksi x86. Jelas saya masih bisa melakukan ini dalam C dengan "memancarkan" kode mesin mentah, tetapi masih dalam kasus saya perlu mengakses offset yang tepat - saya sebagian besar kurang beruntung.
Contoh kedua adalah BootLoader. Pada sistem x86, diperlukan bahwa kode boot tradisional panjangnya tepat 512 byte dan dua byte terakhir masing-masing adalah 0xAA dan 0x55 (atau tepatnya 55 AA) ... Memastikan hal seperti itu dengan kompiler C adalah mimpi buruk dan assembler melakukan hal yang sama. pekerjaan dengan cara yang fantastis.
Ada banyak lagi kasus seperti itu di mana Majelis tidak hanya disukai - tetapi merupakan satu-satunya cara.
sumber
asm lebih ramping dan umumnya jauh lebih cepat daripada C yang dicuri dengan perpustakaan dll, dan OS menangani BANYAK peristiwa sepanjang waktu. Anda ingin langsing dan cepat untuk fungsi ini.
sumber