Mengapa CPU x86 hanya menggunakan 2 dari 4 dering?


13

Jadi sistem x86 berbasis Linux atau Windows hanya menggunakan ring 0 untuk mode kernel dan ring 3 untuk mode pengguna. Mengapa prosesor bahkan membedakan empat cincin berbeda jika semuanya akhirnya hanya menggunakan dua cincin saja? Dan apakah ini berubah pada arsitektur AMD64?


ngomong-ngomong, saya menyarankan agar judul pertanyaan diubah menjadi "Mengapa sistem operasi x86 hanya menggunakan 2 dari 4 dering?" atau mungkin "Mengapa hanya OS pada CPU x86 ...". CPU hanya melakukan apa yang diminta oleh OS untuk dilakukan.
Jamie Hanrahan

Jawaban:


15

Ada dua alasan utama.

Alasan pertama adalah bahwa, meskipun CPU x86 memang menawarkan empat cincin perlindungan memori, granularitas perlindungan yang ditawarkan dengan demikian hanya pada tingkat per segmen. Artinya, setiap segmen dapat diatur ke dering khusus ("tingkat hak istimewa") dari 0 hingga 3, bersama dengan perlindungan lain seperti dinonaktifkan. Tetapi tidak ada banyak deskriptor segmen yang tersedia. Sebagian besar sistem operasi ingin memiliki granularitas perlindungan memori yang jauh lebih baik. Seperti ... untuk setiap halaman.

Jadi, masukkan perlindungan berdasarkan entri tabel halaman (PTEs). Sebagian besar jika tidak semua sistem operasi x86 modern sedikit banyak mengabaikan mekanisme segmentasi (sebisa mungkin, tetap saja) dan mengandalkan perlindungan berbasis PTE. Ini ditentukan oleh flag bit yang merupakan 12 bit lebih rendah di setiap PTE - plus bit 63 pada CPU yang mendukung no-execute. Ada satu PTE untuk setiap halaman, yang biasanya 4K.

Salah satu bit bendera tersebut disebut bit "istimewa". Bit ini mengontrol apakah prosesor harus berada di level "istimewa" untuk mengakses halaman. Level "istimewa" adalah PL 0, 1, dan 2. Tapi itu hanya satu bit, jadi pada level proteksi halaman demi halaman jumlah "mode" yang tersedia sejauh menyangkut perlindungan memori hanyalah dua: Satu halaman dapat diakses dari mode non-privilege, atau tidak. Karenanya hanya dua dering.

Untuk memiliki empat dering yang mungkin untuk setiap halaman, mereka harus memiliki dua bit perlindungan di setiap entri tabel halaman, untuk menyandikan salah satu dari empat nomor dering yang mungkin (seperti halnya deskriptor segmen). Mereka tidak melakukannya.

Alasan kedua adalah tujuan portabilitas OS. Ini bukan hanya tentang x86; Unix mengajarkan kepada kita bahwa sebuah OS bisa menjadi relatif portabel untuk beberapa arsitektur prosesor, dan itu adalah hal yang baik. Dan beberapa prosesor hanya mendukung dua dering. Dengan tidak bergantung pada beberapa cincin dalam arsitektur, pelaksana OS membuat OS lebih portabel.

Ada alasan ketiga yang khusus untuk pengembangan Windows NT. Desainer NT (David Cutler dan timnya, yang disewa oleh Microsoft dari DEC Western Region Labs) memiliki pengalaman luas sebelumnya tentang VMS; pada kenyataannya, Cutler dan beberapa yang lain adalah di antara desainer asli VMS. Dan prosesor VAX yang dirancang VMS (dan sebaliknya) memang memiliki empat dering. VMS menggunakan empat dering. (Sebenarnya VAX memiliki empat bit perlindungan di PTE, memungkinkan kombinasi seperti "read-only from mode pengguna, tetapi dapat ditulis dari ring 2 dan inner." Tapi saya ngelantur.)

Tetapi komponen yang berjalan di ring VMS 1 dan 2 (Record Management Services dan CLI, resp.) Ditinggalkan dari desain NT. Ring 2 di VMS benar-benar bukan tentang keamanan OS melainkan tentang menjaga lingkungan CLI pengguna dari satu program ke program berikutnya, dan Windows NT tidak memiliki konsep itu; CLI berjalan sebagai proses biasa. Sedangkan untuk ring 1 VMS, kode RMS di ring 1 harus cukup sering memanggil ke ring 0, dan transisi ring mahal. Ternyata jauh lebih efisien untuk hanya pergi ke dering 0 dan selesai dengan itu daripada memiliki banyak transisi ring 0 dalam kode ring 1. (Lagi - bukan berarti NT memiliki sesuatu seperti RMS.)

Tapi mengapa mereka ada di sana? Adapun mengapa x86 menerapkan empat dering sementara OS tidak menggunakannya - Anda berbicara tentang OS dengan desain yang jauh lebih baru daripada x86. Banyak fitur "pemrograman sistem" dari x86 dirancang jauh sebelum NT atau kernel Unix-ish yang sebenarnya diimplementasikan di dalamnya, dan mereka tidak benar-benar tahu apa yang akan digunakan OS. (Itu tidak sampai kita mendapatkan halaman pada x86 - yang tidak muncul sampai 80386 - bahwa kita dapat mengimplementasikan kernel Unix-ish atau VMS seperti benar tanpa memikirkan kembali manajemen memori dari bawah ke atas.)

OS x86 modern tidak hanya mengabaikan segmentasi (mereka hanya mengatur segmen C, D, dan S dengan alamat dasar 0 dan ukuran 4 GB; segmen F dan G kadang-kadang digunakan untuk menunjuk ke struktur data OS utama), mereka juga sebagian besar mengabaikan hal-hal seperti "segmen tugas negara". Mekanisme TSS jelas dirancang untuk switching konteks konteks tetapi ternyata memiliki terlalu banyak efek samping, sehingga OS x86 modern melakukannya "dengan tangan". Satu-satunya waktu x86 NT mengubah tugas perangkat keras, misalnya, adalah untuk beberapa kondisi yang benar-benar luar biasa, seperti pengecualian kesalahan ganda.

Kembali x64, banyak fitur yang tidak digunakan ditinggalkan. (Untuk kredit mereka, AMD benar-benar berbicara dengan tim kernel OS dan bertanya apa yang mereka butuhkan dari x86, apa yang tidak mereka butuhkan atau tidak inginkan, dan apa yang ingin mereka tambahkan.) Segmen pada x64 hanya ada dalam apa yang mungkin disebut bentuk vestigial, pengalihan status tugas tidak ada, dll. Dan OS terus menggunakan hanya dua dering.


1
Terima kasih! (Jika Anda tidak tahu, saya menghabiskan lebih dari sedikit waktu di sekitar kernel VMS ...)
Jamie Hanrahan

Ya, saya mendapat kesan ini ... :-) Saya suka ketika seseorang seperti Anda dengan pengetahuan mendalam tentang sesuatu menulis jawaban semacam ini, itulah sejarah TI, dan saya senang mengetahuinya. Jawaban Anda mengingat saya ketika saya masih seorang pria di sekolah, 20 tahun yang lalu, dan saya membeli "manual referensi programmer Intel 80268" dan kemudian manual referensi 386. Saya membaca banyak tentang cincin perlindungan ... tetapi tidak pernah benar-benar melakukan sesuatu dengan mereka. Hanya beberapa pemrograman assembler x86 sederhana ... kemudian Turbo Pascal, lalu C / C ++, Java ... dan akhirnya .Net selama 13 tahun terakhir :-)
Maks.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.