Syscall در لینوکس چیست؟

Syscall

در لینوکس، سیستم‌کال (Syscall) رابطی است که از طریق آن برنامه‌های کاربر می‌توانند با هسته سیستم‌عامل ارتباط برقرار کنند.در این مطلب، به بررسی فراخوانی‌های سیستمی لینوکس خواهیم پرداخت که اغلب در مصاحبه‌های DevOps و SRE، به ویژه در شرکت‌های برتر، مورد بحث قرار می‌گیرند.
همه افراد در DevOps نمی‌توانند روزانه با اجزای داخلی سیستم کار کنند یا مشکلات عملکرد را عیب‌یابی کنند. این کاملا به ماهیت شغل و پروژه‌هایی که برای کار انتخاب می‌کنید بستگی دارد. با این حال، برای افراد DevOps/SRE بسیار مهم است که درک قوی از عیب‌یابی سیستم داشته باشند زیرا ما معمولا با سرورها کار می‌کنیم.

Syscall یک مفهوم اساسی در این زمینه است. برای شروع، باید در مورد چند اصل اساسی توضیح بدهم.

فضای کرنل (Kernel Space)

جایی است که هسته سیستم عامل، کرنل، عمل می‌کند.
کرنل یک برنامه کامپیوتری در هسته سیستم عامل کامپیوتر است که مدام کنترل کاملی بر همه چیز در سیستم دارد.
کرنل همه چیز را کنترل می‌کند: حافظه، فرآیندها، سخت‌افزار، درایورها، امنیت و موارد دیگر. همچنین، مستقیم با CPU، RAM، دیسک و سایر سخت‌افزارها در تعامل است و دسترسی نامحدودی به تمام منابع سیستم دارد.

فضای کاربری (Userspace)

محیطی است که اپلیکیشن‌های کاربر (وب سرورها، کروم، ویرایشگرهای متن، ابزارهای فرمان و غیره) در آن اجرا می‌شوند و مانند یک منطقه محدود است زیرا نمی‌تواند مستقیم به سخت‌افزار دسترسی داشته باشد یا منابع سیستم را مدیریت کند.
به همین دلیل است که معمولا اگر یک برنامه از کار بیفتد، کل سیستم عامل از کار نمی‌افتد.

فراخوانی‌های سیستمی (Syscall )

برنامه‌های موجود در فضای کاربری برای دسترسی به منابع سیستم به فضای کرنل نیاز دارند.
این ارتباط از طریق فراخوان‌های سیستمی (Syscalls) مدیریت می‌شود.
در این ارتباط، کرنل به عنوان یک واسطه عمل نموده و اطمینان حاصل می‌کند که برنامه‌های فضای کاربری سیستم را خراب نمی‌کنند.

فراخوانی‌های سیستمی بخشی از کرنل هستند. آن‌ها به عنوان توابعی در فضای کرنل پیاده‌سازی می‌شوند که برنامه‌های کاربر می‌توانند با استفاده از دستورالعمل‌ها یا کتابخانه‌های خاص (مانند کتابخانه C، glibc) به آن‌ها دسترسی پیدا کنند.

مثال عملی: دستور ls

برای درک بهتر تعامل بین فضای کاربر و فضای کرنل، بیایید یک مثال واقعی با استفاده از دستور ساده ls در لینوکس را در نظر بگیریم.

ls یک ابزار فضای کاربر است که محتویات دایرکتوری را فهرست می‌کند.

هر بار که ls را برای فهرست کردن فایل‌ها تایپ می‌کنید، سیستم شما مخفیانه ده‌ها فراخوانی سیستمی برای ارتباط با کرنل انجام می‌دهد.

تصویر زیر به شما ایده‌ای از نحوه وقوع همه این تعاملات، از کاربر تا سخت‌افزار سیستم (دیسک) از طریق کرنل، می‌دهد.

خرید VPS لینوکس با دسترسی کامل SSH و منابع اختصاصی، مناسب برای برنامه‌نویسان، توسعه‌دهندگان و مدیران سایت در پارسدو فراهم است.

انواع فراخوانی‌های سیستمی

حالا، بیایید به انواع فراخوانی‌های سیستمی نگاهی بیندازیم.

توابع فراخوانی سیستمی که در زیر آورده شده است، توابع کتابخانه C هستند، اما آن‌ها پوشش‌هایی در اطراف فراخوانی‌های سیستمی ارائه شده توسط سیستم عامل هستند.
این توابع به صورت داخلی فراخوانی‌های سیستمی لینوکس را برای تعامل با کرنل فراخوانی می‌کنند.

۱. کنترل فرآیند (Process Control)

برای مدیریت فرآیندها (ایجاد، خاتمه، اجرا).

  • ()fork: ایجاد یک فرآیند جدید.
  • ()exec: جایگزینی فرآیند فعلی با یک برنامه جدید.
  • ()exit: خاتمه دادن به یک فرآیند.
  • ()wait: مکث تا پایان یافتن یک فرآیند فرزند.
  • ()kill: ارسال سیگنال به فرآیندها (مثلا خاتمه دادن یا مکث).

۲. مدیریت فایل ( File Management)

برای مدیریت عملیات فایل (خواندن، نوشتن، تغییر متا دیتا).
• ()open: باز کردن یک فایل برای خواندن/نوشتن.
• ()close: آزادسازی دسترسی به یک فایل.
•()read: خواندن داده‌ها از یک فایل.
• ()write: نوشتن داده‌ها در یک فایل.
• ()unlink: حذف یک فایل.
• ()chmod: تغییر مجوزهای فایل.

۳. مدیریت دیوایس (Device Management)

برای کنترل دستگاه‌های سخت‌افزاری (که در سیستم‌های شبه یونیکس (Unix-like) به عنوان فایل در نظر گرفته می‌شوند).
• ()ioctl: پیکربندی عملیات خاص دیوایس.
• ()read: خواندن داده‌ها از یک دیوایس.
• ()write: نوشتن داده‌ها در یک دیوایس.

۴. نگهداری اطلاعات (Information Maintenance)

برای دریافت یا تنظیم داده‌های سیستم و فرآیند.
• ()getpid: بازیابی شناسه فرآیند فعلی.
• ()time: دریافت زمان سیستم.
• ()sysinfo: بررسی میزان استفاده از منابع سیستم.
• ()setpriority: تنظیم اولویت زمان‌بندی فرآیند.

۵. ارتباط (IPC)

برای فعال کردن ارتباط بین فرآیندی (IPC) یا شبکه.
• ()pipe: ایجاد یک کانال داده یک طرفه.
•()shmget: تخصیص حافظه مشترک.
• ()socket: برقراری ارتباط شبکه.
• ()send: انتقال داده‌ها از طریق شبکه.
• ()recv: دریافت داده‌ها از طریق شبکه.

جمع بندی

استفاده از فراخوانی‌های سیستمی (Syscall) در کارهای روزمره بسیار نادر است، مگر اینکه با برنامه‌نویسی سطح پایین سیستم، توسعه کرنل، تنظیم عملکرد و غیره کار کنید.
با این حال، درک فراخوانی‌های سیستمی می‌تواند در نقش‌هایی مانند DevOps، SRE و مهندسی backend هنگام عیب‌یابی مشکلات عملکرد، دیباگ برنامه‌ها و غیره مفید باشد.