कॉल सफल होने पर मैं उपयोगकर्ता-भूमि (नेटलिंक सॉकेट के माध्यम से) फ़ंक्शन तर्कों को वापस लौटने के इच्छुक कुछ सिस्कोल की निगरानी करने के लिए कर्नेल मॉड्यूल लिख रहा हूं।लिनक्स कर्नेल - एक 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) या सिर्फ उस एकल केप्रोब के लिए?
- https://unix.stackexchange.com/questions/186355/few-questions-about-system-calls-and-kernel-modules-kernel-services-in-parallel
- https://lwn.net/Articles/132196/