เคอร์เนล Linux 5.12 ได้ใช้ระบบย่อย KFence เพื่อตรวจจับข้อผิดพลาดเมื่อทำงานกับหน่วยความจำ

เคอร์เนล Linux 5.12 ซึ่งอยู่ระหว่างการพัฒนา รวมถึงการใช้งานกลไก KFence (Kernel Electric Fence) ซึ่งจะตรวจสอบการจัดการหน่วยความจำ การจับบัฟเฟอร์ที่มากเกินไป การเข้าถึงหน่วยความจำหลังจากปล่อยว่าง และข้อผิดพลาดอื่นๆ ของคลาสที่คล้ายกัน

ฟังก์ชันที่คล้ายกันมีอยู่แล้วในเคอร์เนลในรูปแบบของตัวเลือกการสร้าง KASAN (เครื่องมือฆ่าเชื้อที่อยู่เคอร์เนล ใช้ Address Sanitizer ใน gcc และ clang สมัยใหม่) - อย่างไรก็ตาม ตำแหน่งดังกล่าวมีไว้เพื่อการใช้งานการดีบักเป็นหลัก ระบบย่อย KFence แตกต่างจาก KASAN ในเรื่องความเร็วในการทำงานสูง ซึ่งทำให้สามารถใช้คุณสมบัตินี้ได้แม้บนคอร์ในระบบการทำงาน

การใช้งานบนระบบที่ใช้งานจริงจะทำให้สามารถตรวจจับข้อผิดพลาดของหน่วยความจำที่ไม่ปรากฏในการทดสอบการทำงานและปรากฏเฉพาะระหว่างปริมาณงานหรือระหว่างการทำงานระยะยาวเท่านั้น (ที่มีเวลาทำงานสูง) นอกจากนี้ การใช้ KFence บนระบบการผลิตจะทำให้สามารถเพิ่มจำนวนเครื่องที่เกี่ยวข้องกับการตรวจสอบการทำงานของเคอร์เนลด้วยหน่วยความจำได้อย่างมาก

KFence บรรลุค่าใช้จ่ายที่ไม่ขึ้นอยู่กับโหลดขั้นต่ำโดยการแทรกหน้าป้องกันลงในฮีปตามช่วงเวลาที่กำหนด หลังจากช่วงเวลาการป้องกันถัดไปหมดลง KFence จะเพิ่มหน้าการป้องกันถัดไปจากกลุ่มอ็อบเจ็กต์ KFence ผ่านทางระบบการจัดสรรหน่วยความจำมาตรฐาน (ตัวจัดสรร SLAB หรือ SLUB) และเริ่มรายงานตัวนับเวลาใหม่ แต่ละวัตถุ KFence ตั้งอยู่ในหน้าหน่วยความจำแยกต่างหาก และหน้าหน่วยความจำตามขอบซ้ายและขวาจะสร้างหน้าป้องกัน ซึ่งขนาดจะถูกเลือกแบบสุ่ม

ดังนั้น เพจที่มีออบเจ็กต์จะถูกแยกออกจากกันโดยเพจการป้องกัน ซึ่งได้รับการกำหนดค่าให้สร้าง "ข้อบกพร่องของเพจ" เมื่อมีการเข้าถึงใดๆ ในการตรวจจับการเขียนนอกขอบเขตภายในหน้าออบเจ็กต์ จะมีการใช้ "โซนสีแดง" ตามรูปแบบเพิ่มเติม ซึ่งครอบครองหน่วยความจำที่ออบเจ็กต์ไม่ได้ใช้ และจะเหลืออยู่เมื่อขนาดของหน้าหน่วยความจำถูกจัดแนว —+————+————+————+————+————+— | xxxxxxxxx | โอ: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | บี: | xxxxxxxxx | :B | xxxxxxxxx | | x การ์ด x | เจ : แดง- | x การ์ด x | RED- : เจ | x การ์ด x | | xxxxxxxxx | จ: โซน | xxxxxxxxx | โซน: E | xxxxxxxxx | | xxxxxxxxx | ค: | xxxxxxxxx | :ค | xxxxxxxxx | | xxxxxxxxx | ที: | xxxxxxxxx | : ต | xxxxxxxxx | —+————+————+————+————+————+—

หากมีความพยายามในการเข้าถึงพื้นที่นอกขอบเขตบัฟเฟอร์ การดำเนินการจะส่งผลต่อหน้าการป้องกัน ซึ่งนำไปสู่การสร้าง "ข้อบกพร่องของหน้า" ซึ่งจะดักจับ KFence และบันทึกข้อมูลเกี่ยวกับปัญหาที่ระบุ ตามค่าเริ่มต้น KFence จะไม่บล็อกข้อผิดพลาดและแสดงเฉพาะคำเตือนในบันทึก แต่มีการตั้งค่า "panic_on_warn" ที่ช่วยให้คุณทำให้เคอร์เนลเข้าสู่สถานะตื่นตระหนกหากตรวจพบข้อผิดพลาด

ที่มา: opennet.ru

เพิ่มความคิดเห็น