COMPEL(1) CRIU Manual COMPEL(1)

compel - اجرای کد انگل در داخل یک فرآیند دیگر

compel hgen [option ...]

compel plugins [PLUGIN_NAME ...]

compel [--compat] includes | cflags | ldflags

compel [--compat] [--static] libs

ابزار compel یک ابزار کاربردی برای اجرای کد دلخواه (که کد انگل یا parasite code نیز نامیده می‌شود) در بستر و زمینه یک فرآیند بیگانه دیگر است. کد انگل پس از کامپایل با پرچم‌های compel و بسته‌بندی، می‌تواند در زمینه تسک‌های دیگر اجرا شود. در حال حاضر تنها یک روش برای بارگذاری باینری انگل در تسک قربانی با استفاده از libcompel.a وجود دارد که هدر سی (c-header) نامیده می‌شود.

hgen

ایجاد یک فایل هدر از پرونده po. که باینری انگل است.

plugins

چاپ پلاگین‌های موجود.

ldflags

چاپ فلگ‌های ldflags موجود برای compel هنگام پیوند دادن (link) کد انگل.

cflags

چاپ cflags در compel برای استفاده هنگام کامپایل کد انگل.

includes

چاپ فهرست پوشه‌های پیش‌فرض include.

libs

چاپ فهرست کتابخانه‌های ایستا یا پویا که compel می‌تواند با آن‌ها پیوند برقرار کند.

-f, --file FILE

مسیر پرونده باینری FILE که compel باید آن را به یک هدر تبدیل کند.

-o, --output FILE

مسیر پرونده هدر FILE که compel باید هدر نهایی را در آن بنویسد.

-p, --prefix NAME

تعیین پیشوند برای نام متغیرها.

-l, --log-level NUM

سطح پیش‌فرض گزارش‌گیری در compel.

-h, --help

چاپ راهنمای استفاده و خروج.

-V, --version

چاپ شماره نسخه compel.

#include <compel/plugins/std.h>

int parasite_trap_cmd(int cmd, void *args); // فراخوانی‌شده توسط ()compel_run_in_thread

int parasite_daemon_cmd(int cmd, void *arg); // فراخوانی‌شده توسط ()compel_rpc_call و ()compel_rpc_call_sync

void parasite_cleanup(void); // هنگام تخلیه انگل توسط ()compel_cure فراخوانی می‌شود

کد انگل کامپایل شده و با استفاده از compel به یک هدر تبدیل می‌شود و در اینجا قرار می‌گیرد.

#include <compel/infect.h>

#include "parasite.h"

مراحل زیر برای آلوده کردن فرآیند قربانی انجام می‌شوند:

•
توقف تسک: int compel_stop_task(int pid);
•
آماده‌سازی دستگیره آلودگی: struct parasite_ctl *compel_prepare(int pid);
•
اجرای فراخوانی سیستمی: int compel_syscall(ctl, int syscall_nr, long *ret, int arg ...);
•
آلوده کردن قربانی: int compel_infect(ctl, nr_thread, size_of_args_area);
•
درمان قربانی: int compel_cure(ctl); // اشاره‌گر ctl با این فراخوانی آزاد می‌شود
•
ازسرگیری قربانی: int compel_resume_task(pid, orig_state, state) یا int compel_resume_task_sig(pid, orig_state, state, stop_signo). // تابع ()compel_resume_task_sig می‌تواند در حالتی که قربانی در وضعیت متوقف است استفاده شود. مقدار stop_signo را می‌توان با فراخوانی ()compel_parse_stop_signo خواند.

اشاره‌گر ctl باید با فراخوانی PREFIX_setup_c_header() همراه با ctl به عنوان آرگومان، با اطلاعات باینری پیکربندی شود. PREFIX آرگومانی است که هنگام فراخوانی hgen به گزینه -p داده شده است؛ در غیر این صورت از نام پرونده استخراج می‌شود.

برای تولید یک پرونده هدر (h.) از یک پرونده باینری انگل (po.) از دستور زیر استفاده کنید:

compel hgen -f parasite.po -o parasite.h

پرونده parasite.po با کامپایل کردن کد منبع انگل با فلگ‌های compel و لینک کردن آن با پلاگین‌های compel به دست می‌آید.

تیم توسعه CRIU.

07/29/2025 criu 4.1.1