อะไรคือความแตกต่างระหว่างการเรียกใช้ไลบรารีและการโทรของระบบใน Linux


13

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

คำตอบ:


9

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

การเรียกของระบบเป็นการเรียกเคอร์เนลระดับต่ำที่จัดการโดยเคอร์เนล


ดังนั้นถ้าใครถามคำถามข้างต้นฉันสามารถตีความมันเป็นความแตกต่างระหว่างการโทรของระบบและฟังก์ชั่นการโทร
Sen

"man ltrace" ให้ "A call call tracer" ของฉัน :)
ysdx

8

หากคุณพิมพ์man manในเปลือกของคุณคุณจะเห็นรายการของส่วนคู่มือ

2 การเรียกระบบ (ฟังก์ชั่นที่จัดทำโดยเคอร์เนล)

3 การเรียกใช้ไลบรารี (ฟังก์ชั่นภายในไลบรารีโปรแกรม)

ตัวอย่างเช่นคุณจะพบchmodในส่วนที่ 2 man chmodของคู่มือเมื่อพิมพ์ และfprintfในส่วนที่ 3


3

การเรียกระบบถูกจัดการโดยเคอร์เนลโดยตรง

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

บางครั้งมีการจัดเตรียมไลบรารีเป็น "front-end" เพื่อการเรียกใช้ระบบเพื่อให้มีฟังก์ชั่นพิเศษหรือความสะดวกในการใช้โดยเคอร์เนล


การเรียกใช้ไลบรารีไม่จำเป็นต้องจัดการโดยไลบรารีแบบไดนามิก ไลบรารีสามารถลิงก์แบบสแตติกได้ดังนั้นจึงไม่จำเป็นต้องอิมพอร์ต (โหลด)
jlliagre

จริง ฉันเพิ่มข้อมูลนั้น
LawrenceC

เพียงครึ่งหนึ่งของมัน ...
jlliagre

ไม่ควรทำงานในไฟล์ head head เท่านั้นเช่นกันในการเรียกใช้ไลบรารี
陳力

1

การเรียกของระบบเป็นฟังก์ชั่นที่ระบบปฏิบัติการจัดเตรียมไว้สำหรับการใช้งาน ในขณะที่ฟังก์ชั่นเช่นเดียวกับใน math.h, string.h ฯลฯ เป็นฟังก์ชันที่ไม่มีส่วนเกี่ยวข้องกับการเชื่อมต่อกับระบบปฏิบัติการ


1

โดยทั่วไปมีสองโหมดของ linux kernel ได้แก่

  1. โหมดผู้ใช้
  2. โหมดเคอร์เนล

เคอร์เนล linux ใดสลับตัวเองไปมาระหว่างสองโหมดนี้ โดยทั่วไปสายห้องสมุดได้รับการดำเนินการในโหมดผู้ใช้และระบบโทรศัพท์ได้รับการดำเนินการในโหมดเคอร์เนล ในแง่ของระบบปฏิบัติการโหมดเคอร์เนลคือAtomic โดยธรรมชาติและอยู่ในโหมด Supervisory การเรียกใช้ไลบรารี่เกือบทั้งหมดต้องการความช่วยเหลือจากเคอร์เนลเพื่อทำงานของมัน การเรียกใช้ไลบรารีแต่ละครั้งจะเป็นการเรียกการเรียกระบบพื้นฐาน ให้เราทำให้ความคิดที่ชัดเจนยิ่งขึ้นโดยใช้ตัวอย่างต่อไปนี้

  1. fopen (): เป็นการเรียกห้องสมุด
  2. open (): เป็นการเรียกระบบ

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

เพื่อแสดงให้เห็นถึงการดำเนินการดังต่อไปนี้

  1. man man: ที่นี่คุณจะพบกับคู่มือการใช้งานตั้งแต่ 1-8 ข้อแต่ละข้อมีวัตถุประสงค์เฉพาะ
  2. สิ่งที่ต้องทำman fopen: คุณจะเห็นการตอบสนองเช่นเดียวกับFOPEN(3)ที่นี่ 3 บ่งบอกถึงส่วนที่ 3 ด้วยตนเองของ man pages ซึ่งเป็น c-library call section
  3. สิ่งที่ต้องทำman open: คุณจะเห็นการตอบสนองเช่นเดียวกับOPEN(2)ที่นี่ 2 บ่งบอกถึงส่วนที่ 2 ด้วยตนเองของหน้าคนซึ่งเป็นส่วนที่ระบบเรียก

    หวังว่าคุณจะเข้าใจแนวคิด


เคอร์เนลมีเพียงโหมดเดียวคือโหมดเคอร์เนล กระบวนการผู้ใช้มีสองโหมดการทำงานที่สลับไปมา userland และเคอร์เนล
jlliagre

1

เพียงเพิ่มความแตกต่างที่กล่าวถึงในคำตอบอื่น ๆ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.