میگل اوجدا، نویسنده پروژه Rust-for-Linux، گزینه سومی را برای توسعه درایورهای دستگاه به زبان Rust برای توسعه دهندگان هسته لینوکس پیشنهاد کرده است. پشتیبانی Rust آزمایشی در نظر گرفته میشود، اما قبلاً برای گنجاندن در شاخه بعدی لینوکس توافق شده است. بودجه این توسعه توسط Google و ISRG (گروه تحقیقاتی امنیت اینترنت) که بنیانگذار پروژه Let's Encrypt است و HTTPS و توسعه فناوریهایی را برای بهبود امنیت اینترنت ترویج میکند، تامین میشود.
به یاد بیاورید که تغییرات پیشنهادی استفاده از Rust را به عنوان زبان دوم برای توسعه درایورها و ماژولهای هسته ممکن میسازد. پشتیبانی Rust بهعنوان گزینهای ارائه میشود که بهطور پیشفرض فعال نیست و باعث نمیشود که Rust بهعنوان یک وابستگی ساخت مورد نیاز برای هسته گنجانده شود. استفاده از Rust برای توسعه درایور به شما این امکان را میدهد که با کمترین تلاش، درایورهای ایمنتر و بهتری ایجاد کنید، بدون مشکلاتی مانند دسترسی به حافظه پس از آزادسازی، عدم ارجاع اشارهگر تهی، و بیش از حد بافر.
ایمنی حافظه در Rust در زمان کامپایل از طریق بررسی مرجع، پیگیری مالکیت شی و طول عمر شی (محدوده)، و همچنین از طریق ارزیابی صحت دسترسی به حافظه در طول اجرای کد ارائه می شود. Rust همچنین محافظت در برابر سرریز اعداد صحیح را فراهم می کند، نیاز به مقداردهی اولیه اجباری مقادیر متغیر قبل از استفاده دارد، خطاها را در کتابخانه استاندارد بهتر مدیریت می کند، مفهوم مراجع و متغیرهای غیرقابل تغییر را به طور پیش فرض اعمال می کند، تایپ استاتیک قوی برای به حداقل رساندن خطاهای منطقی ارائه می دهد.
نسخه جدید وصله ها همچنان به حذف نظراتی که در حین بحث در مورد نسخه اول و دوم وصله ها گفته شده است، ادامه می دهد. قابل توجه ترین تغییرات:
- انتقالی به استفاده از انتشار پایدار Rust 1.57 به عنوان کامپایلر مرجع انجام شده است و پیوندی به نسخه تثبیت شده زبان Rust 2021 ارائه شده است. قبلاً، وصلهها به شاخه بتا Rust گره خورده بودند و از برخی ویژگیهای زبان استفاده میکردند که به عنوان ناپایدار طبقه بندی شدند. انتقال به مشخصات Rust 2021 به ما اجازه داد تا برای جلوگیری از استفاده از ویژگیهای ناپایدار در وصلههایی مانند const_fn_transmute، const_panic، const_unavailable_unchecked و core_panic و try_reserve، کار را آغاز کنیم.
- توسعه نسخه تخصیص کتابخانه Rust که در وصلهها موجود است ادامه یافته است، به گونهای که برای خلاص شدن از عملکردهای تخصیص حافظه از تولید احتمالی حالت "هراس" در هنگام بروز خطاها، مانند کمبود حافظه، اصلاح شده است. نسخه جدید گزینههای «no_rc» و «no_sync» را برای غیرفعال کردن عملکردی که در کد Rust هسته استفاده نمیشود، اجرا میکند و کتابخانه را ماژولارتر میکند. کار با توسعه دهندگان اصلی alloc با هدف انتقال تغییرات مورد نیاز برای هسته به کتابخانه اصلی ادامه دارد. گزینه "no_fp_fmt_parse" که برای کارکردن کتابخانه در سطح هسته لازم است، به کتابخانه پایه Rust (هسته) منتقل شده است.
- کد برای خلاص شدن از شر هشدارهای احتمالی کامپایلر هنگام ساختن هسته در حالت CONFIG_WERROR پاک شده است. هنگام ساخت کد در Rust، حالت های تشخیصی کامپایلر اضافی و هشدارهای Clippy linter فعال می شوند.
- انتزاعها برای استفاده در کد Rust برای Seqlockها (قفلهای دنبالهای)، تماسهای برگشتی برای مدیریت انرژی، حافظه ورودی/خروجی (readX/writeX)، کنترلکنندههای وقفه و رشته، GPIO، دسترسی به دستگاهها، درایورها و اعتبارنامهها پیشنهاد شدهاند.
- ابزارهای توسعه درایور برای شامل mutexes قابل جابجایی، تکرارکننده بیت، اتصال اشاره گر ساده، تشخیص خطای بهبود یافته و زیرساخت مستقل از گذرگاه داده گسترش یافته است.
- بهبود کار با پیوندها با استفاده از نوع Ref ساده شده، بر اساس باطن refcount_t، که از API هسته با همین نام برای شمارش مراجع استفاده می کند. پشتیبانی از انواع Arc و Rc ارائه شده در کتابخانه استاندارد alloc حذف شده است و در کدهای اجرا شده در سطح هسته در دسترس نیست (گزینه هایی برای خود کتابخانه آماده شده است که این انواع را غیرفعال می کند).
- وصله ها شامل نسخه ای از درایور PL061 GPIO است که در Rust بازنویسی شده است. ویژگی خاص درایور این است که پیاده سازی آن تقریباً خط به خط، درایور GPIO موجود را در زبان C تکرار می کند. برای توسعه دهندگانی که می خواهند با ایجاد درایورها در Rust آشنا شوند، یک مقایسه خط به خط آماده شده است که به آنها اجازه می دهد بفهمند کد C به کدام ساختارها در Rust تبدیل شده است.
- پایگاه کد اصلی Rust، rustc_codegen_gcc را، یک backend rustc برای GCC که کامپایل پیش از زمان (AOT) را با استفاده از کتابخانه libgccjit پیادهسازی میکند، پذیرفته است. با توسعه مناسب backend، به شما این امکان را می دهد که کد Rust موجود در هسته را با استفاده از GCC جمع آوری کنید.
- علاوه بر ARM، گوگل و مایکروسافت، Red Hat نیز علاقه خود را به استفاده از زبان Rust در هسته لینوکس ابراز کرده است. به یاد بیاوریم که گوگل به طور مستقیم از پروژه Rust برای لینوکس پشتیبانی می کند، در حال توسعه یک پیاده سازی جدید از مکانیسم ارتباط بین پردازشی Binder در Rust است و امکان کار مجدد درایورهای مختلف در Rust را در نظر می گیرد. مایکروسافت اجرای درایورهای Hyper-V را در Rust آغاز کرده است. ARM در حال تلاش برای بهبود پشتیبانی Rust برای سیستم های مبتنی بر ARM است. IBM پشتیبانی Rust را در هسته سیستم های PowerPC پیاده سازی کرده است.
منبع: opennet.ru