موضوع مقاله: EBPF | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # EBPF | مقدمه: eBPF فناوری است که می تواند برنامه‌ها را در یک محیط محافظت‌شده مانند هسته سیستم عامل اجرا کند. | ## بخش 1: EBPF | این جانشینی برای مکانیزم قبلی فیلترینگ در لینوکس با نام فیلتر بسته برکلی (BPF، با "e" در اصل به معنای "بسط یافته") می‌باشد و همچنین در سایر بخش‌های کرنل لینوکس نیز استفاده می‌شود. از eBPF برای گسترش ایمن و کارآمد قابلیت‌های هسته در زمان اجرا بدون نیاز به تغییر در کد منبع کرنل یا بارگیری ماژول‌های کرنل استفاده می‌شود. ایمنی توسط یک مکانیزم تأیید کننده در داخل کرنل که تجزیه و تحلیل کد ایستا را انجام می‌دهد تضمین می‌شود، بدین صورت که برنامه‌هایی را که از کار می‌افتند، هنگ می‌کنند یا با کرنل تداخل دارند را رد می‌کند. این مدل اعتبار سنجی با محیط‌های جعبه شنی (جایی که محیط اجرا محدود است و زمان اجرا دیدی در مورد برنامه ندارد) متفاوت است. نمونه‌هایی از برنامه‌هایی که به‌طور خودکار رد می‌شوند، برنامه‌هایی هستند که تضمین‌های خروج قوی ندارند (به عنوان مثال حلقه‌های for/while بدون شرایط خروج) و برنامه‌هایی که مقادیر نشانگرها را بدون بررسی از حافظه دریافت می‌کنند. توسعه دهنده پس از ایجاد ، آن‌ها را به دستورهای معماری ماشین eBPF کامپایل می‌کند. این فایل توسط یک برنامه دیگر (در اینجا به نام برنامه کنترلی به آن ارجا می‌کنیم) به درون هسته سیستم عامل بارگذاری می‌شود. این برنامه از فراخوانی‌های سیستمی برای این عمل استفاده می‌کند که معمولاً با استفاده از کتابخانه‌هایی مانند libbpf این فرایند تسهیل می‌شود. برنامه‌های بارگذاری‌شده که از تأییدکننده عبور کرده‌اند یا تفسیر می‌شوند (این روش منسوخ شده است) یا برای عملکرد بهتر درجا در هسته کامپایل می‌شوند. برنامه کنترلی می‌تواند برنامه‌های بارگذاری شده را به انواع رویدادهای سطح پایین سیستمی قلاب کند. به این معنا که پس از اتصال برنامه به یک رویداد خاص، به ازای هر رویداد برنامه مورد نظر فراخوانی و دستورهایش اجرا می‌شود. برای اینکه بتوان برنامه‌ای را به یک رویداد خاص قلاب کرد نیاز است که در هسته این امکان پیاده‌سازی شده باشد. | ## بخش 2: EBPF | برای مثال در برنامه‌های مرتبط با شبکه این امکان فراهم شده است تا برنامه ساز eBPF بتواند در هنگام دریافت یک بسته (packet) در سطح درایور کارت شبکه اطلاعات بسته را مشاهده کرده و عمل متناسب را اتخاذ کند. برای فراهم کردن این امکان، درایورهای کارت شبکه باید امکان اتصال یک برنامه eBPF و فراخوانی آن در زمان مناسب را پیاده‌سازی کنند. اهمیت این موضوع در این است که قابلیت برنامه‌های eBPF از نحوه پیاده‌سازی قلاب‌ها حاصل می‌شود. به عنوان مثال، به صورت رسمی قلابی در رابط درایو حالت جامد وجود ندارد ولی به صورت تحقیقاتی نشان داده شده است که با پیاده‌سازی مناسب می‌تواند کاربردی باشد. موارد استفاده از eBPF شامل شبکه هایی مانند XDP ، ردیابی و زیرسیستم های امنیتی است (که البته به این‌ها محدود نیست). با توجه به کارایی و انعطاف eBPF که فرصت‌های جدیدی را برای حل مشکلات فراهم کرده است، برندان گرگ eBPF را «ابرقدرت لینوکس» نامیده است. به دلیل موفقیت در لینوکس، زمان اجرای eBPF در سیستم عامل های دیگر مانند ویندوز نیز مورد استفاده قرار گرفته است. در عوض، برای اینکه نیاز برنامه‌های حالتمند (stateful) برطرف شود، این قابلیت وجود دارد تا در زمان بارگذاری بخشی از حافظه هسته به برنامه اختصاص یابد. الزامی است که برنامه تهی (Null) نبودن اشاره‌گر دریافتی را قبل از ارجاع به آن بررسی کند (تاییدگر این عمل را الزامی می‌داند). این طراحی سربار پایین‌تری در مقایسه با روش تعویض زمینه برای اجرای برنامه ایجاد می‌کند. اما در نقطه مقابل، پیش‌آمد خطا و اشکال درون برنامه eBPF منجر به توقف هسته می‌شود که درنتیجه آن کارکرد سیستم مختل می‌گردد. به همین منظور در طراحی eBPF صحت سنجی اجرای برنامه اجباری در نظر گرفته شده است و تنها توسط خود هسته انجام می‌شود (این تصمیم توسعه دهندگان لینوکس بوده است. | ## بخش 3: EBPF | همچنین محققان راه‌های جایگزین مانند ارائه گواهی صحت سنجی به هسته را بررسی کرده‌اند). درستی ارجاعات به حافظه: تمام ارجاعات حافظه در یک برنامه eBPF باید به آدرسی از حافظه که در تعلق برنامه است باشد. اگر آدرس حافظه به پشته برنامه تعلق دارد، باید حتماً قبل از خواند، مقدار در آن نوشته شده باشد. خاتمه جریان اجرای برنامه: اثبات خاتمه برنامه‌های eBPF با بررسی تمام حالات ممکن اجرای برنامه صورت می‌گیرد. برای محدود کردن زمان اجرای صحت سنجی بررسی هر شاخه ممکن از اجرای برنامه به یک میلیون دستور (در سطح ماشین eBPF) محدود شده است. رهاسازی قفل: در صورتی که برنامه eBPF یک قفل را در یک مسیر اجرای برنامه دراختیار بگیرد حتماً باید آن را قبل از پایان برنامه و یا اجرای تابعی دیگر رها کند. در پایین ترین سطح، از ده رجیستر ۶۴ بیتی (به جای دو رجیستر طولانی ۳۲ بیتی برای cBPF)، مکانیزم پرش متفاوت، دستورالعمل فراخوانی و کنوانسیون عبور از رجیستر مربوطه، دستورالعمل‌های جدید و رمزگذاری متفاوت استفاده کرده است. نام تجاری نام مستعار eBPF و BPF که اغلب به جای هم استفاده می‌شوند، برای مثال توسط جامعه هسته لینوکس مورد استفاده قرار گرفته است. eBPF بر بستر فیلتر بسته برکلی تکامل یافته است، اما موارد استفاده آن از BPF پیشی گرفته است. شگون‌نماهای غیررسمی دیگری باری eBPF در گذشته وجود داشته است، که با پذیرش گسترده‌ای مواجه نشده بودند. کنترل و راهبری بنیاد eBPF در آگوست ۲۰۲۱ با هدف گسترش مشارکت های انجام شده بر روی eBPF ایجاد شده است. | ## جمع‌بندی | هدف جمع‌آوری، برنامه‌ریزی و صرف بودجه برای حمایت از پروژه های منبع باز، داده باز و/یا استانداردهای باز مرتبط با eBPF است تا رشد اکوسیستم eBPF را بیشتر کند.