ระบบเรียก

จากวิกิพีเดีย สารานุกรมเสรี
ข้ามไปที่การนำทาง ข้ามไปที่การค้นหา

ภาพรวมระดับสูงของอินเทอร์เฟซการเรียกระบบของเคอร์เนล Linux ซึ่งจัดการการสื่อสารระหว่างส่วนประกอบต่างๆ และuserspace

ใน การ คำนวณการเรียกระบบ (เรียกโดยทั่วไปว่าsyscall ) เป็นวิธีการทางโปรแกรมที่โปรแกรมคอมพิวเตอร์ร้องขอบริการจากเคอร์เนลของระบบปฏิบัติการที่ดำเนินการ ซึ่งอาจรวมถึงบริการที่เกี่ยวข้องกับฮาร์ดแวร์ (เช่น การเข้าถึงฮาร์ดดิสก์ไดรฟ์หรือการเข้าถึงกล้องของอุปกรณ์) การสร้างและการดำเนินการของกระบวนการ ใหม่ และการสื่อสารกับ บริการเคอร์เนลที่ครบถ้วนเช่นการจัดตารางกระบวนการ การเรียกระบบมีส่วนต่อประสานที่จำเป็นระหว่างกระบวนการและระบบปฏิบัติการ

ในระบบส่วนใหญ่ การเรียกระบบสามารถทำได้จากกระบวนการของพื้นที่ผู้ใช้เท่านั้น ในขณะที่ในบางระบบOS/360 และผู้สืบทอดเช่น รหัสระบบที่มีสิทธิพิเศษจะออกการเรียกระบบด้วย [1]

สิทธิพิเศษ

สถาปัตยกรรมของโปรเซสเซอร์ที่ทันสมัยที่สุด ยกเว้นระบบฝังตัวบางตัว เกี่ยวข้องกับ รูปแบบการ รักษาความปลอดภัย ตัวอย่างเช่น โมเดล ริงระบุระดับสิทธิ์หลายระดับภายใต้ซอฟต์แวร์ที่สามารถดำเนินการได้: โดยปกติโปรแกรมจะจำกัดพื้นที่ที่อยู่ ของตัวเอง เพื่อไม่ให้เข้าถึงหรือแก้ไขโปรแกรมที่ทำงานอยู่อื่น ๆ หรือระบบปฏิบัติการเอง และมักจะป้องกันไม่ให้จัดการโดยตรง อุปกรณ์ฮาร์ดแวร์ (เช่นเฟรมบัฟเฟอร์หรือ อุปกรณ์ เครือข่าย )

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

ห้องสมุดเป็นตัวกลาง

โดยทั่วไป ระบบจะมีไลบรารีหรือAPIที่อยู่ระหว่างโปรแกรมปกติและระบบปฏิบัติการ ในระบบที่คล้ายกับ Unix API นั้นมักจะเป็นส่วนหนึ่งของการใช้งานไลบรารี C (libc) เช่นglibcที่มีฟังก์ชัน wrapperสำหรับการเรียกระบบ ซึ่งมักตั้งชื่อเหมือนกับการเรียกระบบที่พวกเขาเรียกใช้ บนWindows NT API นั้นเป็นส่วนหนึ่งของNative APIในไลบรารีntdll.dll นี่คือ API ที่ไม่มีเอกสารซึ่งใช้โดยการใช้งานWindows API . ปกติและใช้โดยตรงโดยโปรแกรมระบบบางโปรแกรมบน Windows ฟังก์ชัน wrapper ของไลบรารีแสดงรูปแบบการเรียกฟังก์ชันปกติ (การเรียกรูทีนย่อย ในระดับ แอสเซมบลี ) สำหรับการใช้การเรียกระบบ รวมถึงการเรียกระบบแบบโมดูลาร์ มาก ขึ้น ที่นี่ หน้าที่หลักของ wrapper คือการวางอาร์กิวเมนต์ทั้งหมดที่จะส่งผ่านไปยังการเรียกระบบในการลงทะเบียนโปรเซสเซอร์ ที่เหมาะสม (และอาจอยู่ในcall stackด้วย) และการตั้งค่าหมายเลขการเรียกระบบเฉพาะสำหรับเคอร์เนลที่จะโทร . ด้วยวิธีนี้ ไลบรารีซึ่งอยู่ระหว่างระบบปฏิบัติการและแอปพลิเคชัน จะเพิ่ม ความสามารถในการ พกพา

การเรียกใช้ฟังก์ชันไลบรารีเองไม่ได้ทำให้เกิดการสลับไปยังโหมดเคอร์เนลและมักจะเป็นการเรียกรูทีนย่อย ปกติ (เช่น ใช้คำสั่งแอสเซมบลี "CALL" ในสถาปัตยกรรมชุดคำสั่ง (ISA) บางตัว) การเรียกระบบจริงจะถ่ายโอนการควบคุมไปยังเคอร์เนล (และขึ้นอยู่กับการใช้งานและขึ้นอยู่กับแพลตฟอร์มมากกว่าการเรียกไลบรารีที่เป็นนามธรรม) ตัวอย่างเช่น ในระบบที่เหมือน Unixforkและexecveเป็นฟังก์ชันไลบรารี C ที่รันคำสั่งที่เรียกใช้forkและ การเรียกของ execระบบ การเรียกระบบโดยตรงในรหัสแอปพลิเคชันนั้นซับซ้อนกว่าและอาจต้องใช้รหัสแอสเซมบลีแบบฝัง (ในCและC++ ) รวมทั้งต้องการความรู้เกี่ยวกับอินเทอร์เฟซไบนารีระดับต่ำสำหรับการดำเนินการเรียกระบบ ซึ่งอาจเปลี่ยนแปลงได้เมื่อเวลาผ่านไป ดังนั้นจึงไม่ได้เป็นส่วนหนึ่งของอินเทอร์เฟซไบนารีของแอปพลิเคชัน หน้าที่ของห้องสมุดมีไว้เพื่อทำให้สิ่งนี้เป็นนามธรรม

ใน ระบบที่ใช้ exokernelห้องสมุดมีความสำคัญอย่างยิ่งในฐานะตัวกลาง ใน exokernels ไลบรารีจะป้องกันแอปพลิเคชันของผู้ใช้จากเคอร์เนลAPI ระดับต่ำมาก และจัดเตรียม สิ่งที่ เป็นนามธรรมและการจัดการ ทรัพยากร

OS/360และDOS/360ของ IBM ใช้การเรียกระบบส่วนใหญ่ผ่านไลบรารีของมาโคร ภาษาแอสเซม บ ลี [a]แม้ว่าจะมีบริการบางอย่างที่มีการเชื่อมโยงการโทรก็ตาม สิ่งนี้สะท้อนถึงที่มาของมันในช่วงเวลาที่การเขียนโปรแกรมในภาษาแอสเซมบลีเป็นเรื่องธรรมดามากกว่าการใช้ภาษาระดับสูง ดังนั้นการเรียกระบบของ IBM จึงไม่สามารถทำงานได้โดยตรงโดยโปรแกรมภาษาระดับสูง แต่จำเป็นต้องมีรูทีนย่อยของ wrapper ภาษาแอสเซมบลีที่เรียกได้ ตั้งแต่นั้นมา IBM ได้เพิ่มบริการมากมายที่สามารถเรียกจากภาษาระดับสูงใน เช่นz/OSและ z / VSE

ตัวอย่างและเครื่องมือ

บนระบบปฏิบัติการ Unixที่เหมือน UnixและPOSIX อื่นๆ การเรียกระบบยอดนิยมคือopen, read, write, close, wait, exec, fork, , exitและ killระบบปฏิบัติการสมัยใหม่จำนวนมากมีการเรียกระบบหลายร้อยรายการ ตัวอย่างเช่นLinuxและOpenBSDมีการเรียกต่างกันมากกว่า 300 รายการ [2] [3] NetBSDมีเกือบ 500 รายการ[4] FreeBSDมีมากกว่า 500 รายการ[5] Windows มีเกือบ 2000 รายการ โดยแบ่งระหว่าง win32k (กราฟิก) และ ntdll (หลัก) ระบบเรียก[6]ในขณะที่แผน 9มี 51 [7]

เครื่องมือเช่นstrace , ftraceและtrussอนุญาตให้กระบวนการดำเนินการตั้งแต่เริ่มต้นและรายงานการเรียกระบบทั้งหมดที่เรียกใช้กระบวนการหรือสามารถแนบกับกระบวนการที่กำลังทำงานอยู่แล้วและสกัดกั้นการเรียกระบบใด ๆ ที่ทำโดยกระบวนการดังกล่าวหากการดำเนินการไม่ละเมิดสิทธิ์ ของผู้ใช้ ความสามารถพิเศษของโปรแกรมนี้มักจะใช้กับการเรียกระบบ เช่นptraceหรือการเรียกระบบบนไฟล์ใน procfs

การใช้งานทั่วไป

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

นี่เป็นเทคนิคเดียวที่มีให้สำหรับ โปรเซสเซอร์ RISC หลาย ตัว แต่ สถาปัตยกรรม CISCเช่นx86รองรับเทคนิคเพิ่มเติม ตัวอย่างเช่นชุดคำสั่ง x86 ประกอบด้วยคำสั่งSYSCALL/ SYSRETและSYSENTER/ SYSEXIT(กลไกทั้งสองนี้สร้างขึ้นอย่างอิสระโดยAMDและIntelตามลำดับ แต่โดยพื้นฐานแล้วมันทำในสิ่งเดียวกัน) เหล่านี้เป็นคำแนะนำการถ่ายโอนการควบคุม "เร็ว" ที่ออกแบบมาเพื่อถ่ายโอนการควบคุมไปยังเคอร์เนลอย่างรวดเร็วสำหรับการเรียกระบบโดยไม่มีโอเวอร์เฮดของการขัดจังหวะ [8] Linux 2.5 เริ่มใช้สิ่งนี้บนx86หากมี; เมื่อก่อนใช้INTคำสั่ง โดยที่หมายเลขเรียกของระบบถูกวางไว้ในEAX รีจิ สเตอร์ ก่อนอินเตอร์รัปต์ 0x80 จะถูกดำเนินการ [9] [10]

กลไกที่เก่ากว่าคือประตูเรียกเข้า เดิมใช้ในMulticsและใหม่กว่า เช่น ดูcall gateบนIntel x86 อนุญาตให้โปรแกรมเรียกใช้ฟังก์ชันเคอร์เนลได้โดยตรงโดยใช้กลไกการถ่ายโอนการควบคุมที่ปลอดภัย ซึ่งระบบปฏิบัติการจะตั้งค่าไว้ล่วงหน้า วิธีการนี้ไม่เป็นที่นิยมใน x86 น่าจะเป็นเพราะข้อกำหนดของการโทรไกล (การเรียกไปยังโพรซีเดอร์ที่อยู่ในเซ็กเมนต์ที่แตกต่างจากเซ็กเมนต์รหัสปัจจุบัน[11] ) ซึ่งใช้การแบ่งส่วนหน่วยความจำ x86และทำให้ไม่สามารถพกพาได้ และการมีอยู่ของคำสั่งที่เร็วกว่าที่กล่าวถึงข้างต้น

สำหรับสถาปัตยกรรมIA-64EPCจะใช้คำสั่ง (ป้อน Privileged Code) อาร์กิวเมนต์การเรียกระบบแปดรายการแรกจะถูกส่งผ่านในรีจิสเตอร์ และส่วนที่เหลือจะถูกส่งต่อไปยังสแต็ก

ใน ตระกูลเมนเฟรม IBM System/360และผู้สืบทอดคำสั่ง Supervisor Call ( SVC ) ที่มีหมายเลขในคำสั่งแทนที่จะเป็นในการลงทะเบียน ใช้การเรียกระบบสำหรับสิ่งอำนวยความสะดวกดั้งเดิมในระบบปฏิบัติการส่วนใหญ่ของ[b]ของ IBM เอง และสำหรับการเรียกระบบทั้งหมดใน Linux ใน MVS เวอร์ชันใหม่กว่า IBM ใช้คำสั่ง Program Call (PC) สำหรับสิ่งอำนวยความสะดวกที่ใหม่กว่าจำนวนมาก โดยเฉพาะอย่างยิ่ง พีซีถูกใช้เมื่อผู้โทรอาจอยู่ใน โหมด Service Request Block (SRB)

มินิคอมพิวเตอร์PDP-11 ใช้ คำสั่ง EMTและIOTซึ่งคล้ายกับ IBM System/360 SVCและ x86 INTใส่โค้ดลงในคำสั่ง พวกเขาสร้างอินเตอร์รัปต์ไปยังที่อยู่ที่เฉพาะเจาะจง ถ่ายโอนการควบคุมไปยังระบบปฏิบัติการ ตัวต่อจากVAX 32 บิตของซีรีส์ PDP-11 ใช้คำสั่ง CHMK , CHMEและCHMSเพื่อทำการเรียกระบบไปยังโค้ดที่มีสิทธิพิเศษในระดับต่างๆ รหัสเป็นอาร์กิวเมนต์ของคำสั่ง

หมวดหมู่ของการเรียกระบบ

การเรียกระบบสามารถจัดกลุ่มคร่าวๆ ได้เป็น 6 ประเภทหลัก: [12]

  1. การควบคุมกระบวนการ
  2. การจัดการไฟล์
    • สร้างไฟล์ ลบไฟล์
    • เปิดปิด
    • อ่าน เขียน เปลี่ยนตำแหน่ง
    • รับ/ตั้งค่าคุณสมบัติไฟล์
  3. การจัดการอุปกรณ์
    • ขอเครื่อง ปล่อยเครื่อง
    • อ่าน เขียน เปลี่ยนตำแหน่ง
    • รับ/ตั้งค่าคุณสมบัติอุปกรณ์
    • แนบหรือถอดอุปกรณ์อย่างมีเหตุผล
  4. การบำรุงรักษาข้อมูล
    • รับ/ตั้งค่าข้อมูลระบบทั้งหมด (รวมถึงเวลา วันที่ ชื่อคอมพิวเตอร์ องค์กร ฯลฯ)
    • รับ/ตั้งค่ากระบวนการ ไฟล์ หรือข้อมูลเมตาของอุปกรณ์ (รวมถึงผู้แต่ง ผู้เปิด เวลาและวันที่สร้าง ฯลฯ)
  5. การสื่อสาร
    • สร้าง ลบการเชื่อมต่อการสื่อสาร
    • ส่ง รับข้อความ
    • ข้อมูลสถานะการโอน
    • ติดหรือถอดอุปกรณ์ระยะไกล
  6. การป้องกัน
    • รับ/ตั้งค่าการอนุญาตไฟล์

โหมดโปรเซสเซอร์และการสลับบริบท

การเรียกระบบในระบบที่คล้าย Unix ส่วนใหญ่ จะถูกประมวลผลในโหมดเคอร์เนลซึ่งทำได้โดยการเปลี่ยนโหมดการดำเนินการของโปรเซสเซอร์เป็นโหมดที่มีสิทธิพิเศษมากกว่า แต่ไม่ จำเป็นต้อง เปลี่ยนบริบทของกระบวนการ แม้ว่า สวิตช์บริบทของ สิทธิ์จะเกิดขึ้นก็ตาม ฮาร์ดแวร์มองเห็นโลกในแง่ของโหมดการดำเนินการตามการลงทะเบียนสถานะของ โปรเซสเซอร์ และกระบวนการต่าง ๆ เป็นนามธรรมที่ระบบปฏิบัติการจัดเตรียมไว้ การเรียกระบบโดยทั่วไปไม่ต้องการการสลับบริบทไปยังกระบวนการอื่น แต่จะถูกประมวลผลในบริบทของกระบวนการใดก็ตามที่เรียกใช้ [13] [14]

ใน กระบวนการ แบบมัลติเธรดการเรียกระบบสามารถทำได้จากหลายเธรด การจัดการการโทรดังกล่าวขึ้นอยู่กับการออกแบบเคอร์เนลระบบปฏิบัติการเฉพาะและสภาพแวดล้อมรันไทม์ของแอปพลิเคชัน รายการต่อไปนี้แสดงรุ่นทั่วไปตามด้วยระบบปฏิบัติการ: [15] [16]

  • โมเดล หลายต่อหนึ่ง : การเรียกระบบทั้งหมดจากเธรดผู้ใช้ในกระบวนการได้รับการจัดการโดยเธรดระดับเคอร์เนลเดียว โมเดลนี้มีข้อเสียอย่างร้ายแรง – การเรียกระบบการบล็อกใดๆ (เช่น กำลังรอข้อมูลจากผู้ใช้) สามารถตรึงเธรดอื่นๆ ทั้งหมดได้ นอกจากนี้ เนื่องจากมีเพียงเธรดเดียวเท่านั้นที่สามารถเข้าถึงเคอร์เนลในแต่ละครั้ง โมเดลนี้จึงไม่สามารถใช้โปรเซสเซอร์หลายคอร์ได้
  • โมเดล หนึ่งต่อหนึ่ง : เธรดผู้ใช้ทุกเธรดจะถูกแนบกับเธรดระดับเคอร์เนลที่แตกต่างกันระหว่างการเรียกระบบ โมเดลนี้แก้ปัญหาข้างต้นของการบล็อกการเรียกของระบบ พบได้ในลีนุกซ์ รุ่นสำคัญทั้งหมด , macOS , iOS , WindowsและSolarisเวอร์ชันล่าสุด
  • โมเดลแบบกลุ่มต่อกลุ่ม : ในโมเดลนี้ กลุ่มของเธรดผู้ใช้จะถูกแมปกับพูลของเคอร์เนลเธรด การเรียกระบบทั้งหมดจากพูลเธรดของผู้ใช้ได้รับการจัดการโดยเธรดในพูลเธรด เคอร์เนลที่ เกี่ยวข้อง
  • โมเดล ไฮบริด : โมเดลนี้ใช้ทั้งแบบหลายต่อหลายแบบและแบบหนึ่งต่อหนึ่งขึ้นอยู่กับตัวเลือกที่ทำโดยเคอร์เนล พบได้ในIRIX , HP-UXและSolaris เวอร์ชัน เก่า

ดูเพิ่มเติม

หมายเหตุ

  1. ^ ในหลายกรณีแต่ไม่ใช่ทุกกรณี IBM ได้จัดทำเอกสาร เช่น หมายเลข SVC การลงทะเบียนพารามิเตอร์
  2. ^ ส่วนประกอบ CP ของ CP-67และ VMใช้คำสั่ง Diagnose (DIAG) เป็น Hypervisor CALL (HVC) จากเครื่องเสมือนไปยัง CP

อ้างอิง

  1. ^ IBM (มีนาคม 2510) "การเขียนกิจวัตร SVC" คู่มือโปรแกรมเมอร์ระบบปฏิบัติการ IBM System/360 (PDF ) ฉบับที่สาม. น. 32–36. C28-6550-2.
  2. ^ "syscalls(2) - หน้าคู่มือ Linux "
  3. ^ OpenBSD (14 กันยายน 2556) "ชื่อเรียกของระบบ (kern/syscalls.c) " การอ้างอิงโยง BSD
  4. ^ NetBSD (17 ตุลาคม 2556) "ชื่อเรียกของระบบ (kern/syscalls.c) " การอ้างอิงโยง BSD
  5. ^ "FreeBSD syscalls.c รายชื่อและรหัส syscall "
  6. ↑ ผู้แต่ง: Mateusz " j00ru " Jurczyk (5 พฤศจิกายน 2017). "ตารางเรียกระบบ Windows WIN32K.SYS (NT/2000/XP/2003/Vista/2008/7/8/10) " {{cite web}}: |author=มีชื่อสามัญ ( ช่วยเหลือ )
  7. ^ "แผน 9 sys.h รายชื่อ syscall และ ID "
  8. ^ "SYSENTER (OSDev wiki)" .
  9. ^ ไม่ระบุชื่อ (19 ธันวาคม 2545) "Linux 2.5 ได้รับ vsyscalls รองรับระบบ " เคอร์เนลกับดัก สืบค้นเมื่อ1 มกราคม 2551 .
  10. ^ มนูการ์ก (2006). "กลไกการเรียกระบบตามระบบใน Linux 2.6 "
  11. ^ "การปลดปล่อย: การอ้างอิงชุดคำสั่ง x86 " renejeschke.de _ สืบค้นเมื่อ4 กรกฎาคม 2558 .
  12. ซิลเบอร์ชาตซ์, อับราฮัม (2018). แนวคิดระบบปฏิบัติการ . ปีเตอร์ บี. กัลวิน; Greg Gagne (ฉบับที่ 10) โฮโบเกน รัฐนิวเจอร์ซี: ไวลีย์ หน้า 67. ISBN 9781119320913. OCLC  1004849022 .
  13. ^ Bach, Maurice J. (1986), The Design of the UNIX Operating System , Prentice Hall, pp. 15–16.
  14. เอลเลียต, จอห์น (2011). "การอภิปรายเกี่ยวกับการนำระบบไปใช้ที่ ProgClub รวมทั้งใบเสนอราคาจาก Bach 1986 "
  15. ^ "กระทู้" .
  16. ^ "แบบจำลองการทำเกลียว" (PDF) .

ลิงค์ภายนอก