การเรียกระบบไม่ได้รับการจัดการเหมือนกับการเรียกใช้ฟังก์ชันปกติ ใช้รหัสพิเศษในการเปลี่ยนจากพื้นที่ผู้ใช้ไปเป็นพื้นที่เคอร์เนลโดยทั่วไปจะมีรหัสแอสเซมบลีแบบอินไลน์แทรกเข้าไปในโปรแกรมของคุณที่ไซต์การโทร โค้ดด้านเคอร์เนลที่ "จับ" การเรียกของระบบนั้นเป็นสิ่งที่อยู่ในระดับต่ำซึ่งคุณอาจไม่จำเป็นต้องเข้าใจอย่างลึกซึ้งอย่างน้อยก็ในตอนแรก
ในinclude/linux/syscalls.h
ไดเรกทอรีไดเรกทอรีเคอร์เนลของคุณคุณจะพบสิ่งนี้:
asmlinkage long sys_mkdir(const char __user *pathname, int mode);
จากนั้นใน/usr/include/asm*/unistd.h
คุณจะพบสิ่งนี้:
#define __NR_mkdir 83
__SYSCALL(__NR_mkdir, sys_mkdir)
รหัสนี้บอกว่าmkdir(2)
เป็นสายระบบ # 83 กล่าวคือการเรียกของระบบเรียกตามหมายเลขไม่ใช่ตามที่อยู่เหมือนกับการเรียกใช้ฟังก์ชันปกติภายในโปรแกรมของคุณหรือไปยังฟังก์ชันในไลบรารีที่เชื่อมโยงกับโปรแกรมของคุณ รหัสกาวอินไลน์แอสเซมบลีที่ฉันกล่าวถึงข้างต้นใช้สิ่งนี้เพื่อทำการเปลี่ยนจากผู้ใช้ไปยังพื้นที่เคอร์เนลนำพารามิเตอร์ของคุณไปด้วย
หลักฐานอีกเล็กน้อยที่สิ่งต่าง ๆ แปลก ๆ เล็กน้อยที่นี่คือไม่มีรายการพารามิเตอร์ที่เข้มงวดสำหรับการเรียกของระบบ: open(2)
ตัวอย่างเช่นอาจใช้พารามิเตอร์ 2 หรือ 3 ซึ่งหมายความว่าopen(2)
จะมากเกินไปคุณลักษณะของภาษา C ++, C ไม่ได้ที่ยังอินเตอร์เฟซ syscall คือ C ที่เข้ากันได้ (นี่ไม่ใช่สิ่งเดียวกับคุณสมบัติ varargsของ C ซึ่งช่วยให้ฟังก์ชั่นเดียวสามารถรับอาร์กิวเมนต์จำนวนตัวแปรได้)
เพื่อตอบคำถามแรกของคุณไม่มีไฟล์เดียวที่mkdir()
มีอยู่ Linux รองรับระบบไฟล์ที่แตกต่างกันและแต่ละระบบมีการดำเนินการ "mkdir" ของตัวเอง ชั้นนามธรรมที่ช่วยให้เคอร์เนลซ่อนทุกสิ่งที่อยู่เบื้องหลังการเรียกระบบเดียวที่เรียกว่าวีเอฟเอ ดังนั้นคุณอาจต้องการที่จะเริ่มต้นในการขุดด้วยfs/namei.c
vfs_mkdir()
การใช้งานจริงของรหัสการแก้ไขระบบไฟล์ระดับต่ำนั้นอยู่ที่อื่น ยกตัวอย่างเช่นการดำเนินการ ext4 จะเรียกว่าที่กำหนดไว้ในext4_mkdir()
fs/ext4/namei.c
สำหรับคำถามที่สองของคุณใช่มีรูปแบบทั้งหมดนี้ แต่ไม่ใช่กฎเดียว สิ่งที่คุณต้องการจริงๆคือความเข้าใจในวงกว้างเกี่ยวกับวิธีการทำงานของเคอร์เนลเพื่อหาว่าคุณควรค้นหาการเรียกใช้ระบบใดโดยเฉพาะ fs/namei.c
ไม่ทุกสายระบบที่เกี่ยวข้องกับวีเอฟเอเพื่อให้เคอร์เนลด้านโซ่โทรของพวกเขาทำไม่ได้ทั้งหมดเริ่มต้นใน mmap(2)
ตัวอย่างเช่นเริ่มทำงานmm/mmap.c
เนื่องจากเป็นส่วนหนึ่งของระบบย่อยการจัดการหน่วยความจำ ("mm") ของเคอร์เนล
ฉันขอแนะนำให้คุณรับสำเนาของ "การทำความเข้าใจเคอร์เนลลินุกซ์ " โดย Bovet และ Cesati