Bagaimana OS mendeteksi pelanggaran akses memori


12

Bagaimana sistem operasi (lebih disukai Linux) tahu bahwa Anda telah mengakses lokasi memori yang tidak diizinkan?

Pertanyaan ini terinspirasi oleh petunjuk-petunjuk sialan itu! Cara saya melihatnya adalah: segala sesuatu di komputer adalah tentang kompromi antara kecepatan, keamanan, integritas, dan hal-hal semacam itu.

Saya sangat sadar akan peta memori di Linux, tetapi kedengarannya agak konyol bagi saya bahwa kernel memeriksa apakah lokasi yang Anda coba akses berada di kisaran yang valid SETIAP SAAT Anda melakukan akses. Sepertinya itu akan menghabiskan begitu banyak waktu, yang bisa dihabiskan untuk melakukan sesuatu yang lebih produktif (tapi mungkin kurang aman tanpa pengecekan!). Atau mungkin ia mengingat semua akses terakhir dan memeriksanya di setiap tick timer perangkat keras? (Tapi itu kedengarannya tidak aman, dan sekali lagi, lambat.)

Saya terkejut bahwa pertanyaan ini tampaknya tidak terjawab di mana pun. Itu adalah sesuatu yang selalu saya pikirkan. Itu membuat saya berpikir ada bagian perangkat keras yang akan melakukan ini atas nama OS, dalam tingkat abstraksi yang bagus dan nyaman. Tapi tetap saja, itu mungkin akan memerlukan memuat proses berikutnya peta memori pada setiap saklar konteks, yang lagi-lagi terdengar lambat.

Jadi ya, bagaimanapun, saya akan sedikit: bagaimana cara OS mendeteksi pelanggaran memori?

Terima kasih

Jawaban:


11

(Jawaban berikut mengasumsikan desktop, server, atau platform tertanam "modern" (seperti smartphone, dan semakin banyak sistem yang lebih kecil juga). Untuk sistem x86, modern berarti 386 dan lebih tinggi. Jawaban berikut juga mengasumsikan OS "modern", seperti hampir semua unix, atau Windows sejak 95.)

Ini tidak terjadi di OS, itu terjadi di prosesor, khususnya di MMU ( unit manajemen memori ) . MMU mendukung pengalamatan virtual, di mana bit yang membentuk pointer tidak secara langsung menunjukkan lokasi fisik dari bit dalam memori.

Dalam MMU tipikal, ketika sebuah pointer ditereferensi, MMU memecah bit menjadi dua kelompok: bit orde tinggi membentuk nomor halaman , dan bit orde rendah membuat alamat di dalam halaman. Sebagian besar mesin desktop dan server menggunakan halaman 4kB. MMU mencari nomor halaman virtual dalam tabel yang disebut TLB (itulah yang Anda sebut "peta memori proses"). TLB menunjukkan jumlah halaman fisik yang sesuai dengan halaman virtual ini. MMU kemudian mengambil data dari halaman fisik dalam memori.

Jika TLB tidak mengandung entri untuk nomor halaman virtual khusus ini, MMU memberi tahu prosesor bahwa terjadi akses yang tidak valid; ini biasanya disebut pengecualian.

Perhatikan bahwa saya belum menyebutkan OS sejauh ini. Itu karena semua operasi ini independen dari OS. OS berperan karena mengonfigurasi berbagai hal dalam dua cara:

  • OS bertanggung jawab untuk berpindah tugas. Ketika melakukannya, seperti yang Anda duga, ia menyimpan TLB saat ini dan menggantinya dengan TLB yang disimpan untuk tugas terjadwal berikutnya. Dengan begitu, setiap proses memiliki TLB, jadi alamat 0x123456dalam proses X mungkin tidak menunjuk ke tempat aktual yang sama dalam RAM seperti alamat yang sama dalam proses Y, atau mungkin hanya tidak valid. Jika suatu proses mencoba melakukan dereferensi pointer di luar ruang alamatnya, itu tidak mencapai ke ruang proses lain, melainkan mencapai tempat .

  • OS memutuskan apa yang terjadi ketika sebuah pengecualian muncul. Itu dapat menghentikan proses untuk melakukan akses memori yang tidak valid (kesalahan segmentasi, kesalahan perlindungan umum, ...). Ini juga merupakan cara di mana swapping diterapkan: penangan pengecualian mungkin memutuskan untuk mengambil beberapa data dari ruang swap, memperbarui TLB yang sesuai dan melakukan akses lagi.

Perhatikan bahwa MMU memberikan keamanan karena proses tidak dapat mengubah TLB sendiri. Hanya kernel OS yang dapat mengubah TLB. Cara kerja perubahan izin TLB berada di luar cakupan jawaban ini.


6

1) Segfault terdeteksi oleh unit manajemen memori. Saat Anda meminta memori, OS meminta Unit Manajemen Memori untuk mengambilnya dari perangkat keras. Pasti ada sesuatu yang melacak semua blok memori besar yang diberikan OS kepada Anda. Jenis OS tangan yang pergi ke MMU. Karena ia mengetahui semua memori yang diberikannya kepada Anda, ia juga dapat memberi tahu Anda ketika Anda mencoba mengakses lokasi memori yang tidak Anda peroleh dari alokasi, OS secara khusus memiliki acara untuk ini, memori yang bukan milik Anda. Akhirnya OS membunuh aplikasi Anda, memicu segfault atau setara pada OS lain.

Tidak semua OS memiliki perlindungan ini. MacOS hingga 9 tidak memiliki semua ini, meskipun MMU mendukungnya. Juga tidak menang 3.1. Win95 memiliki beberapa perlindungan, karena transisi antara tidak memiliki perlindungan dan kemudian menambahkan beberapa.

2) OS tidak tahu detail apa pun selain ini. Jika Anda memiliki pointer nyasar yang mengakses memori yang tidak pernah Anda alokasikan, ia tahu. Jika Anda memiliki satu yang masuk ke bagian lain dari aplikasi Anda, itu tidak tahu tentu saja. Ini memungkinkan Anda merusak ini. Di sinilah Anda mendapatkan tumpukan yang rusak, dengan petunjuk yang menyimpang dari aplikasi Anda menimpa bagian lain dari aplikasi Anda.

Jadi, ya, Anda dapat mengacaukan data Anda sendiri. Jika Anda memiliki pointer nyasar yang menimpa aplikasi Anda sendiri, Anda HARAP Anda menekan tumpukan Anda, karena itu mungkin akan menyebabkan pelanggaran lain ketika Anda mencoba mengembalikan tumpukan, tetapi jika Anda menekan data Anda sendiri, Anda tidak akan pernah tahu.

Anda dapat mencoba menjadi lebih ketat daripada 'tidak ada perlindungan', ada alat yang disebut Pagar Listrik ( http://perens.com/FreeSoftware/ElectricFence/ ) yang akan menipu MMU Anda untuk bekerja sedikit lebih banyak, dan menyebabkannya mendeteksi lebih banyak kesalahan.


Oke, bisakah Anda lebih spesifik tentang cara kerjanya? Seperti, bagaimana cara mengetahui proses tertentu tidak dapat mengakses lokasi tertentu? Apa yang memberitahu proses mana yang dapat diakses di mana? Bagaimana bedanya? Terima kasih
Doddy

1
@panic - cari Memory_management_unit di wikipedia dan tautan dari halaman itu. Perhatikan bahwa status proses mencakup status MMU. Anda dapat menghabiskan semester pada desain, fitur, dan integrasi MMU.
mpez0
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.