GNU/Linux >> Belajar Linux >  >> Linux

Mengapa kernel dipetakan ke ruang alamat yang sama dengan proses?

Untuk menjawab bagian lain dari pertanyaan - kernel dipetakan ke dalam setiap ruang alamat proses sebagian untuk alasan efisiensi/kinerja (ada yang lain juga, saya yakin).

Pada sebagian besar perangkat keras modern, lebih cepat untuk mengubah tingkat keamanan (sehingga memungkinkan akses ke halaman yang dilindungi, seperti yang disebutkan dalam jawaban Alexey) untuk melakukan panggilan sistem dan fungsi lain yang disediakan kernel daripada mengubah tingkat keamanan dan seluruh peta memori virtual, bersama dengan semua flush cache TLB terkait dan semua hal lain yang terlibat dalam sakelar konteks penuh.

Karena pemanggilan sistem dapat menjadi kejadian yang cukup sering, desain yang telah berkembang di Linux dan banyak tempat lain untuk mencoba dan meminimalkan biaya penggunaan layanan kernel, dan memetakan kode kernel dan (setidaknya beberapa) data ke dalam setiap proses adalah bagiannya. itu.


Suatu proses "memiliki" seluruh ruang alamat virtual di sini, kernel dan bagian penggunanya.

Ketidakmampuannya untuk mengintip dan menyodok kode kernel dan data bukan karena ruang alamat yang berbeda, itu karena hak akses/izin yang berbeda yang diatur dalam tabel halaman. Laman kernel disiapkan sedemikian rupa sehingga aplikasi biasa tidak dapat mengaksesnya.

Namun, biasanya menyebut dua bagian dari satu hal sebagai ruang kernel dan ruang pengguna dan itu bisa membingungkan.


Bayangkan apa yang akan terjadi jika kernel tidak dipetakan di setiap ruang alamat proses. Ini akan menjadi kesalahan tiga kali lipat karena katakanlah terjadi interupsi timer, maka prosesor memanggil rutin ISR menggunakan IDT (Interrupt Descriptor Table). Jika kernel tidak dipetakan maka alamat IDT menjadi tidak valid dan dengan demikian kesalahan tiga kali lipat akan dihasilkan.


Alasan penting lainnya mengapa kami mengatakan kernel berada dalam ruang alamat proses adalah karena kernel dapat mengakses kode/data pengguna dari proses SAAT INI, yaitu ruang alamat virtual 0~3G.

Maaf tentang bahasa Inggris saya yang buruk. Saya bukan penutur asli bahasa Inggris.


Linux
  1. Mengapa Proses Pgid Anak Bukan Pid Orang Tua?

  2. Jika Proses Mewarisi Lingkungan Induk, Mengapa Kita Perlu Ekspor?

  3. Mengapa Beberapa Instance Mate-terminal Memiliki Pid yang Sama?

  1. Linux – Mengapa Ada Kebijakan Kernel Linux Untuk Tidak Pernah Melanggar Ruang Pengguna?

  2. Linux – Mengapa Kernel Tidak Dapat Menjalankan Init?

  3. Mengapa Apt Tidak Lagi Memperbarui Kernel?

  1. Apakah proses tidur mendapatkan waktu CPU yang sama?

  2. Mengapa server Linux NFS diimplementasikan dalam kernel sebagai lawan dari ruang pengguna?

  3. Mengapa tautan keras tampaknya menempati ruang yang sama dengan aslinya?