ใน Linux อย่างน้อยกลไกการโทรของระบบจะทำงานภายใต้สถาปัตยกรรมส่วนใหญ่โดยการวางข้อมูลที่จัดรูปแบบเฉพาะบางอย่าง
ปัญหาเกิดขึ้นจริง ๆ แล้วบังคับให้ CPU ทำการสลับเข้าไปในพื้นที่ของเคอร์เนลเพื่อให้สามารถเรียกใช้รหัสเคอร์เนลที่มีสิทธิพิเศษในการให้บริการการโทร สิ่งนี้ทำได้โดยการบังคับให้เกิดความผิดพลาดบางอย่าง (ความผิดพลาดจะถูกหารด้วย 0, โอเวอร์โฟลว์ที่ไม่ได้กำหนดหรือ segfault, ฯลฯ ) สิ่งนี้บังคับให้เคอร์เนลประมวลผลเพื่อจัดการข้อผิดพลาด
โดยปกติเคอร์เนลจะจัดการกับข้อผิดพลาดโดยการฆ่ากระบวนการที่เป็นสาเหตุหรือเรียกใช้ตัวจัดการที่ผู้ใช้ระบุ อย่างไรก็ตามในกรณีของ syscall มันจะทำการตรวจสอบรีจิสเตอร์และตำแหน่งหน่วยความจำที่กำหนดไว้ล่วงหน้าแทนและหากมีการร้องขอ syscall ก็จะเรียกใช้โดยใช้ข้อมูลที่ได้รับจากกระบวนการผู้ใช้ในโครงสร้างหน่วยความจำ สิ่งนี้มักจะต้องทำด้วยชุดประกอบที่ทำขึ้นด้วยมือบางอย่างและเพื่อความสะดวกในการใช้ syscall สำหรับผู้ใช้ไลบรารี C ของระบบจะต้องห่อเป็นฟังก์ชัน สำหรับอินเทอร์เฟซระดับต่ำกว่าโปรดดูhttp://man7.org/linux/man-pages/man2/syscall.2.htmlสำหรับข้อมูลบางอย่างเกี่ยวกับวิธีการทำงานของ syscalls และวิธีการเรียกใช้โดยไม่ใช้ตัวคลุม C
สิ่งนี้ได้รับการทำให้เข้าใจผิดมากเกินไปมันไม่เป็นความจริงในสถาปัตยกรรมทั้งหมด (mips มีคำสั่ง syscall พิเศษ) และไม่จำเป็นต้องทำงานเหมือนกันในทุกระบบปฏิบัติการ ยังถ้าคุณมีความคิดเห็นหรือคำถามกรุณาถาม
แก้ไข: หมายเหตุเกี่ยวกับความคิดเห็นของคุณเกี่ยวกับสิ่งต่าง ๆ ใน / dev / นี่เป็นอินเทอร์เฟซระดับที่สูงขึ้นกับเคอร์เนลไม่ใช่อันที่ต่ำกว่า อุปกรณ์เหล่านี้ใช้ syscalls (ประมาณ) 4 อันภายใต้ การเขียนถึงพวกเขาเหมือนกับการเขียน syscall การอ่านการอ่าน syscall เปิด / ปิดพวกเขาเทียบเท่ากับการเปิดและปิด syscalls และการเรียกใช้ ioctl ทำให้ ioctl พิเศษ iyscal ซึ่งในตัวเองเป็นอินเตอร์เฟซในการเข้าถึงหนึ่งใน ioctl หลายระบบ การโทร (พิเศษโดยปกติจะเป็นการโทรเฉพาะอุปกรณ์ที่มีการใช้งานแคบเกินไปที่จะเขียน syscall ทั้งหมดสำหรับพวกเขา)