मैं पिछले libc में syscall कॉल dissects:लिनक्स syscall, libc, VDSO और कार्यान्वयन विच्छेदन
git clone git://sourceware.org/git/glibc.git
और मैं में sysdeps/यूनिक्स/SysV/linux/i386/sysdep.h इस कोड है:
# define INTERNAL_SYSCALL_MAIN_INLINE(name, err, nr, args...) \
LOADREGS_##nr(args) \
asm volatile ( \
"call *%%gs:%P2" \
: "=a" (resultvar) \
: "a" (__NR_##name), "i" (offsetof (tcbhead_t, sysinfo)) \
ASMARGS_##nr(args) : "memory", "cc")
अगर मैं अच्छी तरह से समझ इस कोड, LOADREGS _ ## एन.आर. (args) मैक्रो लोड रजिस्टरों EBX में तर्क, ECX, EDX, ईएसआई, EDX और ईबीपी।
sysdeps/यूनिक्स/SysV/linux/i386/sysdep.h
# define LOADREGS_0()
# define ASMARGS_0()
# define LOADREGS_1(arg1) \
LOADREGS_0()
# define ASMARGS_1(arg1) \
ASMARGS_0(), "b" ((unsigned int) (arg1))
# define LOADREGS_2(arg1, arg2) \
LOADREGS_1 (arg1)
# define ASMARGS_2(arg1, arg2) \
ASMARGS_1 (arg1), "c" ((unsigned int) (arg2))
# define LOADREGS_3(arg1, arg2, arg3) \
LOADREGS_2 (arg1, arg2)
# define ASMARGS_3(arg1, arg2, arg3) \
ASMARGS_2 (arg1, arg2), "d" ((unsigned int) (arg3))
# define LOADREGS_4(arg1, arg2, arg3, arg4) \
LOADREGS_3 (arg1, arg2, arg3)
# define ASMARGS_4(arg1, arg2, arg3, arg4) \
ASMARGS_3 (arg1, arg2, arg3), "S" ((unsigned int) (arg4))
# define LOADREGS_5(arg1, arg2, arg3, arg4, arg5) \
LOADREGS_4 (arg1, arg2, arg3, arg4)
# define ASMARGS_5(arg1, arg2, arg3, arg4, arg5) \
ASMARGS_4 (arg1, arg2, arg3, arg4), "D" ((unsigned int) (arg5))
# define LOADREGS_6(arg1, arg2, arg3, arg4, arg5, arg6) \
register unsigned int _a6 asm ("ebp") = (unsigned int) (arg6); \
LOADREGS_5 (arg1, arg2, arg3, arg4, arg5)
# define ASMARGS_6(arg1, arg2, arg3, arg4, arg5, arg6) \
ASMARGS_5 (arg1, arg2, arg3, arg4, arg5), "r" (_a6)
#endif /* GCC 5 */
enter code here
कहां है कोड है जो रजिस्टरों EBX, ECX, EDX, ईएसआई, EDX और ईबीपी में तर्क लोड? यह उपरोक्त कोड है? मैं कार्यान्वयन को समझ नहीं पा रहा हूं। निम्नलिखित कोड ईबीएक्स रजिस्टर में 6 वें तर्क को लोड करते हैं?
register unsigned int _a6 asm ("ebp") = (unsigned int) (arg6);
क्या इस कोड को करता है:
ASMARGS_0(), "b" ((unsigned int) (arg1))
यह EBX में पहला तर्क रजिस्टर लोड करता है?
फिर "कॉल * %% जीएस:% पी 2" वीडीएसओ कोड पर जाएं? यह कोड "कॉल * जीएस: 0x10" से मेल खाता है?
हां, तो लिखने syscall के लिए इस निम्न आरेख, यह अच्छा है ?:
write(1, "A", 1) -----> LIBC -----> VDSO -----> KERNEL
load reg ?
jump to vdso
|---------------------------------------------------|--------------|
user land kernel land
मैं VDSO उपयोगिता नहीं समझती! vdso syscall विधि (sysenter या int 0x80) का चयन करें।
आपकी मदद के लिए अग्रिम धन्यवाद। और खेद है कि मेरी inglish बहुत बुरा है।
ग्लिबक उनकी घुलनशील अमूर्त परत के कारण बेहद जटिल है। मैं आपको पहले एक सरल libc देखने के लिए सलाह देते हैं। – fuz
एक सरल libc को समझना बहुत आसान है, syscall तर्क रजिस्टरों में स्टोर होते हैं और int 0x80 या sysenter निर्देश को कर्नेल मोड में बदलने के लिए निष्पादित किया जाता है। – tutuen
@tutuen क्या आप किसी को वीडीएसओ या उस विधि को समझाने के लिए ढूंढ रहे हैं जिसके द्वारा ग्लिबक इसके साथ बातचीत करता है? यदि आप सिर्फ वीडीएसओ की व्याख्या चाहते हैं, तो यह प्रदान करना आसान होगा। –