2016-10-03 9 views
8

कॉल सफल होने पर मैं उपयोगकर्ता-भूमि (नेटलिंक सॉकेट के माध्यम से) फ़ंक्शन तर्कों को वापस लौटने के इच्छुक कुछ सिस्कोल की निगरानी करने के लिए कर्नेल मॉड्यूल लिख रहा हूं।लिनक्स कर्नेल - एक jprobe से kretprobe कैसे मिलान करें?

jprobe.kp.symbol_name = "rename"; 
jprobe.entry = rename_handler; 

kretprobe.kp.symbol_name = "rename"; 
kretprobe.handler = rename_ret_handler; 

static rename_obj_t _g_cur_rename = NULL; 

static void _rename_handler(const char *oldpath, const char *newpath) 
{ 
    _g_cur_rename = create_rename(oldpath, newpath); 
    jprobe_return(); 
} 

static void _rename_ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs) 
{ 
    /* Send only if successful */ 
    if (regs_return_value(regs) == 0) { 
     add_send_queue(_g_cur_rename); 
    } 
    return 0; 
} 

मुझे चिंता है कि एक और नाम बदलने syscall [1] jprobe के बाद वर्तमान एक जगह ले लेना हो सकता है और मैं गलत वापसी कोड और तर्क भेज देंगे।

jprobe: rename(a, b) 
    jprobe rename(c, d) 
    kretprobe 
kretprobe 

संपादित करें: यह लेख [2] कहा गया है कि बीच में आता है एक kprobe हैंडलर दौरान अक्षम हैं। लेकिन क्या इसका मतलब यह है कि पूरे श्रृंखला में इंटरप्ट्स अक्षम होते हैं (jprobe -> kprobe -> kretprobe) या सिर्फ उस एकल केप्रोब के लिए?

  1. https://unix.stackexchange.com/questions/186355/few-questions-about-system-calls-and-kernel-modules-kernel-services-in-parallel
  2. https://lwn.net/Articles/132196/

उत्तर

1

अवरोध प्रत्येक jprobe कॉल के लिए अक्षम हैं: पूरे दृश्य के लिए नहीं।

आवेदन करने के लिए आवेदन करने में कितनी कॉल की उम्मीद है? आप कितनी तेजी से कॉल आने की अपेक्षा करते हैं इस पर निर्भर करते हुए विभिन्न दृष्टिकोण हैं। सबसे आसान तरीका, यदि आप केवल उनसे संसाधित करने से पहले कुछ सौ कॉल की उम्मीद कर रहे हैं और आप इस उद्देश्य को स्थिर स्मृति समर्पित करेंगे, तो इसे लागू करना है स्मृति में rename_obj_t ऑब्जेक्ट्स की स्थिर सरणी और फिर कर्नेल एएसएम से atomic_add का उपयोग करें, अगली प्रविष्टि (आपके सरणी के आकार को संशोधित करें) पर इंगित करें।

इस तरह आप हर बार एक अद्वितीय स्थिर संदर्भ लौट रहे हैं, जब तक कि काउंटर वापस लौटने वाले मूल्यों को संसाधित करने से पहले लपेट नहीं लेता है। atomic_add की जगह मेमोरी में सही मेमोरी बाधाएं हैं, इसलिए आपको कैश कोहेरेंसी जैसी चीजों के बारे में चिंता करने की ज़रूरत नहीं है।

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