เขียนไดรเวอร์แบบง่ายด้วย Rust

  • ระบบนิเวศของภาษา Rust เติบโตขึ้นทุกวัน และเป็นภาษาเมนสตรีมเพียงภาษาเดียวที่มอบความปลอดภัยด้านหน่วยความจำและการทำงานพร้อมกันได้ตั้งแต่ขั้นตอนคอมไพล์ อีกทั้งยังมีระบบบิลด์ที่ทรงพลังและครบครันอย่าง cargo และจำนวนแพ็กเกจที่เพิ่มขึ้นเรื่อย ๆ (crates) เป็นข้อดีด้วย
  • Rust เป็นภาษาสำหรับ system programming ที่ใช้งานได้ในขอบเขตเดียวกับ C/C++ ความยืดยาวเมื่อต้องแปลงชนิดข้อมูล C มาเป็น Rust สามารถบรรเทาได้ด้วย wrapper และ macro ที่เหมาะสม
  • บทความนี้อธิบายวิธีเขียนไดรเวอร์ “Booster” ฉบับ Rust ที่แนะนำไว้ในหนังสือ Windows Kernel Programming เพื่อเปลี่ยนลำดับความสำคัญของเธรด

เริ่มต้น

  • หากต้องการเตรียมการบิลด์ไดรเวอร์ ให้ดู Windows Drivers-rs และจำเป็นต้องติดตั้ง WDK รวมถึง LLVM
  • สามารถสร้างโปรเจ็กต์ไลบรารี Rust ใหม่เพื่อเขียนไดรเวอร์ได้: cargo new --lib booster
  • ต้องเพิ่มไฟล์ build.rs เพื่อตั้งค่าให้ลิงก์ CRT แบบสแตติก

การเขียนโค้ด

  • เนื่องจากในเคอร์เนลไม่มี standard library จึงเริ่มต้นด้วย #![no_std]
  • crate wdk_sys มอบความสามารถในการทำงานร่วมกับฟังก์ชันเคอร์เนลระดับล่าง และ crate wdk มอบ wrapper ระดับสูง
  • Vec และ String ถูกกำหนดไว้ในโมดูล alloc และสามารถใช้งานได้โดยจัดเตรียม global allocator
  • DriverEntry คือจุดเริ่มต้นของไดรเวอร์เคอร์เนล Windows ทุกตัว และสามารถแสดง debug output ได้ด้วย macro println! ของ Rust

การจัดการคำขอ

  • ต้องรองรับคำขอ IRP_MJ_CREATE, IRP_MJ_CLOSE, IRP_MJ_WRITE
  • ฟังก์ชัน boost_write คือส่วนที่ทำการเปลี่ยนลำดับความสำคัญของเธรดจริง ๆ
  • ใช้โครงสร้าง ThreadData เพื่อส่งคำขอไปยังไดรเวอร์

การติดตั้งและทดสอบไดรเวอร์

  • ไฟล์ไดรเวอร์สามารถติดตั้งได้ด้วยเครื่องมือ sc.exe และโหลดเข้าสู่ระบบได้ด้วย sc start
  • สามารถทดสอบได้โดยใช้แอปพลิเคชัน C++ สื่อสารกับไดรเวอร์และส่งโครงสร้างที่ถูกต้อง

บทสรุป

  • การเขียนไดรเวอร์เคอร์เนลด้วย Rust นั้นเป็นไปได้ และคาดว่าการรองรับจะพัฒนาอย่างรวดเร็ว
  • เพื่อใช้ข้อดีของ Rust ให้ได้สูงสุด สิ่งสำคัญคือการสร้าง wrapper ที่ปลอดภัยเพื่อลดความยืดยาวของโค้ดและหลีกเลี่ยงบล็อก unsafe
  • โค้ดของบทความนี้ดูได้บน GitHub: https://github.com/zodiacon/Booster

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น