ฉันอยากจะรู้ว่าอะไรคือความแตกต่างระหว่างการโทรในห้องสมุดและการโทรของระบบใน Linux พอยน์เตอร์ใด ๆ สำหรับความเข้าใจที่ดีของแนวคิดที่อยู่เบื้องหลังทั้งสองจะได้รับการชื่นชมอย่างมาก
ฉันอยากจะรู้ว่าอะไรคือความแตกต่างระหว่างการโทรในห้องสมุดและการโทรของระบบใน Linux พอยน์เตอร์ใด ๆ สำหรับความเข้าใจที่ดีของแนวคิดที่อยู่เบื้องหลังทั้งสองจะได้รับการชื่นชมอย่างมาก
คำตอบ:
ไม่มีสิ่งใดที่เรียกว่าการเรียกไลบรารี่ คุณสามารถเรียกใช้ฟังก์ชันที่เชื่อมโยงกับไลบรารีที่แชร์ได้ และนั่นก็หมายความว่าเส้นทางของไลบรารีจะถูกค้นหาที่ runtime เพื่อกำหนดตำแหน่งของฟังก์ชันที่จะเรียก
การเรียกของระบบเป็นการเรียกเคอร์เนลระดับต่ำที่จัดการโดยเคอร์เนล
หากคุณพิมพ์man man
ในเปลือกของคุณคุณจะเห็นรายการของส่วนคู่มือ
2 การเรียกระบบ (ฟังก์ชั่นที่จัดทำโดยเคอร์เนล)
3 การเรียกใช้ไลบรารี (ฟังก์ชั่นภายในไลบรารีโปรแกรม)
ตัวอย่างเช่นคุณจะพบchmod
ในส่วนที่ 2 man chmod
ของคู่มือเมื่อพิมพ์ และfprintf
ในส่วนที่ 3
การเรียกระบบถูกจัดการโดยเคอร์เนลโดยตรง
การเรียกใช้ไลบรารีถูกจัดการโดยไลบรารีแบบไดนามิก (หรือลิงก์แบบสแตติก) โปรแกรมที่ทำการเรียกไลบรารีต้องนำเข้าไลบรารีนั้นก่อนที่การโทรจะทำงาน การเรียกใช้ไลบรารีเองอาจใช้การเรียกของระบบ
บางครั้งมีการจัดเตรียมไลบรารีเป็น "front-end" เพื่อการเรียกใช้ระบบเพื่อให้มีฟังก์ชั่นพิเศษหรือความสะดวกในการใช้โดยเคอร์เนล
การเรียกของระบบเป็นฟังก์ชั่นที่ระบบปฏิบัติการจัดเตรียมไว้สำหรับการใช้งาน ในขณะที่ฟังก์ชั่นเช่นเดียวกับใน math.h, string.h ฯลฯ เป็นฟังก์ชันที่ไม่มีส่วนเกี่ยวข้องกับการเชื่อมต่อกับระบบปฏิบัติการ
โดยทั่วไปมีสองโหมดของ linux kernel ได้แก่
เคอร์เนล linux ใดสลับตัวเองไปมาระหว่างสองโหมดนี้ โดยทั่วไปสายห้องสมุดได้รับการดำเนินการในโหมดผู้ใช้และระบบโทรศัพท์ได้รับการดำเนินการในโหมดเคอร์เนล ในแง่ของระบบปฏิบัติการโหมดเคอร์เนลคือAtomic โดยธรรมชาติและอยู่ในโหมด Supervisory การเรียกใช้ไลบรารี่เกือบทั้งหมดต้องการความช่วยเหลือจากเคอร์เนลเพื่อทำงานของมัน การเรียกใช้ไลบรารีแต่ละครั้งจะเป็นการเรียกการเรียกระบบพื้นฐาน ให้เราทำให้ความคิดที่ชัดเจนยิ่งขึ้นโดยใช้ตัวอย่างต่อไปนี้
เมื่อใดก็ตามที่อยู่ในโปรแกรม c คุณใช้ fopen () จากไฟล์ส่วนหัว สภาพแวดล้อมการเขียนโปรแกรมเรียกการเรียกของระบบ open () จากเคอร์เนลและดำเนินการเปิดไฟล์ อีกครั้งหลังจากดำเนินการควบคุมการไหลกลับไปที่โหมดผู้ใช้
เพื่อแสดงให้เห็นถึงการดำเนินการดังต่อไปนี้
man man
: ที่นี่คุณจะพบกับคู่มือการใช้งานตั้งแต่ 1-8 ข้อแต่ละข้อมีวัตถุประสงค์เฉพาะman fopen
: คุณจะเห็นการตอบสนองเช่นเดียวกับFOPEN(3)
ที่นี่ 3 บ่งบอกถึงส่วนที่ 3 ด้วยตนเองของ man pages ซึ่งเป็น c-library call sectionสิ่งที่ต้องทำman open
: คุณจะเห็นการตอบสนองเช่นเดียวกับOPEN(2)
ที่นี่ 2 บ่งบอกถึงส่วนที่ 2 ด้วยตนเองของหน้าคนซึ่งเป็นส่วนที่ระบบเรียก
หวังว่าคุณจะเข้าใจแนวคิด
เพียงเพิ่มความแตกต่างที่กล่าวถึงในคำตอบอื่น ๆ
เนื่องจากการเรียกไลบรารีเป็นเพียงการเรียกใช้ฟังก์ชันจึงไม่มีการสลับจากพื้นที่ผู้ใช้ไปเป็นพื้นที่เคอร์เนล ในทางกลับกันการเรียกระบบส่งผลให้เกิดการสลับจากพื้นที่ผู้ใช้ไปยังพื้นที่เคอร์เนลเนื่องจากการเรียกระบบทำงานในโหมดเคอร์เนล