เขียนไดรเวอร์แบบง่ายด้วย 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
ยังไม่มีความคิดเห็น