Jika saya menulis sebuah program yang mencoba membaca memori di setiap alamat yang mungkin, dan saya menjalankannya pada Unix "penuh", ia tidak akan dapat mengakses semua RAM fisik. Tetapi bagaimana sistem operasi mencegahnya?
Saya lebih akrab dengan arsitektur CPU kecil di mana setiap bagian dari kode perakitan dapat mengakses semuanya. Saya tidak mengerti bagaimana suatu program (kernel) dapat mendeteksi operasi berbahaya seperti itu.
Jawaban:
Bukan kernel yang mencegah akses memori buruk, melainkan CPU. Peran kernel hanya untuk mengkonfigurasi CPU dengan benar.
Lebih tepatnya, komponen perangkat keras yang mencegah akses memori buruk adalah MMU . Ketika sebuah program mengakses alamat memori, alamat tersebut diterjemahkan oleh CPU berdasarkan konten MMU. MMU membuat terjemahan dari alamat virtual ke alamat fisik: ketika CPU melakukan pemuatan atau penyimpanan pada alamat virtual tertentu, itu menghitung alamat fisik yang sesuai berdasarkan konten MMU. Kernel mengatur konfigurasi MMU sedemikian rupa sehingga setiap program hanya dapat mengakses memori yang menjadi haknya. Register memori dan perangkat keras program lain sama sekali tidak dipetakan dalam memori program: alamat fisik ini tidak memiliki alamat virtual yang sesuai dalam konfigurasi MMU untuk program itu.
Pada pergantian konteks antara proses yang berbeda, kernel memodifikasi konfigurasi MMU sehingga berisi terjemahan yang diinginkan untuk proses baru.
Beberapa alamat virtual tidak dipetakan sama sekali, yaitu MMU menerjemahkannya ke nilai “no address address” khusus. Ketika prosesor mereferensikan alamat yang tidak dipetakan, ini menyebabkan jebakan: prosesor bercabang ke lokasi yang telah ditentukan dalam kode kernel. Beberapa jebakan adalah sah; misalnya alamat virtual dapat sesuai dengan halaman yang ada dalam ruang swap , dalam hal ini kode kernel akan memuat konten halaman dari swap kemudian beralih kembali ke program asli sedemikian rupa sehingga instruksi akses memori dieksekusi lagi. Perangkap lain tidak sah, dalam hal ini proses menerima sinyal yang secara default membunuh program dengan segera (dan jika tidak bercabang ke pengendali sinyal dalam program: dalam hal apa pun instruksi akses memori tidak selesai).
sumber