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

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

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

  • ชุดเครื่องมือและตัวแปรของไลบรารี alloc ซึ่งเป็นอิสระจากการสร้างสถานะ "ตื่นตระหนก" ที่เป็นไปได้เมื่อมีข้อผิดพลาดเกิดขึ้น ได้รับการอัปเดตเป็นรุ่น Rust 1.60 ซึ่งทำให้การสนับสนุนโหมด "maybe_uninit_extra" ที่ใช้ในแพตช์เคอร์เนลมีความเสถียร
  • เพิ่มความสามารถในการรันการทดสอบจากเอกสารประกอบ (การทดสอบที่ใช้เป็นตัวอย่างในเอกสารประกอบ) ผ่านการแปลงเวลาคอมไพล์ของการทดสอบที่เชื่อมโยงกับเคอร์เนล API ไปเป็นการทดสอบ KUnit ที่ดำเนินการระหว่างการโหลดเคอร์เนล
  • มีการนำข้อกำหนดที่ว่าการทดสอบไม่ควรส่งผลให้เกิดคำเตือน Clippy linter เช่นเดียวกับโค้ดเคอร์เนล Rust
  • มีการเสนอการใช้งานโมดูล "net" ในเบื้องต้นพร้อมฟังก์ชันเครือข่าย รหัสสนิมมีสิทธิ์เข้าถึงโครงสร้างเครือข่ายเคอร์เนล เช่น Namespace (ขึ้นอยู่กับโครงสร้างเคอร์เนล struct net), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 ( struct sockaddr_in) และเทียบเท่า IPv6 .
  • มีการสนับสนุนเบื้องต้นสำหรับเทคนิคการเขียนโปรแกรมแบบอะซิงโครนัส (async) ซึ่งนำไปใช้ในรูปแบบของโมดูล kasync ตัวอย่างเช่น คุณสามารถเขียนโค้ดแบบอะซิงโครนัสเพื่อจัดการซ็อกเก็ต TCP: async fn echo_server(stream: TcpStream) -> Result { la mut buf = [0u8; 1024]; วนซ้ำ { ให้ n = stream.read(&mut buf).await?; ถ้า n == 0 { กลับตกลง (()); } stream.write_all(&buf[..n]).รออยู่?; } }
  • เพิ่มโมดูล net::filter สำหรับจัดการตัวกรองแพ็คเก็ตเครือข่าย เพิ่มตัวอย่างrust_netfilter.rsพร้อมการใช้งานตัวกรองในภาษาRust
  • เพิ่มการใช้งาน mutex smutex::Mutex แบบง่าย ๆ ซึ่งไม่จำเป็นต้องปักหมุด
  • เพิ่ม NoWaitLock ซึ่งไม่เคยรอการล็อค และหากถูกครอบครองโดยเธรดอื่น จะทำให้เกิดข้อผิดพลาดที่จะรายงานเมื่อพยายามรับการล็อคแทนที่จะหยุดผู้โทร
  • เพิ่ม RawSpinLock ซึ่งระบุโดย raw_spinlock_t ในเคอร์เนล เพื่อนำไปใช้กับส่วนที่ไม่สามารถไม่ได้ใช้งาน
  • เพิ่มประเภท ARef สำหรับการอ้างอิงไปยังออบเจ็กต์ที่ใช้กลไกการนับการอ้างอิง (นับใหม่เสมอ)
  • แบ็กเอนด์rustc_codegen_gcc ซึ่งอนุญาตให้คุณใช้ไลบรารี libgccjit จากโปรเจ็กต์ GCC เป็นตัวสร้างโค้ดในrustc เพื่อมอบการรองรับ Rustc สำหรับสถาปัตยกรรมและการเพิ่มประสิทธิภาพที่มีอยู่ใน GCC ได้นำความสามารถในการบูตสแตรปคอมไพเลอร์rustc มาใช้ การโปรโมตคอมไพเลอร์หมายถึงความสามารถในการใช้ตัวสร้างโค้ดที่ใช้ GCC ในrustcเพื่อสร้างคอมไพเลอร์rustcนั่นเอง นอกจากนี้ GCC 12.1 รุ่นล่าสุดยังมีการแก้ไข libgccjit ที่จำเป็นสำหรับrustc_codegen_gcc เพื่อให้ทำงานได้อย่างถูกต้อง การเตรียมการกำลังดำเนินการเพื่อให้สามารถติดตั้งrustc_codegen_gccโดยใช้ยูทิลิตี้rustup
  • ความคืบหน้าในการพัฒนา gccrs ส่วนหน้าของ GCC ด้วยการใช้งานคอมไพเลอร์ภาษา Rust ที่ใช้ GCC นั้นถูกบันทึกไว้ ขณะนี้มีนักพัฒนาเต็มเวลาสองคนที่ทำงานเกี่ยวกับ gccrs

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

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

ที่มา: opennet.ru

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