Kenapa CPU x86 Hanya Gunakan Dua Daripada Empat Rings?
Apabila mengetahui lebih lanjut mengenai bagaimana sistem pengendalian dan perkakasan yang mereka jalankan di tempat kerja dan berinteraksi antara satu sama lain, anda mungkin terkejut melihat apa yang kelihatannya menjadi keanehan atau penggunaan yang kurang dari "sumber" yang berlaku. Kenapa begitu? Siaran Q & A SuperUser hari ini mempunyai jawapan kepada soalan pembaca yang ingin tahu.
Sesi Soalan & Jawapan hari ini datang kepada kami dengan ihsan SuperUser-bahagian pembahagian Stack Exchange, kumpulan yang diketuai oleh komuniti laman web Q & A.
Photo courtesy of Lemsipmatt (Flickr).
Soalan
Pembaca SuperUser AdHominem ingin tahu mengapa CPU x86 hanya menggunakan dua daripada empat cincin:
Hanya menggunakan sistem x86 Linux dan Windows sahaja Cincin 0 untuk mod kernel dan Ring 3 untuk mod pengguna. Kenapa pemproses membezakan empat cincin berlainan jika semuanya berakhir hanya menggunakan dua daripada mereka? Adakah ini berubah dengan seni bina AMD64?
Mengapa CPU x86 hanya menggunakan dua daripada empat cincin?
Jawapan
Penyumbang SuperUser Jamie Hanrahan mempunyai jawapan untuk kami:
Terdapat dua sebab utama.
Yang pertama adalah bahawa, walaupun CPU x86 menawarkan empat cincin perlindungan ingatan, granularity perlindungan yang ditawarkan hanya pada tahap per segmen. Iaitu, setiap segmen boleh ditetapkan ke cincin tertentu (tahap keistimewaan) bersama dengan perlindungan lain seperti yang dilarang menulis. Tetapi tidak terdapat banyak deskriptor segmen yang tersedia. Kebanyakan sistem pengendalian ingin mempunyai perlindungan yang lebih halus dari memori, seperti ... untuk halaman individu.
Jadi, masukkan perlindungan berasaskan jadual halaman. Kebanyakan, jika tidak semua, sistem operasi x86 moden lebih kurang mengabaikan mekanisme segmentasi (seberapa banyak yang mereka boleh) dan bergantung pada perlindungan yang tersedia dari bit rendah pesanan dalam entri jadual halaman. Salah satu daripada ini dipanggil sedikit "istimewa". Ini sedikit mengawal sama ada atau tidak pemproses perlu berada di salah satu tahap "istimewa" untuk mengakses halaman tersebut. Tahap "istimewa" adalah PL 0, 1, dan 2. Tetapi hanya sedikit, jadi pada tahap perlindungan halaman demi halaman, bilangan "mod" yang tersedia sejauh perlindungan memori adalah hanya dua: Halaman boleh diakses dari mod yang tidak istimewa, atau tidak. Oleh itu, hanya dua cincin. Untuk mempunyai empat cincin yang mungkin bagi setiap halaman, mereka perlu mempunyai dua bit perlindungan dalam setiap entri jadual halaman untuk menyandikan satu daripada empat nombor cincin yang mungkin (sama seperti penjelasan segmen). Walau bagaimanapun, mereka tidak.
Alasan lain ialah keinginan untuk keupayaan sistem operasi. Ia bukan hanya kira-kira x86; Unix mengajar kita bahawa sistem operasi boleh menjadi mudah alih kepada pelbagai arsitektur pemproses, dan ia adalah satu perkara yang baik. Dan beberapa pemproses menyokong hanya dua cincin. Dengan tidak bergantung kepada pelbagai cincin dalam seni bina, pelaksana sistem operasi menjadikan sistem operasi lebih mudah alih.
Terdapat sebab ketiga yang khusus untuk pembangunan Windows NT. Pereka NT (David Cutler dan pasukannya, yang dilantik Microsoft dari DEC Labs Wilayah Barat) mempunyai pengalaman sebelumnya di VMS; Malah, Cutler dan beberapa yang lain adalah antara pereka asal VMS. Dan pemproses VAX yang VMS direka mempunyai empat cincin (VMS menggunakan empat cincin).
Tetapi komponen yang berlari dalam VMS Cincin 1 dan 2 (Perkhidmatan Pengurusan Rekod dan CLI, masing-masing) ditinggalkan daripada reka bentuk NT. Ring 2 dalam VMS tidak benar-benar mengenai keselamatan sistem operasi, tetapi tentang memelihara persekitaran CLI pengguna dari satu program ke yang seterusnya, dan Windows tidak mempunyai konsep itu; CLI berjalan sebagai proses biasa. Bagi VMS Ring 1, kod RMS dalam Ring 1 terpaksa memanggil Cincin 0 agak kerap, dan cincin peralihan adalah mahal. Ia ternyata jauh lebih cekap untuk pergi ke Cincin 0 dan dilakukan dengannya dan bukannya banyak Cincin 0 peralihan dalam Ring 1 kod (sekali lagi, tidak NT mempunyai apa-apa seperti RMS anyway).
Kenapa x86 melaksanakan empat cincin semasa sistem operasi tidak menggunakannya, anda bercakap mengenai sistem operasi reka bentuk yang jauh lebih baru daripada x86. Banyak ciri pengaturcaraan sistem x86 telah direka lama sebelum NT atau benar Unix-ish kernels dilaksanakan di atasnya, dan mereka tidak benar-benar tahu apa yang sistem operasi akan digunakan. Tidak sampai kami mendapat paging di x86 yang boleh kami melaksanakan benar Unix-ish atau kernel seperti VMS.
Bukan sahaja sistem operasi x86 moden mengabaikan segmentasi (mereka hanya menubuhkan segmen C, D, dan S dengan alamat asas 0 dan saiz 4 GB; Segmen F dan G kadang-kadang digunakan untuk menunjuk kepada struktur data sistem operasi utama ), mereka juga sebahagian besarnya mengabaikan perkara seperti "segmen negeri tugas". Mekanisme TSS direka dengan jelas untuk pertukaran suis thread, tetapi ternyata mempunyai terlalu banyak efek sampingan, sehingga sistem operasi x86 moden melakukannya "dengan tangan". Satu-satunya masa x86 NT mengubah tugas-tugas perkakasan adalah untuk beberapa keadaan yang benar-benar luar biasa, seperti pengecualian kesalahan ganda.
Mengenai seni bina x64, banyak ciri-ciri yang dibuang ini telah ditinggalkan. Untuk kredit mereka, AMD sebenarnya bercakap dengan pasukan kernel sistem operasi dan bertanya apa yang mereka perlukan dari x86, apa yang mereka tidak perlukan atau tidak mahu, dan apa yang mereka mahu tambah. Segmen di x64 wujud hanya dalam apa yang disebut bentuk vestigial, pertukaran tugas tugas tidak wujud, dan sebagainya, dan sistem operasi terus menggunakan hanya dua cincin.
Mempunyai sesuatu untuk menambah penjelasannya? Bunyi dalam komen. Ingin membaca lebih banyak jawapan dari pengguna Stack Exchange yang berteknologi tinggi? Lihat thread perbincangan penuh di sini.