Mengapa beberapa penanganan peristiwa sistem operasi ditulis dalam asm bukan c?

17

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?

MAKZ
sumber
5
"Sebagian besar dalam c" - dan coba tebak sisanya? ;)
goldilocks
@goldilocks baik itu dalam perakitan. Tapi mengapa, sementara bagian lain dalam c?
MAKZ
4
Saya bukan ahli dalam hal itu tetapi ada beberapa hal yang berhubungan dengan perangkat keras tingkat rendah yang tidak dapat dilakukan di C; ini biasanya arsitektur khusus. "Inline ASM" sering digunakan dalam kode C untuk tujuan itu, jadi mis. 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.
goldilocks
Bagaimana Anda mengatur register Pointer Deskriptor Global di C?
user253751

Jawaban:

24

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.

Bebas keriput
sumber
Ini sebenarnya alasan utama. Beberapa kompiler C yang disematkan memiliki ekstensi yang memungkinkan mereka untuk mengatasi register (biasanya melalui konstanta / variabel global yang telah dinyatakan sebelumnya). Mereka dapat melakukannya karena mereka hanya menargetkan satu arsitektur. Tetapi kompiler tujuan umum menargetkan terlalu banyak arsitektur yang berbeda untuk membuat ekstensi tersebut masuk akal. Jadi mereka biasanya hanya menerapkan mekanisme
penanaman
18

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 di include/asm-<arch>mana <arch>adalah nama arsitektur tertentu. Ini sebenarnya hanya sebagian kecil dari sumber kernel lengkap.

siapa saja
sumber
6

Anda tidak dapat melakukan ini di C :)

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

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.

Krishna S Santosh
sumber
-5

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.

Escoce
sumber
2
Mengoptimalkan teknologi kompiler C menjadi sangat bagus. Ini adalah mitos bahwa ASM umumnya akan jauh lebih cepat daripada C. Dalam hal apa pun itu bukan alasan bahwa operasi sistem operasi tingkat rendah menggunakan ASM. Hal ini sebagian besar berkaitan dengan operasi yang tidak dapat dinyatakan dalam C seperti hambatan memori, dan mendaftar tarian untuk non-C memanggil konvensi, dll ...
Celada