Kernel Linux 5.12 telah mengadopsi subsistem KFence untuk mendeteksi kesalahan saat bekerja dengan memori

Kernel Linux 5.12, yang sedang dalam pengembangan, mencakup implementasi mekanisme KFence (Kernel Electric Fence), yang memeriksa penanganan memori, menangkap buffer overrun, akses memori setelah pembebasan, dan kesalahan lain dari kelas serupa.

Fungsi serupa sudah ada di kernel dalam bentuk opsi build KASAN (pembersih alamat kernel, menggunakan Address Sanitizer di gcc dan dentang modern) - namun, ini diposisikan terutama untuk penggunaan debugging. Subsistem KFence berbeda dari KASAN dalam kecepatan operasinya yang tinggi, yang memungkinkan untuk menggunakan fitur ini bahkan pada inti dalam sistem yang berfungsi.

Aplikasi pada sistem produksi akan memungkinkan untuk menangkap kesalahan memori yang tidak muncul saat pengujian dijalankan dan hanya muncul selama beban kerja atau selama operasi jangka panjang (dengan uptime yang besar). Selain itu, penggunaan KFence pada sistem produksi akan meningkatkan jumlah mesin secara signifikan yang terlibat dalam memeriksa pengoperasian kernel dengan memori.

KFence mencapai overhead minimal yang tidak bergantung pada beban dengan memasukkan halaman penjaga ke dalam heap pada interval tetap. Setelah interval perlindungan berikutnya berakhir, KFence, melalui sistem alokasi memori standar (SLAB atau pengalokasi SLUB), menambahkan halaman perlindungan berikutnya dari kumpulan objek KFence, dan memulai laporan penghitung waktu baru. Setiap objek KFence terletak di halaman memori terpisah, dan halaman memori di sepanjang batas kiri dan kanan membentuk halaman penjaga, yang ukurannya dipilih secara acak.

Dengan demikian, halaman dengan objek dipisahkan satu sama lain oleh halaman perlindungan, yang dikonfigurasi untuk menghasilkan “kesalahan halaman” pada akses apa pun. Untuk mendeteksi penulisan di luar batas di dalam halaman objek, “zona merah” berbasis pola juga digunakan, yang menempati memori yang tidak digunakan oleh objek, tersisa ketika ukuran halaman memori disejajarkan. ______+---+---+---+---------------------------------- | xxxxxxxxx | HAI: | xxxxxxxxx | :HAI | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x PENJAGA x | J : MERAH- | x PENJAGA x | MERAH- : J | x PENJAGA x | | xxxxxxxxx | E: ZONA | xxxxxxxxx | ZONA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | ----------------------------------------------------------------

Jika ada upaya untuk mengakses area di luar batas buffer, operasi tersebut akan memengaruhi halaman perlindungan, yang menyebabkan timbulnya “kesalahan halaman”, yang memotong KFence dan mencatat informasi tentang masalah yang terdeteksi. Secara default, KFence tidak memblokir kesalahan dan hanya menampilkan peringatan di log, tetapi ada pengaturan “panic_on_warn” yang memungkinkan Anda membuat kernel dalam keadaan panik jika kesalahan terdeteksi.

Sumber: opennet.ru

Tambah komentar