پروژه Rust for Linux یک RFC جدید منتشر کرده که یکی از مهمترین قدمها برای گسترش Rust در زیرسیستمهای کرنل محسوب میشود.
در این RFC، سه تغییر مهم پیشنهاد شده است:
✅ اضافه شدن APIهای SMBus برای I2C در Rust
✅ طراحی اولین Abstraction برای Power Supply Class
✅ پیادهسازی اولین Driver شارژر باتری (SMB347) با زبان Rust
چرا این RFC مهم است؟
تا امروز، اگر قصد داشتید یک Driver مربوط به باتری یا شارژر را با Rust بنویسید، دو مانع اساسی وجود داشت:
• هیچ Abstraction امنی برای Power Supply Class در Rust وجود نداشت.
• I2C Client فقط عملیات مدیریت Device را انجام میداد و امکان خواندن یا نوشتن Registerهای سختافزار را فراهم نمیکرد.
در نتیجه، توسعه Driverهای واقعی تقریباً غیرممکن بود.
بخش اول: توسعه APIهای I2C
در این RFC توابعی مانند:
•
smbus_read_byte_data()•
smbus_write_byte_data()•
smbus_update_bits()به I2C Client اضافه شدهاند.
تابع
smbus_update_bits() همان الگوی معروف Read → Modify → Write را پیادهسازی میکند؛ الگویی که تقریباً در تمام Driverهای کرنل برای تغییر بخشی از بیتهای یک Register استفاده میشود.بخش دوم: Power Supply Abstraction
مهمترین قسمت این RFC، معرفی یک Abstraction جدید برای زیرسیستم Power Supply است.
در این طراحی، Driver فقط کافی است:
• نام Device را مشخص کند.
• نوع Power Supply را تعیین کند.
• لیست Propertyهای قابل پشتیبانی را معرفی کند.
• تابع
get_property() را پیادهسازی کند.تمام جزئیات ارتباط با Power Supply Core در پشت یک API ایمن پنهان شده است.
علاوه بر این، Registration نیز با الگوی RAII طراحی شده تا فرآیند Register و Unregister شدن Driver بهصورت خودکار مدیریت شود.
بخش سوم: اولین Driver واقعی
برای اثبات کارایی این Abstraction، توسعهدهنده یک نسخه Rust از Driver مربوط به شارژر Summit SMB347 پیادهسازی کرده است.
این Driver:
• از طریق I2C با چیپ ارتباط برقرار میکند.
• Registerهای وضعیت را میخواند.
• وضعیت شارژ را به Power Supply Core گزارش میدهد.
• اطلاعاتی مانند:
STATUS
ONLINE
CHARGE_TYPE
را از طریق مسیر استاندارد:
/sys/class/power_supplyدر اختیار فضای کاربر قرار میدهد.
از دید کاربران لینوکس، این Driver دقیقاً مانند Driverهای نوشتهشده با C رفتار میکند.
نکته جالب
در فرآیند Review، یکی از توسعهدهندگان Rust for Linux پیشنهاد کرد که APIهای SMBus بهصورت توابع مستقل اضافه نشوند و در عوض،
I2cClient مستقیماً Trait استاندارد kernel::io::Io را پیادهسازی کند.نویسنده RFC نیز این پیشنهاد را پذیرفت و اعلام کرد که نسخه بعدی Patch بر اساس معماری جدید بازنویسی خواهد شد.
این دقیقاً همان چیزی است که توسعه کرنل لینوکس را جذاب میکند؛ طراحی APIها قبل از Merge شدن، چندین بار توسط Maintainerها بازبینی و اصلاح میشوند تا در نهایت بهترین معماری ممکن وارد Mainline شود.
اگر این RFC در نهایت پذیرفته شود، یکی از زیرسیستمهای مهم کرنل یعنی Power Supply نیز به فهرست بخشهایی اضافه خواهد شد که توسعه Driverهای آن با Rust امکانپذیر است؛ گامی دیگر در مسیر گسترش تدریجی Rust در هسته لینوکس.
@Amin_Techlab

