11 คะแนน โดย GN⁺ 2025-02-21 | 24 ความคิดเห็น | แชร์ทาง WhatsApp

เหตุผลที่ควรนำ Rust เข้าสู่ลินุกซ์เคอร์เนล

  • จากประสบการณ์ที่ได้ตรวจดูการแก้บั๊กและปัญหาความปลอดภัยของลินุกซ์เคอร์เนลเกือบทั้งหมดตลอด 15 ปีที่ผ่านมา จึงอยากอธิบายถึงความจำเป็นของการนำ Rust มาใช้
  • ไม่ใช่ทุกการแก้บั๊กจะถูกนำเข้าไปยัง stable tree แต่โดยทั่วไปสิ่งที่สำคัญมักจะถูกนำเข้า และฉันอยู่ในบทบาทที่ต้องตรวจสอบ CVE ของเคอร์เนลทั้งหมด

ข้อจำกัดของ C และข้อดีของ Rust

  • บั๊กส่วนใหญ่ที่เกิดขึ้นในลินุกซ์เคอร์เนลมีที่มาจาก ข้อจำกัดเชิงโครงสร้างของภาษา C
  • โดยเฉพาะอย่างยิ่ง มีบั๊กจำนวนมากที่เกิดจาก ความผิดพลาดเล็กน้อยของมนุษย์ และปัญหาเหล่านี้แทบไม่เกิดขึ้นใน Rust
    • การเขียนทับหน่วยความจำ (Rust ไม่ได้จับได้ทุกกรณี แต่ช่วยแก้ได้อย่างมาก)
    • ปัญหาการจัดการเส้นทางข้อผิดพลาด
    • การลืมตรวจสอบค่าข้อผิดพลาด
    • บั๊ก use-after-free (ใช้งานหลังจากถูกคืนหน่วยความจำแล้ว)
  • หากนำ Rust มาใช้ในเคอร์เนล นักพัฒนาและผู้ดูแลจะสามารถ หลุดพ้นจากความผิดพลาดพื้นฐานเหล่านี้ และไปโฟกัสกับปัญหาที่ยากจริง ๆ เช่น logical error, race condition เป็นต้น

ฐานโค้ด C เดิมยังคงต้องดูแลต่อไป

  • ปัจจุบันลินุกซ์เคอร์เนลประกอบด้วย โค้ด C มากกว่า 30 ล้านบรรทัด และเป็นไปไม่ได้ที่จะเปลี่ยนทั้งหมดเป็น Rust ในระยะเวลาอันสั้น
  • ดังนั้น งาน เสริมความปลอดภัยให้โค้ด C ที่นักพัฒนาอย่าง Kees และ Gustavo กำลังทำอยู่จึงเป็นสิ่งจำเป็นและต้องดำเนินต่อไป
  • แนวทางที่เหมาะสมไม่ใช่การให้ Rust มาแทนที่โค้ดเดิมทั้งหมด แต่คือ การเขียนโค้ดใหม่ (โดยเฉพาะไดรเวอร์) ด้วย Rust เพื่อลดปัญหา

ความปลอดภัยของ API ที่ Rust มอบให้

  • Rust ช่วยให้สามารถออกแบบ API ภายในเคอร์เนลให้ ปลอดภัยกว่าและใช้งานได้ง่ายกว่าเดิม
  • ปัจจุบัน API ของเคอร์เนลที่อิงกับ C นั้น ซับซ้อน ผิดพลาดได้ง่าย และหลายครั้งผู้ดูแลต้องตรวจทานอย่างละเอียดมาก
  • ตัวอย่างเช่น มีหลายวิธีในการใช้งานโครงสร้างอย่าง struct cdev อย่างปลอดภัย และการใช้งานให้ถูกต้องต้องอาศัยประสบการณ์สูง
  • เมื่อใช้ Rust จะสามารถนิยาม API ให้ชัดเจนขึ้น ทำให้ ลดโอกาสที่นักพัฒนาจะทำผิดพลาดได้อย่างมาก
  • นี่ไม่ได้เป็นประโยชน์เฉพาะกับผู้ใช้ Rust เท่านั้น แต่ยังเป็น การเปลี่ยนแปลงที่ช่วยผู้ใช้โค้ด C เดิมด้วย

ข้อโต้แย้งต่อความกังวลว่าการนำ Rust มาใช้จะเป็นเรื่องยาก

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

บทสรุป

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

เราต้องเปิดรับเทคโนโลยีและแนวคิดใหม่ ๆ และพยายามทำให้มันประสบความสำเร็จร่วมกับคอมมูนิตี้

24 ความคิดเห็น

 
bus710 2025-02-23

การนำ Rust มาใช้น่าจะเป็นการเปลี่ยนแปลงที่หลีกเลี่ยงได้ยากเมื่อคำนึงถึง memory safety ครับ คิดว่าอาจจะพยายามประสานรอยร้าวกันใหม่ผ่านทางออกแบบประนีประนอมที่เหมาะสมสักอย่าง

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

ถึงอย่างนั้น ก็เป็นความจริงอีกเหมือนกันว่าผลงานที่เขียนด้วย Rust มักก่อปัญหาในงานจริงน้อยกว่า.....

 
lostid 2025-02-22

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

 
pcpenpal 2025-02-22

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

Rust มีประโยชน์อยู่แล้ว และการพยายามถูกรวมเข้าไปในเคอร์เนลก็คงไม่ใช่เพื่อพิสูจน์ว่ามันมีประโยชน์

 
aer0700 2025-02-22

ตอนที่ตัดสินใจจะเริ่มนำ rust มาใช้ครั้งแรก ก็น่าจะมีการถกเถียงกันอยู่บ้าง
ถ้าลองคิดดูว่าระหว่างคนที่ชำนาญ C กับคนที่ชำนาญ rust ฝั่งไหนมีจำนวนมากกว่ากัน ก็คงต้องบอกว่า C ทิ้งห่างแบบขาดลอย
แต่ถ้าเป็นโปรแกรมเมอร์ที่มีความรู้โดเมนพร้อมอยู่แล้ว การเรียนภาษาเพิ่มอีกสักภาษาหนึ่งจะเป็นเรื่องใหญ่อะไรไหม ก็อดคิดแบบนั้นไม่ได้
แต่ระดับความชำนาญที่คนทำเคอร์เนลต้องการ ก็คงเป็นอีกเรื่องหนึ่งอยู่ดี...

 
roxie 2025-02-22

ความเห็นนี้ก็ดีนะ

 
nemo1275 2025-02-21

ผมไม่เข้าใจเลยจริง ๆ ว่าทำไมถึงมีการเรียกร้องให้ฟอร์กแล้วออกไป แล้วทำไมกันล่ะที่จู่ ๆ ลินุสต้องฟอร์กออกจากลินุกซ์แล้วไป?

 
regentag 2025-02-22

มีใครไล่ให้ Linus แยก fork ออกไปไหมครับ? เหมือนผมจะไม่เคยเห็นใครพูดแบบนั้นในการถกเถียงนี้เลย..

 
cloverhearts 2025-02-21

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

 
aer0700 2025-02-21

ผมไม่ค่อยรู้เรื่องเคอร์เนลเท่าไร แต่ถ้าสามารถแปลโค้ด C เป็น Rust แบบอัตโนมัติได้ก็น่าจะดีนะครับ แน่นอนว่านอกจากปัญหาเรื่องการแปลโค้ดแล้ว ก็คงมีปัญหาเรื่องคนด้วยเหมือนกันครับ

 
regentag 2025-02-21

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

 
gurugio 2025-02-21

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

 
regentag 2025-02-21

ไม่เคยพัฒนาฝั่งลินุกซ์มาก่อนครับ
ดูเหมือนว่า Rust wrapper ของไดรเวอร์อุปกรณ์จะเป็นโครงสร้างที่แยกออกจากเคอร์เนลไม่ได้สินะ...

 
mammal 2025-02-21

น่าขันจริงๆ ที่ชุมชนลินุกซ์ซึ่งเคยใช้เหตุผลเรื่องเสถียรภาพของเคอร์เนลมาอ้างความชอบธรรมให้กับการใช้ถ้อยคำเป็นพิษ ตอนนี้กลับมองว่าคำตอบอย่าง 'ถ้าไม่ชอบก็ไปฟอร์กเองสิ' เป็นคำตอบที่สมเหตุสมผล

 
regentag 2025-02-21

ผมไม่ใช่ชุมชนลินุกซ์ แต่...

 
roxie 2025-02-21

ฉันไม่คิดว่าควรมองคนเหล่านั้นกับผู้เขียนคอมเมนต์นี้ว่าเป็นชุมชนเดียวกัน

 
jeiea 2025-02-21

ดูเหมือนว่าจะคาดเดาได้ยากว่าผลลัพธ์จากการ fork จะกลายเป็นการย้ายระบบหรือจะกลายเป็นยุคชุนชิวจ้านกั๋วกันแน่
แม้หลังจาก fork แล้ว การตามอัปเดตการเปลี่ยนแปลงจาก upstream ต่อก็คงไม่ใช่สถานการณ์ที่น่ารื่นรมย์นัก

 
savvykang 2025-02-21

https://th.news.hada.io/topic?id=16860
เมื่อเห็นว่าฟอร์กของ Realtime Linux ใช้เวลาถึง 20 ปีจึงถูกรวมกลับเข้าไป ก็น่าจะต้องตัดสินใจเรื่องการฟอร์กกันอย่างรอบคอบไม่ใช่หรือ

 
regentag 2025-02-21

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

 
ilsubyeega 2025-02-21

แม้ฉันจะเป็นผู้ใช้ Rust แต่คอมเมนต์ของ hgwxx7_ ที่โพสต์ใน r/rust1 น่าประทับใจมาก

ผมคิดว่าสิ่งที่ Greg ทำได้ดีมากในที่นี้คือการแสดงภาวะผู้นำทางเทคนิค ภาวะผู้นำไม่ได้หมายความว่าต้องเป็นฝ่ายถูก เขาถูกก็จริง แต่นั่นไม่ใช่ประเด็น

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

จากนั้นเขาก็ปิดท้ายด้วยน้ำเสียงที่สร้างแรงบันดาลใจ โดยชี้ให้เห็นว่าพวกเขาเคยทำเรื่องที่ยากกว่านี้มาแล้ว และนี่ก็อยู่ในขีดความสามารถของพวกเขาอย่างสบาย ๆ เขาค่อย ๆ ผลักดันให้พวกเขาต้อนรับนักพัฒนา R4L

เป็นบทเรียนชั้นครูเรื่องภาวะผู้นำอย่างแท้จริง
ผมไม่รู้ว่าผู้ดูแลคนอื่น ๆ จะถูกโน้มน้าวเมื่อได้อ่านข้อความนี้หรือไม่ แต่สำหรับผม มันยากที่จะจินตนาการถึงการนำเสนอที่น่าโน้มน้าวได้มากกว่านี้

 
gurugio 2025-02-21

จำได้ว่าพอมีเรื่องที่ต้องแบ็กพอร์ตไปยังเวอร์ชัน stable หรือต้องติดต่อไป เขาก็ตอบกลับมาได้ดีแม้จะยุ่งมากก็ตาม

 
codemasterkimc 2025-02-21

"Rust ไม่ใช่คำตอบที่ถูกต้องเสมอไป แต่ก็ใกล้เคียงกับคำตอบมากกว่า Java และ Python" -codemaster kimc-

 
GN⁺ 2025-02-21
ความคิดเห็นจาก Hacker News
  • ถ้ามี Rust bindings ก็อาจทำให้ internal ABI ของเคอร์เนลไม่สามารถพัฒนาเปลี่ยนแปลงได้อย่างอิสระ และเสี่ยงที่โปรเจ็กต์จะแยกเป็นฝั่งแกนกลาง C กับฝั่ง Rust อย่างไรก็ตาม หาก internal API ถูกทำให้เสถียร ก็อาจเป็นประโยชน์ต่อ Linux
  • ปัญหาหลักคือชุมชนและผู้คน ถ้าคนที่ทำงานกับเคอร์เนลอยู่ตอนนี้ไม่ชอบทิศทางนี้ ก็ถือเป็นปัญหาใหญ่
  • ดูเหมือนว่าฝั่งผู้นำของ Linux จะไม่ได้โฟกัสที่ปัญหาเรื่องคน จึงมีคำถามว่า หลักฐานที่แสดงว่านักพัฒนาเคอร์เนลในปัจจุบันเห็นด้วยกับทิศทางนี้อยู่ตรงไหน
  • มีคนที่คิดว่าความเจ็บปวดจากการรับ Rust เข้ามานั้นมากกว่าประโยชน์ที่ได้ และมองว่าน่าจะได้ประโยชน์เหล่านั้นด้วยวิธีอื่น
    • ตัวอย่างเช่น การตรวจสอบขอบเขตและการทำให้การจัดสรร/คืนหน่วยความจำแบบง่าย ๆ อย่าง RAII ง่ายขึ้น อาจทำได้โดยไม่ต้องใช้ Rust
    • ถ้ากำหนดให้ Clang เป็นคอมไพเลอร์บังคับและนำส่วนขยายเหล่านี้มาใช้ ก็อาจได้ผลลัพธ์ง่ายกว่า
  • ถ้าเขียนโค้ด/ไดรเวอร์ใหม่ด้วย Rust ก็จะไม่เกิดบั๊กประเภทนี้ ซึ่งเป็นผลดีต่อทุกคน
  • คนส่วนใหญ่ต้องการ memory safety แต่ไม่ได้อยากเป็นผู้ดูแลภาพรวมทั้งหมด
  • เป้าหมายที่แท้จริงของโปรเจ็กต์คือการทำให้พื้นผิว internal kernel API ทันสมัยขึ้น และความสามารถในการเขียน API นี้ด้วย Rust ได้มากน้อยแค่ไหนคือมาตรวัดความคืบหน้าที่ดีที่สุด
  • ในฐานะคนที่เห็นการแก้บั๊กเคอร์เนลและปัญหาด้านความปลอดภัยแทบทั้งหมดตลอด 15 ปีที่ผ่านมา บั๊กส่วนใหญ่มักเกิดจาก corner case เล็ก ๆ ของ C ซึ่งปัญหาเหล่านี้หายไปใน Rust
  • ถ้าเขียนโค้ด/ไดรเวอร์ใหม่ด้วย Rust ก็จะไม่เกิดบั๊กประเภทนี้ และ C++ ไม่ได้ให้ข้อดีแบบเดียวกันนี้
  • Rust ทำให้การนิยาม kernel API เกิดข้อผิดพลาดได้แทบเป็นไปไม่ได้ ซึ่งทำให้ Linux ดีขึ้นโดยรวม
  • Rust bindings ดูเหมือนเวทมนตร์ แต่ก็ยินดีที่จะเรียนรู้และร่วมมือกับนักพัฒนา
  • Rust ไม่ใช่กระสุนเงินที่แก้ได้ทุกปัญหา แต่ช่วยได้มากในหลายส่วน
  • Linux คือเครื่องมือที่ทุกคนใช้เพื่อแก้ปัญหา จึงอยากให้นักพัฒนาไม่ต้องเจอบั๊กแบบนี้เวลาที่เขียนโค้ดสำหรับฮาร์ดแวร์
  • โค้ดเบสหลายภาษาดูแลรักษายาก แต่เราคือนักพัฒนาเคอร์เนล เราควรยอมรับไอเดียใหม่ ๆ และพยายามทำให้สำเร็จร่วมกัน
  • จำเป็นต้องมีถ้อยแถลงนี้เพื่อผลักดันให้การถกเถียงเดินหน้าต่อไป
  • แม้จะโฟกัสที่ข้อดีทางเทคนิค แต่ก็ยังประเมินความพยายามในการเรียนรู้ภาษาโปรแกรม/toolchain ใหม่ไม่เพียงพอ
  • การเชี่ยวชาญภาษาโปรแกรมใหม่ไม่ใช่เรื่องง่าย และผู้ดูแลบางคนอาจไม่ต้องการเพราะความสนใจหรือแรงจูงใจส่วนตัว
  • ปัญหาของคณะกรรมการภาษา C++ ชี้ให้เห็นว่าทุกคนควรเลิกใช้ภาษานั้นให้เร็วที่สุดเท่าที่จะทำได้
 
hbahk42 2025-02-22

คอมเมนต์ที่เต็มไปด้วยความเกลียดชังแบบนี้ รายงานไม่ได้เหรอ?

 
kodingwarrior 2025-02-22

เห็นด้วยครับ