2012-02-20 21 views
6

पर सिस्टम कॉल कार्यान्वयन की तलाश में मैं open(), close(), write() और unlink() के कार्यान्वयन की तलाश में हूं, लेकिन मुझे उन्हें कहीं भी नहीं मिल रहा है! मुझे लगता है कि हर समारोह sys_open, do_open, etc_open ... लेकिन इंटरफ़ेस के साथ कुछ भी नहीं है। क्या आप मेरी मदद कर सकते हैं?लिनक्स कर्नेल

मैं वे क्या सुरक्षा जांच की तरह

उत्तर

5

आपको कर्नेल स्रोतों में SYSCALL_DEFINE मैक्रो देखने की आवश्यकता है। उदाहरण के लिए, /fs पर unlink के लिए grepping निम्नलिखित देता है:

$ grep -r -n SYSCALL_DEFINE *.c | grep unlink

namei.c:2811:SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag) 
namei.c:2822:SYSCALL_DEFINE1(unlink, const char __user *, pathname) 

ध्यान दें कि SYSCALL_DEFINE के बाद नंबर syscall तर्क गणना है।

5

बनाने की खोज के लिए आप पुस्तकालय ऐसे fcntl.h में पाए जाने वाले के रूप में कॉल मतलब है, वे कर्नेल का हिस्सा नहीं हैं, तो वे glibc का हिस्सा हैं की जरूरत है।

आप हैं वास्तविक कर्नेल कॉल की चर्चा करते हुए, तो सिस्टम कॉल xyzzy आमतौर पर समारोह sys_xyzzy द्वारा नियंत्रित किया जाता।

.data 
    ENTRY(sys_call_table) 
     .long SYMBOL_NAME(sys_ni_syscall)  /* 0 - old "setup()" system call*/ 
     .long SYMBOL_NAME(sys_exit) 
     .long SYMBOL_NAME(sys_fork) 
     .long SYMBOL_NAME(sys_read) 
     .long SYMBOL_NAME(sys_write) 
     .long SYMBOL_NAME(sys_open)    /* 5 */ 
     .long SYMBOL_NAME(sys_close) 
     .long SYMBOL_NAME(sys_waitpid) 
     .long SYMBOL_NAME(sys_creat) 
     .long SYMBOL_NAME(sys_link) 
     .long SYMBOL_NAME(sys_unlink)   /* 10 */ 
     .long SYMBOL_NAME(sys_execve) 
     .long SYMBOL_NAME(sys_chdir) 
     .long SYMBOL_NAME(sys_time) 
     .long SYMBOL_NAME(sys_mknod) 
     .long SYMBOL_NAME(sys_chmod)   /* 15 */ 
     : 
     .long SYMBOL_NAME(sys_ni_syscall)  /* sys_remap_file_pages */ 
     .long SYMBOL_NAME(sys_ni_syscall)  /* sys_set_tid_address */ 

KernelGrok प्रणाली दिखा एक उपयोगी पृष्ठ है लगता है:

entry.S फ़ाइल, कम से कम 2.4 (मैं बाद में कर्नेल को देखा नहीं किया है), एक मेज मानचित्रण प्रणाली कार्यों के लिए कॉल नंबर का आयोजन किया कॉल, उनके नाम, पैरामीटर, और स्रोत कहां खोजें। उदाहरण के लिए (थोड़ा सुधारित):

0 sys_restart_syscall 
     eax = 0x00 
     kernel/signal.c:2058 
    1 sys_exit 
     eax = 0x01 
     ebx = int error_code 
     kernel/exit.c:1046 
    2 sys_fork 
     eax = 0x02 
     ebx = struct pt_regs * 
     arch/alpha/kernel/entry.S:716 
    3 sys_read 
     eax = 0x03 
     ebx = unsigned int fd 
     ecx = char __user *buf 
     edx = size_t count 
     fs/read_write.c:391 
    4 sys_write 
     eax = 0x04 
     ebx = unsigned int fd 
     ecx = const char __user *buf 
     edx = size_t count 
     fs/read_write.c:408 
    : 

और इसी तरह। लेकिन, पुराने स्कूल होने के नाते, मैं कर्नेल स्रोतों को स्थानीय रखना पसंद करता हूं और बस grep का उपयोग करना पसंद करता हूं :-)

संबंधित मुद्दे