نسخه ششم وصله های هسته لینوکس با پشتیبانی از زبان Rust

Miguel Ojeda، نویسنده پروژه Rust-for-Linux، انتشار کامپوننت های v6 را برای توسعه درایورهای دستگاه به زبان Rust برای بررسی توسط توسعه دهندگان هسته لینوکس پیشنهاد کرد. این هفتمین ویرایش از وصله ها با در نظر گرفتن نسخه اول است که بدون شماره نسخه منتشر شده است. پشتیبانی Rust تجربی در نظر گرفته می شود، اما در حال حاضر در شاخه لینوکس-next گنجانده شده است و به اندازه کافی برای شروع کار بر روی ایجاد لایه های انتزاعی بر روی زیرسیستم های هسته، و همچنین نوشتن درایورها و ماژول ها توسعه یافته است. بودجه این توسعه توسط گوگل و ISRG (گروه تحقیقاتی امنیت اینترنت) که بنیانگذار پروژه Let’s Encrypt است و HTTPS و توسعه فناوری‌هایی را برای بهبود امنیت اینترنت ترویج می‌کند، تامین می‌شود.

در نسخه های جدید:

  • جعبه ابزار و گونه‌ای از کتابخانه تخصیص، که از ایجاد حالت "هولناک" در هنگام بروز خطا آزاد شده است، به نسخه Rust 1.60 به روز شده است که پشتیبانی از حالت "maybe_uninit_extra" مورد استفاده در وصله‌های هسته را تثبیت می‌کند.
  • قابلیت اجرای آزمایش‌ها از مستندات (تست‌هایی که به عنوان نمونه در مستندات نیز استفاده می‌شوند)، از طریق تبدیل آزمایش‌های مرتبط با API هسته به آزمایش‌های KUnit که در حین بارگذاری هسته اجرا می‌شوند، اضافه شد.
  • الزاماتی اتخاذ شده است که آزمایش‌ها نباید مانند کد هسته Rust منجر به هشدار Clippy linter شود.
  • اجرای اولیه ماژول "شبکه" با توابع شبکه پیشنهاد شده است. کد Rust به ساختارهای شبکه کرنل مانند Namespace (بر اساس ساختار هسته struct net)، SkBuff (struct sk_buff)، TcpListener، TcpStream (struct socket)، Ipv4Addr (struct in_addr)، SocketAddrV4 (Structurk sockadents) و IPV6 دسترسی دارد. .
  • پشتیبانی اولیه برای تکنیک های برنامه نویسی ناهمزمان (async) وجود دارد که در قالب ماژول kasync پیاده سازی شده است. برای مثال، می‌توانید کد ناهمزمان برای دستکاری سوکت‌های TCP بنویسید: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; حلقه { let n = stream.read(&mut buf).wait?; اگر n == 0 { بازگشت Ok(()); } stream.write_all(&buf[..n]).wait?; } }
  • ماژول net::filter برای دستکاری فیلترهای بسته شبکه اضافه شد. نمونه rust_netfilter.rs با اجرای فیلتر در زبان Rust اضافه شد.
  • اضافه شدن اجرای یک mutex smutex::Mutex ساده که نیازی به پین ​​کردن ندارد.
  • NoWaitLock اضافه شده است که هرگز منتظر قفل نمی ماند و اگر توسط رشته دیگری اشغال شود، به جای توقف تماس گیرنده، هنگام تلاش برای دریافت قفل، خطا گزارش می شود.
  • RawSpinLock اضافه شده است که توسط raw_spinlock_t در هسته شناسایی شده است تا در بخش هایی اعمال شود که نمی توانند بیکار باشند.
  • نوع Aref برای ارجاع به یک شی که مکانیسم شمارش مرجع روی آن اعمال می شود (همیشه مجدداً شمارش می شود) اضافه شد.
  • باطن rustc_codegen_gcc، که به شما امکان می دهد از کتابخانه libgccjit از پروژه GCC به عنوان یک تولید کننده کد در rustc برای ارائه rustc با پشتیبانی از معماری ها و بهینه سازی های موجود در GCC استفاده کنید، توانایی بوت استرپ کردن کامپایلر rustc را پیاده سازی کرده است. ارتقاء کامپایلر به معنای توانایی استفاده از یک مولد کد مبتنی بر GCC در rustc برای ساخت خود کامپایلر rustc است. علاوه بر این، نسخه اخیر GCC 12.1 شامل اصلاحاتی برای libgccjit است که برای rustc_codegen_gcc لازم است تا درست کار کند. آماده سازی برای ارائه قابلیت نصب rustc_codegen_gcc با استفاده از ابزار rustup در حال انجام است.
  • پیشرفت در توسعه GCC frontend gccrs با اجرای کامپایلر زبان Rust بر اساس GCC ذکر شده است. در حال حاضر دو توسعه دهنده تمام وقت بر روی gccrs کار می کنند.

به یاد بیاورید که تغییرات پیشنهادی استفاده از Rust را به عنوان زبان دوم برای توسعه درایورها و ماژول‌های هسته ممکن می‌سازد. پشتیبانی Rust به‌عنوان گزینه‌ای ارائه می‌شود که به‌طور پیش‌فرض فعال نیست و باعث نمی‌شود که Rust به‌عنوان یک وابستگی ساخت مورد نیاز برای هسته گنجانده شود. استفاده از Rust برای توسعه درایور به شما این امکان را می‌دهد که با کمترین تلاش، درایورهای ایمن‌تر و بهتری ایجاد کنید، بدون مشکلاتی مانند دسترسی به حافظه پس از آزادسازی، عدم ارجاع اشاره‌گر تهی، و بیش از حد بافر.

ایمنی حافظه در Rust در زمان کامپایل از طریق بررسی مرجع، پیگیری مالکیت شی و طول عمر شی (محدوده)، و همچنین از طریق ارزیابی صحت دسترسی به حافظه در طول اجرای کد ارائه می شود. Rust همچنین محافظت در برابر سرریز اعداد صحیح را فراهم می کند، نیاز به مقداردهی اولیه اجباری مقادیر متغیر قبل از استفاده دارد، خطاها را در کتابخانه استاندارد بهتر مدیریت می کند، مفهوم مراجع و متغیرهای غیرقابل تغییر را به طور پیش فرض اعمال می کند، تایپ استاتیک قوی برای به حداقل رساندن خطاهای منطقی ارائه می دهد.

منبع: opennet.ru

اضافه کردن نظر