نحوهی استفادهی لینوکس از vDSO برای سرعت بخشیدن به فراخوانیهای سیستمی
اگر ساختار حافظهی پروسههای لینوکسی را مشاهده کنید (مثلا از طریق cat /proc/pid/maps) در کنار بخشهای مربوط به کد، داده، پشته، هیپ و کتابخانههای استفاده شده در برنامه، دو بخش نیز مشاهده میشود که عناوین vsyscall/vdso دارند که آدرسهای یکی مربوط به Kernel Mode بوده و دیگری آدرسهای User Modeای دارد.
این دو، مکانیزمهایی هستند که برای سرعت بخشیدن به اجرای syscallهایی که نرخ فراخوانی بالایی دارند استفاده میشوند. یکی از این syscallها gettimeofday است که به صورت مستقیم و غیر مستقیم توسط تعداد زیادی از توابع کتابخانهای فراخوانی میشود و به دلیل سنگین بودن فراخوانی syscall و رفتن به Kernel و پردازش درخواست و بازگشتن به User Mode در فضای آدرسدهی پروسه قرار میگیرند که کار فراخوانی سریعتر شده و نیاز به طی مسیر پیشفرض syscallها نباشد.
در لینوکس کل فضای در اختیار پروسه در دسترس بوده و امکان dump آن به کمک dd وجود دارد. در این ویدئو مروری بر روی کاربرد vDSO انجام گرفته، علت استفاده از آن به جای vsyscall شرح داده شده و به dump و بررسی vDSO و مشاهدهی توابع تعریف شده در آن میپردازیم.
ℹ️پ.ن: اگر دوست دارید که جزئیات system callها را در لینوکس بدانید، لینک انتهای پست را در کانالم چک کنید. من قبلا در یک ارائه جزئیات system callهای لینوکس از شیوهی تعریف آنها، نحوهی اضافه کردن یک syscall به کرنل لینوکس و جزئیاتی که در فراخوانی system callهای لینوکس وجود دارد را به صورت کامل شرح دادهام که میتوانید ویدئوی آنرا مشاهده کنید.
لینک ویدئوی vDSO در یوتیوب:
https://youtu.be/UK6annv-t-s
لینک ویدئوی vDSO در آپارات:
https://aparat.com/v/7HRz1
لینک پست مربوط به جزئیات syscall در لینوکس:
https://t.me/OxAA55/87
#ShortLinuxInternals #linux #internals #syscalls #systemcalls #ELF #dump #memory
Post #122
3.78K