यह संभव नहीं है क्योंकि सिस्टम कॉल टेबल (कहा जाता है sys_call_table
) एक स्थिर आकार सरणी है। और इसका आकार पंजीकृत syscalls की संख्या से संकलन समय पर निर्धारित किया जाता है। इसका मतलब है कि दूसरे के लिए कोई जगह नहीं है।
आप arch/x86/kernel/syscall_64.c
फ़ाइल में x86 आर्किटेक्चर के लिए उदाहरण के लिए कार्यान्वयन की जांच कर सकते हैं , जहां sys_call_table
परिभाषित किया गया है। इसका आकार बिल्कुल है __NR_syscall_max+1
। __NR_syscall_max
के रूप में परिभाषित किया arch/x86/kernel/asm-offsets_64.c
गया है sizeof(syscalls) - 1
(यह अंतिम syscall की संख्या है), जहां syscall
सभी syscalls के साथ एक तालिका है।
एक संभव समाधान कुछ मौजूदा (या एक को अपदस्थ करना है अगर आपके आर्किटेक्चर में एक है, sys_setaltroot
उदाहरण के लिए देखें ) आपके साथ syscall नंबर, क्योंकि इसके लिए मेमोरी में अधिक स्थान की आवश्यकता नहीं होगी। कुछ आर्किटेक्चर में syscall टेबल में छेद भी हो सकते हैं (जैसे x86 का 64 बिट संस्करण) तो आप इसका भी उपयोग कर सकते हैं।
आप इस तकनीक का उपयोग कर सकते हैं यदि आप नए syscall विकसित कर रहे हैं और सिर्फ प्रयोग करते समय रिबूटिंग से बचना चाहते हैं। आपको अपने नए सिस्टम कॉल को परिभाषित करना होगा, syscall तालिका में मौजूदा प्रविष्टि का पता लगाना होगा और फिर इसे अपने मॉड्यूल से बदलना होगा।
कर्नेल मॉड्यूल से ऐसा करना तुच्छ नहीं है क्योंकि कर्नेल sys_call_table
संस्करण 2.6 के रूप में मॉड्यूल को निर्यात नहीं करता है (अंतिम कर्नेल संस्करण जो इस प्रतीक का निर्यात किया गया था 2.5.41
)।
इसके चारों ओर काम करने का एक तरीका यह है कि sys_call_table
प्रतीक को निर्यात करने के लिए अपने कर्नेल को मॉड्यूल में बदल दें । ऐसा करने के लिए, आपको निम्नलिखित दो पंक्तियों को जोड़ना होगा kernel/kallsyms.c
( उत्पादन मशीनों पर ऐसा न करें ):
extern void *sys_call_table;
EXPORT_SYMBOL(sys_call_table);
एक और तकनीक है गतिशील रूप से syscall टेबल की खोज करना। आप कर्नेल मेमोरी पर पुनरावृति करते हैं, प्रत्येक शब्द की तुलना पॉइंटर से ज्ञात सिस्टम कॉल फ़ंक्शन से करते हैं। चूंकि आपको पता है कि टेबल में इस पता syscall की भरपाई है, आप टेबल शुरुआत पते की गणना कर सकते हैं।