آیا میتوان یک سیستمعامل متعلق به سال ۱۹۹۱ را بدون تغییر در رفتار اصلی، به کدهایی ایمن و مدرن تبدیل کرد؟ پروژه linux-0.11-rs ثابت میکند که پاسخ مثبت است. این پروژه با بازنویسی کامل هسته لینوکس ۰.۱۱ (Linux 0.11) از پایه در زبان راست (Rust)، یک سیستم عملیاتی i386 ساخته است که در محیط QEMU بوت شده و یک محیط کاربر سبک مدل یونیکس (self-hosted Unix-style userland) را اجرا میکند.
این تلاش دقیقاً در زمانی رخ میدهد که برنامهنویسی سیستمها از زبان C به سمت زبانهایی میرود که خطاهای رایج حافظه را پیشگیری میکنند. این روند جایگزینی سیستمهای قدیمی با پیادهسازیهای مدرن در راست، مشابه آنچه در پروژه pgrust برای بازنویسی PostgreSQL دیدیم، در حال گسترش است. در حالی که لینوکس ۰.۱۱ اصلی بر مدیریت دستی حافظه متکی بود، این بازنویسی از مدل مالکیت (Ownership) در راست برای اعمال مرزهای واضحتر بین ماژولها و تضمینهای نوعی (Type Guarantees) قویتر استفاده میکند. این پروژه در واقع به عنوان یک پل کاربردی بین طراحی سیستمعاملهای قدیمی و ایمنی زبانهای مدرن عمل میکند.
زمینه پروژه (Context)
توسعه این پروژه به شدت بر منابع اصلی تکیه دارد. نویسنده پروژه از مخزن yuan-xy/Linux-0.11 به دلیل ارائه سورس کد اصلی هسته به عنوان مرجع استفاده کرده است. همچنین، پروژه rcore-os/rCore-Tutorial-v3 به عنوان یکی از منابع الهامبخش برای پیادهسازیهای مختلف در این سیستم ذکر شده است.
جزئیات فنی (Details)
به نقل از مخزن گیتهاب این پروژه، هسته از نظر ویژگیها در مقایسه با لینوکس ۰.۱۱ تقریباً کامل است، هرچند پشتیبانی از فلاپیدیسک تعمداً در محدوده اهداف پروژه قرار نگرفته و حذف شده است. بر اساس مستندات فنی، این سیستم مکانیزمهای حیاتی سطح پایین زیر را پیادهسازی کرده است:
- حافظه مجازی با قابلیت Demand Paging و کپی هنگام نوشتن (CoW) در فرآیندهای Fork.
- یک جدول کامل از فراخوانیهای سیستمی (Syscall)، سیگنالها و یک لایهی TTY.
- درایورهای سختافزاری برای دیسکهای ATA، کنسولهای VGA و PS/2 و پورتهای سریال ۸۲۵۰.
- سیستم فایل Minix v1.
- قابلیتهای هستهای مدیریت فرآیند و چندوظیفگی (Multitasking).
فراتر از هسته، این پروژه یک کتابخانه فضای کاربر به نام user_lib ارائه میدهد. این کتابخانه ساختار عمومی ماژولهای std::{fs, io, path, env, process, time} در راست را شبیهسازی میکند. این طراحی اجازه میدهد تا برنامههای کاربردی بهجای درگیر شدن با لولهکشیهای خام و پیچیده فراخوانی سیستمی، شبیه به کدهای معمولی و استاندارد راست نوشته شوند. علاوه بر این، یک کریت (crate) پشتیبان به نام user_lib_macros نقطه ورود برنامه را از طریق ویژگی #[user_lib::main] فراهم میکند.
برای پشتیبانی از این اکوسیستم، یک محیط کاربر (userland) قدرتمند شامل بیش از ۸۰ ابزار پایه (coreutils) و یک شِل (shell) دستنویس وجود دارد که زیرمجموعهای از استاندارد POSIX است. این شِل از عملیاتهای پیچیده مانند خط لولهکشی (Pipeline)، کنترل جریان (Control Flow)، توابع، Globbing و جایگزینیهای دستوری و حسابی پشتیبانی میکند. این محیط حتی شامل یک ویرایشگر خط تعاملی با قابلیت تکمیل خودکار (Tab completion) و تاریخچه (History) است. برای مثال، کاربران میتوانند توابع بازگشتی برای محاسبه فاکتوریل را مستقیماً در ترمینال اجرا کنند؛ مانند دستور fact 7 که مقدار ۵۰۴۰ را برمیگرداند.
ابزارها و زیرساخت
برای تسهیل تجربه توسعه، پروژه یک ابزار ساخت تصویر دیسک تک-دستوری از طریق tools/build-disk.sh ارائه میدهد. این ابزار تمامی برنامههای کاربردی را کامپایل کرده، آنها را در یک سیستم فایل مدل یونیکس (شامل پوشههای /etc ، /dev و /bin) سازماندهی میکند و در نهایت آنها را در یک تصویر دیسک بوتشدنی (Bootable Image) بستهبندی میکند. همچنین ابزارهای مستقل مانند mbrkit و miniximg (که در crates.io در دسترس هستند) برای مدیریت رکورد بوت (MBR) و تصاویر سیستم فایل Minix ارائه شدهاند.
تستها از طریق tools/run-tests.sh مدیریت میشوند. این ابزار هسته را در QEMU بوت کرده و کنسول سریال را با استفاده از اسکریپتهای کوتاه .ktest که در مسیر ktest/suites/ ذخیره شدهاند، هدایت میکند. این تستها میتوانند به صورت یک مجموعه کامل، به صورت مجموعههای جداگانه (مثلاً shell.basic) یا با پرچم --disable-reboot برای به اشتراک گذاشتن یک نمونه واحد از QEMU اجرا شوند.
از منظر فنی، این بازنویسی این فرض را میشکند که معماریهای قدیمی بیش از حد «نامرتب» یا «کثیف» هستند که با زبانهای سطح بالا پیاده شوند. با تطبیق منطق سال ۱۹۹۱ با انتزاعات اصطلاحی (Idiomatic) راست، ثابت شد که ایمنی نباید به قیمت از دست دادن وفاداری به معماری (Architectural Fidelity) تمام شود. این رویکرد بهینهسازی و بازبینی ساختاری، یادآور پیشرفتهای اخیر در نسخههای جدیدتر است، مانند زمانی که در لینوکس ۷.۱ سرعت نوشتن دادههای NTFS به طور چشمگیری افزایش یافت.
برای توسعهدهندگان، این پروژه به عنوان یک کتاب درسی زنده درباره مفاهیم داخلی سیستمعامل عمل میکند. یک راهنمای گامبهگام در قالب mdbook در پوشه tutorial/ در دسترس است. شما میتوانید اکنون مخزن را کلون کرده و با استفاده از Devcontainer در VS Code، دستور make run را اجرا کنید تا هسته را بلافاصله در QEMU بوت کنید.
گام بعدی شما
- مخزن پروژه را کلون کرده و با استفاده از Devcontainer در VS Code، دستور
make runرا اجرا کنید تا هسته را در QEMU ببینید. - راهنمای گامبهگام موجود در پوشه
tutorial/را برای درک عمیقتر مفاهیم داخلی سیستمعامل مطالعه کنید. - ابزارهای
mbrkitوminiximgرا درcrates.ioبررسی کنید تا با نحوه مدیریت دیسک در سطح پایین آشنا شوید.
اما تأثیر این رویکرد بر توسعه هستههای مدرنتر مثل لینوکس ۶، بحثی پیچیدهتر است — به بررسی ما دربارهی تلاشهای ادغام Rust در هسته اصلی لینوکس مراجعه کنید.




گفتگو