แพตช์เวอร์ชันที่แปดสำหรับเคอร์เนล Linux ที่รองรับภาษา Rust

Miguel Ojeda ผู้เขียนโครงการ Rust-for-Linux เสนอการเปิดตัวส่วนประกอบ v8 สำหรับการพัฒนาไดรเวอร์อุปกรณ์ในภาษา Rust เพื่อให้นักพัฒนาเคอร์เนล Linux พิจารณา นี่เป็นเวอร์ชันแก้ไขของแพตช์ โดยคำนึงถึงเวอร์ชันแรก ซึ่งเผยแพร่โดยไม่มีหมายเลขเวอร์ชัน การสนับสนุน Rust ถือเป็นการทดลอง แต่ได้รวมอยู่ในสาขา linux-next แล้ว โดยอ้างว่าจะรวมเข้ากับการเปิดตัวฤดูใบไม้ร่วง 5.20/6.0 และมีความสมบูรณ์เพียงพอที่จะเริ่มทำงานในการสร้างเลเยอร์นามธรรมเหนือระบบย่อยเคอร์เนล เช่นเดียวกับการเขียนไดรเวอร์และ โมดูล การพัฒนานี้ได้รับทุนจาก Google และ ISRG (Internet Security Research Group) ซึ่งเป็นผู้ก่อตั้งโครงการ Let's Encrypt และส่งเสริม HTTPS และการพัฒนาเทคโนโลยีเพื่อปรับปรุงความปลอดภัยของอินเทอร์เน็ต

ในเวอร์ชันใหม่:

  • ชุดเครื่องมือและตัวแปรของไลบรารี alloc ที่ไม่มีสถานะ "ตื่นตระหนก" ที่เป็นไปได้เมื่อเกิดข้อผิดพลาด ได้รับการอัปเดตสำหรับการเปิดตัว Rust 1.62 เมื่อเปรียบเทียบกับเวอร์ชันที่ใช้ก่อนหน้านี้ ชุดเครื่องมือ Rust มีความเสถียรในการรองรับฟังก์ชัน const_fn_trait_bound ที่ใช้ในแพตช์เคอร์เนล
  • รหัสการผูกจะถูกแยกออกเป็น "การผูก" แพ็คเกจลังแยกต่างหาก ซึ่งช่วยให้การสร้างใหม่ง่ายขึ้นหากมีการเปลี่ยนแปลงเฉพาะกับ "เคอร์เนล" แพ็คเกจหลักเท่านั้น
  • การใช้งานมาโคร “concat_idents!” เขียนใหม่ในรูปแบบของแมโครขั้นตอนที่ไม่เชื่อมโยงกับฟังก์ชัน concat_idents และอนุญาตให้ใช้การอ้างอิงถึงตัวแปรท้องถิ่น
  • มาโคร “static_assert!” ได้รับการเขียนใหม่ ทำให้สามารถใช้ “core::assert!()” ในบริบทใดก็ได้แทนค่าคงที่
  • มาโคร "build_error!" ปรับให้ทำงานเมื่อมีการตั้งค่าโหมด "RUST_BUILD_ASSERT_{WARN,ALLOW}" สำหรับโมดูล
  • เพิ่มไฟล์แยกต่างหากด้วยการตั้งค่า “kernel/configs/rust.config”
  • ไฟล์ “*.i” ที่ประมวลผลโดยใช้การทดแทนมาโครถูกเปลี่ยนชื่อเป็น “*.rsi”
  • การสนับสนุนการสร้างส่วนประกอบ Rust ที่มีระดับการปรับให้เหมาะสมแตกต่างจากที่ใช้สำหรับโค้ด C ถูกยกเลิกแล้ว
  • เพิ่มโมดูล fs ซึ่งจัดเตรียมการเชื่อมโยงสำหรับการทำงานกับระบบไฟล์ มีตัวอย่างของระบบไฟล์ธรรมดาที่เขียนด้วยภาษา Rust ให้ไว้
  • เพิ่มโมดูล workqueue สำหรับการทำงานกับคิวของระบบ (ให้การเชื่อมโยงกับโครงสร้างเคอร์เนล work_struct และ workqueue_struct)
  • การพัฒนาโมดูล kasync ยังคงดำเนินต่อไปด้วยการใช้วิธีการเขียนโปรแกรมแบบอะซิงโครนัส (async) เพิ่มตัวอย่างของเซิร์ฟเวอร์ TCP ระดับคอร์ที่เขียนด้วยภาษา Rust
  • เพิ่มความสามารถในการจัดการการขัดจังหวะในภาษา Rust โดยใช้ประเภท [Threaded] Handler และ [Threaded] Register` types
  • เพิ่มมาโครขั้นตอน "#[vtable]" เพื่อให้ง่ายต่อการทำงานกับตารางของตัวชี้ฟังก์ชัน เช่น โครงสร้าง file_operations
  • เพิ่มการใช้งานรายการเชื่อมโยงแบบสองทิศทาง "unsafe_list::List"
  • เพิ่มการสนับสนุนเริ่มต้นสำหรับ RCU (Read-copy-update) และประเภท Guard เพื่อตรวจสอบว่าล็อคการอ่านเชื่อมโยงกับเธรดปัจจุบันหรือไม่
  • เพิ่มฟังก์ชัน Task::spawn() เพื่อสร้างและเริ่มเธรดเคอร์เนลโดยอัตโนมัติ เพิ่มเมธอด Task::wake_up() ด้วย
  • เพิ่มโมดูลการหน่วงเวลาที่ช่วยให้คุณสามารถใช้การหน่วงเวลาได้ (ตัวตัดคำเหนือ msleep())

การเปลี่ยนแปลงที่เสนอทำให้สามารถใช้ Rust เป็นภาษาที่สองในการพัฒนาไดรเวอร์และโมดูลเคอร์เนลได้ การสนับสนุน Rust จะแสดงเป็นตัวเลือกที่ไม่ได้เปิดใช้งานตามค่าเริ่มต้น และไม่ส่งผลให้มีการรวม Rust ไว้ในการขึ้นต่อกันของ build ที่จำเป็นสำหรับเคอร์เนล การใช้ Rust เพื่อพัฒนาไดรเวอร์จะช่วยให้คุณสร้างไดรเวอร์ที่ปลอดภัยและดีขึ้นได้โดยใช้ความพยายามเพียงเล็กน้อย ปราศจากปัญหาต่างๆ เช่น การเข้าถึงพื้นที่หน่วยความจำหลังจากที่ปล่อยว่างแล้ว การยกเลิกการอ้างอิงพอยน์เตอร์พอยน์เตอร์ และการโอเวอร์รันบัฟเฟอร์

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

ที่มา: opennet.ru

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