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

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

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

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

แพทช์เวอร์ชันใหม่ยังคงกำจัดความคิดเห็นที่เกิดขึ้นระหว่างการอภิปรายเกี่ยวกับแพทช์เวอร์ชันแรกและเวอร์ชันที่สอง การเปลี่ยนแปลงที่เห็นได้ชัดเจนที่สุด:

  • มีการเปลี่ยนไปใช้ Rust 1.57 รุ่นเสถียรเป็นคอมไพเลอร์อ้างอิงและมีลิงก์ไปยังภาษา Rust 2021 รุ่นเสถียร ก่อนหน้านี้แพตช์เชื่อมโยงกับสาขาเบต้าของ Rust และใช้ฟีเจอร์ภาษาบางอย่างที่ ถูกจัดอยู่ในประเภทไม่เสถียร การเปลี่ยนไปใช้ข้อกำหนด Rust 2021 ทำให้เราสามารถเริ่มงานเพื่อหลีกเลี่ยงการใช้ฟีเจอร์ที่ไม่เสถียรในแพตช์ เช่น const_fn_transmute, const_panic, const_unavailable_unchecked และ core_panic และ try_reserve
  • การพัฒนาเวอร์ชันจัดสรรของไลบรารี Rust ที่รวมอยู่ในแพตช์ยังคงดำเนินต่อไป โดยมีการแก้ไขเพื่อกำจัดฟังก์ชันการจัดสรรหน่วยความจำของการสร้างสถานะ "ตื่นตระหนก" ที่เป็นไปได้เมื่อเกิดข้อผิดพลาด เช่น หน่วยความจำไม่เพียงพอ เวอร์ชันใหม่ใช้ตัวเลือก “no_rc” และ “no_sync” เพื่อปิดใช้งานฟังก์ชันที่ไม่ได้ใช้ในโค้ด Kernel Rust ทำให้ไลบรารีเป็นแบบโมดูลาร์มากขึ้น งานยังคงดำเนินต่อไปกับนักพัฒนาการจัดสรรหลักโดยมีเป้าหมายเพื่อถ่ายโอนการเปลี่ยนแปลงที่จำเป็นสำหรับเคอร์เนลไปยังไลบรารีหลัก ตัวเลือก “no_fp_fmt_parse” ที่จำเป็นสำหรับไลบรารีในการทำงานในระดับเคอร์เนลได้ถูกย้ายไปยังไลบรารีฐาน Rust (คอร์)
  • รหัสได้รับการทำความสะอาดเพื่อกำจัดคำเตือนคอมไพเลอร์ที่เป็นไปได้เมื่อสร้างเคอร์เนลในโหมด CONFIG_WERROR เมื่อสร้างโค้ดใน Rust จะมีการเปิดใช้งานโหมดการวินิจฉัยคอมไพเลอร์เพิ่มเติมและคำเตือน Clippy linter
  • มีการเสนอบทคัดย่อเพื่อใช้ในโค้ด Rust สำหรับ seqlock (การล็อกลำดับ), การเรียกกลับสำหรับการจัดการพลังงาน, หน่วยความจำ I/O (readX/writeX), ตัวจัดการอินเทอร์รัปต์และเธรด, GPIO, การเข้าถึงอุปกรณ์ ไดรเวอร์ และข้อมูลประจำตัว
  • เครื่องมือสำหรับการพัฒนาไดรเวอร์ได้รับการขยายให้ครอบคลุมถึง mutexes ที่เปลี่ยนตำแหน่งได้ ตัววนซ้ำบิต การผูกตัวชี้แบบง่าย การวินิจฉัยข้อผิดพลาดที่ได้รับการปรับปรุง และโครงสร้างพื้นฐานที่ไม่ขึ้นอยู่กับบัสข้อมูล
  • ปรับปรุงการทำงานกับลิงก์โดยใช้ประเภทการอ้างอิงที่เรียบง่าย โดยอิงตามแบ็กเอนด์ refcount_t ซึ่งใช้เคอร์เนล API ที่มีชื่อเดียวกันในการนับการอ้างอิง การสนับสนุนประเภท Arc และ Rc ที่ให้ไว้ในไลบรารีการจัดสรรมาตรฐานได้ถูกลบออกแล้ว และไม่มีให้ใช้งานในโค้ดที่ดำเนินการในระดับเคอร์เนล (ตัวเลือกได้เตรียมไว้สำหรับไลบรารีที่ปิดใช้งานประเภทเหล่านี้)
  • แพตช์นี้รวมเวอร์ชันของไดรเวอร์ PL061 GPIO ซึ่งเขียนใหม่ด้วยภาษา Rust คุณสมบัติพิเศษของไดรเวอร์คือการใช้งานแทบจะทีละบรรทัดโดยทำซ้ำไดรเวอร์ GPIO ที่มีอยู่ในภาษา C สำหรับนักพัฒนาที่ต้องการทำความคุ้นเคยกับการสร้างไดรเวอร์ใน Rust ได้มีการเตรียมการเปรียบเทียบแบบทีละบรรทัดซึ่งช่วยให้พวกเขาเข้าใจว่าโครงสร้างใดใน Rust ที่โค้ด C จะถูกแปลงเป็น
  • โค้ดเบสหลักของ Rust ได้นำrustc_codegen_gcc ซึ่งเป็นแบ็กเอนด์สนิมสำหรับ GCC ที่ใช้การคอมไพล์ล่วงหน้า (AOT) โดยใช้ไลบรารี libgccjit ด้วยการพัฒนาแบ็กเอนด์อย่างเหมาะสม จะช่วยให้คุณรวบรวมโค้ด Rust ที่เกี่ยวข้องกับเคอร์เนลโดยใช้ GCC
  • นอกจาก ARM, Google และ Microsoft แล้ว Red Hat ยังแสดงความสนใจในการใช้ภาษา Rust ในเคอร์เนล Linux ให้เราระลึกว่า Google ให้การสนับสนุนโดยตรงสำหรับโครงการ Rust สำหรับ Linux กำลังพัฒนาการใช้งานใหม่ของกลไกการสื่อสารระหว่างกระบวนการ Binder ใน Rust และกำลังพิจารณาความเป็นไปได้ในการทำงานไดรเวอร์ต่าง ๆ ใน Rust ใหม่ Microsoft ได้เริ่มใช้ไดรเวอร์สำหรับ Hyper-V ใน Rust ARM กำลังทำงานเพื่อปรับปรุงการรองรับ Rust สำหรับระบบที่ใช้ ARM IBM ได้ใช้การสนับสนุน Rust ในเคอร์เนลสำหรับระบบ PowerPC

ที่มา: opennet.ru

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