การถกเถียงล่าสุดเกี่ยวกับ Linux Syscall Support (LSS) และการใช้งาน direct syscall ในรูปแบบต่างๆ ได้จุดประเด็นการอภิปรายที่น่าสนใจในชุมชนนักพัฒนาเกี่ยวกับข้อดีและข้อเสียของการข้ามการใช้งานไลบรารีมาตรฐาน C (libc) สำหรับ system calls
เหตุผลในการใช้ Direct Syscalls
การใช้งาน direct syscall มีข้อได้เปรียบที่น่าสนใจสำหรับการใช้งานบางกรณี เช่น การลดการพึ่งพา libc ลดค่าโสหุ้ย และอาจช่วยลดพื้นที่ที่อาจถูกโจมตีได้ แนวทางนี้ถูกนำไปใช้ในโครงการใหญ่ๆ อย่าง Go และ Chrome แม้ว่าจะประสบความสำเร็จในระดับที่แตกต่างกันและพบความท้าทายที่สำคัญระหว่างทาง
การแลกเปลี่ยนระหว่างประสิทธิภาพและความซับซ้อน
แม้ว่า direct syscalls อาจดูมีประสิทธิภาพมากกว่าในตอนแรก แต่ความเป็นจริงนั้นซับซ้อนกว่า ดังที่สมาชิกในชุมชนอธิบายว่า:
เวลาไม่กี่นาโนวินาทีของการเรียกฟังก์ชันโดยตรงนั้นแทบไม่มีความสำคัญเมื่อเทียบกับเวลาสิบไมโครวินาทีของ syscall และคุณจะเสียโอกาสในการใช้การปรับแต่งประสิทธิภาพต่างๆ ที่มีใน libc ซึ่งคุณอาจไม่ได้คิดถึง (เช่น การจดจำค่า getpid())
ความท้าทายด้านความเข้ากันได้ของแพลตฟอร์ม
สิ่งสำคัญที่ต้องพิจารณาเมื่อใช้ direct syscalls คือความเข้ากันได้ของแพลตฟอร์ม ในขณะที่ Linux รักษาความเสถียรของ syscall ABI แต่ระบบปฏิบัติการอื่นๆ เช่น OpenBSD และ macOS ถือว่าอินเตอร์เฟซ syscall เป็นส่วนตัวและอาจเปลี่ยนแปลงได้ ซึ่งนำไปสู่ความท้าทายในการพัฒนาต่างๆ ดังที่เห็นได้จากประสบการณ์ของ Go ในการจัดการ syscall
ผลกระทบด้านความปลอดภัย
ผลกระทบด้านความปลอดภัยของการใช้ direct syscall นั้นซับซ้อน แม้ว่าการลดการพึ่งพาอาจช่วยลดพื้นที่ที่อาจถูกโจมตี แต่ก็อาจต้องสละฟีเจอร์ความปลอดภัยที่สำคัญ เช่น การลิงก์แบบ static สำหรับ direct syscalls มักหมายถึงการสละการป้องกันแบบ ASLR (Address Space Layout Randomization) แม้ว่าบางคนจะเถียงว่า ASLR เป็นกลไกป้องกันที่ค่อนข้างอ่อนแอต่อการโจมตีที่ซับซ้อนอยู่แล้ว
แนวทางทางเลือก
ปัจจุบัน Linux kernel มี nolibc headers เป็นทางเลือกอย่างเป็นทางการสำหรับการใช้งาน direct syscall อย่างไรก็ตาม โครงการเช่น Chrome's LSS ยังคงรองรับการใช้งานเฉพาะทางที่การใช้งานทั่วไปอาจไม่เหมาะสมสำหรับแอปพลิเคชันขนาดใหญ่
ข้อควรพิจารณาทางเทคนิค
นักพัฒนาต้องระมัดระวังเป็นพิเศษเมื่อใช้งาน direct syscalls โดยเฉพาะในเรื่อง:
- การจัดการอาร์กิวเมนต์สำหรับฟังก์ชัน vararg อย่างเหมาะสม
- ความแตกต่างของ ABI ระหว่าง kernel และ userspace
- ข้อกำหนดและข้อจำกัดเฉพาะแพลตฟอร์ม
- ความเข้ากันได้กับ kernel รุ่นเก่า
ประสบการณ์ของชุมชนชี้ให้เห็นว่าแม้การใช้งาน direct syscall จะมีประโยชน์สำหรับการใช้งานบางกรณี แต่ต้องพิจารณาข้อได้เปรียบเสียอย่างรอบคอบและต้องเข้าใจแพลตฟอร์มเป้าหมายอย่างถ่องแท้