Kernel Linux 5.12 telah menggunakan subsistem KFence untuk mengesan ralat apabila bekerja dengan memori

Kernel Linux 5.12, yang sedang dibangunkan, termasuk pelaksanaan mekanisme KFence (Pagar Elektrik Kernel), yang menyemak pengendalian memori, menangkap kelebihan penimbal, akses memori selepas dibebaskan dan ralat lain kelas yang serupa.

Kefungsian serupa telah pun wujud dalam kernel dalam bentuk pilihan binaan KASAN (pembersih alamat kernel, menggunakan Pembersih Alamat dalam gcc dan denting moden) - walau bagaimanapun, ia diletakkan terutamanya untuk kegunaan penyahpepijatan. Subsistem KFence berbeza daripada KASAN dalam kelajuan operasinya yang tinggi, yang memungkinkan untuk menggunakan ciri ini walaupun pada teras dalam sistem kerja.

Aplikasi pada sistem pengeluaran akan memungkinkan untuk menangkap ralat memori yang tidak muncul dalam ujian berjalan dan hanya muncul semasa beban kerja atau semasa operasi jangka panjang (dengan masa operasi yang besar). Di samping itu, penggunaan KFence pada sistem pengeluaran akan memungkinkan untuk meningkatkan dengan ketara bilangan mesin yang terlibat dalam memeriksa operasi kernel dengan memori.

KFence mencapai overhed bebas beban minimum dengan memasukkan halaman pengawal ke dalam timbunan pada selang masa yang tetap. Selepas selang perlindungan seterusnya tamat, KFence, melalui sistem peruntukan memori standard (SLAB atau pengalokasi SLUB), menambah halaman perlindungan seterusnya daripada kumpulan objek KFence dan memulakan laporan kaunter masa baharu. Setiap objek KFence terletak dalam halaman memori yang berasingan, dan halaman memori di sepanjang sempadan kiri dan kanan membentuk halaman pengawal, saiznya dipilih secara rawak.

Oleh itu, halaman dengan objek dipisahkan antara satu sama lain oleh halaman perlindungan, yang dikonfigurasikan untuk menjana "kesalahan halaman" pada sebarang akses. Untuk mengesan tulisan di luar sempadan di dalam halaman objek, "zon merah" berasaskan corak juga digunakan, yang menduduki memori yang tidak digunakan oleh objek, kekal apabila saiz halaman memori diselaraskan. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x PENGAWAL x | J : MERAH- | x PENGAWAL x | MERAH- : J | x PENGAWAL x | | xxxxxxxxx | E: ZON | xxxxxxxxx | ZON: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Jika percubaan dibuat untuk mengakses kawasan di luar sempadan penimbal, operasi menjejaskan halaman perlindungan, yang membawa kepada penjanaan "kesalahan halaman", yang memintas KFence dan mencatat maklumat tentang masalah yang dikesan. Secara lalai, KFence tidak menyekat ralat dan hanya memaparkan amaran dalam log, tetapi terdapat tetapan "panic_on_warn" yang membolehkan anda meletakkan kernel ke dalam keadaan panik jika ralat dikesan.

Sumber: opennet.ru

Tambah komen