
مهم نیست از پردازندههای اینتل استفاده میکنید یا AMD؛ نخستین دستورالعمل (Instruction) که پردازنده شما اجرا میکند، در حالتی اجرا میشود که برای تراشه ۱۶ بیتی اینتل ۸۰۸۶ طراحی شده است؛ تراشهای که در ژوئن ۱۹۷۸ روانه بازار شد. این حالت «حالت واقعی» (Real Mode) نام دارد و با وجود تمام تحولاتی که از آن زمان تاکنون در پردازندهها رخ داده، این بخش از فرآیند راهاندازی بهشکل چشمگیری بدون تغییر باقی مانده است.
خود اینتل نیز این موضوع را تأیید میکند و میگوید «طراحیهای معماری Intel 64 پس از ریست، در همان وضعیتی قرار میگیرند که تراشه اصلی ۸۰۸۶ داشت.» شرکت AMD نیز اعلام کرده است که پردازنده پس از ریست یا بوت، «همواره در ابتدا وارد حالت واقعی میشود.»
این بخش از توالی بوت بسیار کوتاه است؛ در آزمونهای انجامشده، فریمور UEFI در شبیهساز QEMU تنها ۱۸ دستورالعمل مجزا را در حالت واقعی اجرا کرد و سپس به حالت محافظتشده ۳۲ بیتی (Protected Mode) و در نهایت به حالت طولانی ۶۴ بیتی (Long Mode) سوئیچ کرد. سیستمعامل هرگز در هسته اصلی بوت با حالت واقعی روبهرو نمیشود، اما هر دو سیستمعامل ویندوز و لینوکس همچنان کد ۱۶ بیتی را برای مقداردهی اولیه هستههای اضافی حمل میکنند.
هر هسته x86 کار خود را در حالت واقعی آغاز میکند
اینتل این حالت را «شبیهسازی ۸۰۸۶» (8086 Emulation) مینامد. حالت واقعی یا همان حالت آدرس واقعی (Real-Address Mode) به تعبیر اینتل، محیط اجرایی تراشه اصلی ۸۰۸۶ است. به گفته اینتل، «برای یک برنامه ۸۰۸۶، پردازندهای که در حالت آدرس واقعی کار میکند، مانند یک پردازنده ۸۰۸۶ پرسرعت رفتار میکند.» در این حالت، ثباتها (Registers) عرضی ۱۶ بیتی دارند، هیچ حفاظت حافظه (Memory Protection) و صفحهبندی (Paging) وجود ندارد و آدرسدهی حافظه با گرفتن یک مقدار قطعه (Segment) ۱۶ بیتی، جابهجایی آن به اندازه چهار بیت به چپ و افزودن یک آفست ۱۶ بیتی انجام میشود. نتیجه، یک آدرس ۲۰ بیتی و فضای آدرسدهی اسمی یک مگابایتی است؛ فضایی که در سال ۱۹۷۸ فراوان به نظر میرسید و امروز در برابر هر استاندارد مدرنی بسیار ناچیز است.
هنگامی که یک پردازنده x86 روشن میشود یا پایه ریست (Reset Pin) آن فعال میگردد، ثباتهای آن به وضعیت مشخصی تنظیم شده و پردازنده وارد حالت واقعی میشود. در جدول ریست پردازندههای کنونی اینتل، ثبات کنترلی CR0 روی مقدار 60000010h قرار دارد؛ یعنی حفاظت و صفحهبندی هر دو خاموشاند و همین مقدار توسط AMD نیز برای تراشههای خود استفاده میشود. بنابراین، هرچقدر هم که پردازنده ۶۴ بیتی شما قدرتمند باشد، در لحظه بوت و تا زمانی که دستور سوئیچ از این حالت صادر نشود، عملاً همان تراشه سال ۱۹۷۸ است.
البته حالت واقعی مدرن با ۸۰۸۶ اصلی یکسان نیست. پردازندههای امروزی از ثباتهای قطعه اضافی مانند FS و GS و همچنین پیشوندهای دستورالعمل (Instruction Prefixes) پشتیبانی میکنند که دسترسی به ثباتهای ۳۲ بیتی را ممکن میسازد؛ هرچند اینتل در حفظ سازگاری با ۸۰۸۶ و ۲۸۶ نسبت به استفاده از این قابلیتها هشدار میدهد. آدرسدهی ۲۰ بیتی تراشه ۸۰۸۶ باعث میشد آدرسهای فراتر از یک مگابایت به صفر بازگردند (Wrap Around)؛ رفتاری که رایانههای شخصی دههها آن را از طریق دروازه A20 حفظ کردند. با این حال، راهنمای کنونی اینتل اشاره میکند که سیگنال A20M# که برای حفظ این سازگاری به کار میرفت، ممکن است در پردازندههای جدیدتر «وجود نداشته باشد».
آدرس ریست؛ بخشی که دیگر واقعاً ۸۰۸۶ نیست
راهنمای کاربری اینتل در سال ۱۹۷۹ میگوید خط ریست، ثبات قطعه کد (Code Segment) را روی FFFFh و اشارهگر دستورالعمل (Instruction Pointer) را روی صفر تنظیم میکند؛ یعنی نخستین دستورالعمل از آدرس فیزیکی FFFF0h میآید که ۱۶ بایت پایینتر از سقف فضای آدرسدهی یک مگابایتی تراشه قرار دارد. با تنها ۱۶ بایت فضای در دسترس، این موقعیت معمولاً شامل یک پرش دور (Far Jump) به کد راهاندازی واقعی بود.
تراشه ۸۰۲۸۶ آدرس ریست را به ۱۶ بایت پایینتر از سقف فضای آدرسدهی بزرگتر ۱۶ مگابایتی خود منتقل کرد تا اینتل فضای لازم برای یک بارگذار بوت (Bootstrap Loader) در حالت محافظتشده را در اختیار داشته باشد. تراشه ۲۸۶ با قطعه کد تنظیمشده روی F000h و اشارهگر دستورالعمل روی FFF0h ریست میشود، اما همزمان یک آدرس پایه پنهان (Hidden Base) به مقدار FF0000h را در بخشی از ثبات قطعه که نرمافزار قادر به دیدن آن نیست بارگذاری میکند و حاصل جمع این دو، FFFFF0h است. مرجع برنامهنویسی اینتل در سال ۱۹۸۵ توضیح میدهد که سیستمی با تنها ۲۰ بیت آدرس، چهار بیت بالایی را استفاده نمیکند و در نتیجه آدرس دقیقاً در همان محل ریست تراشه ۸۰۸۶ ظاهر میشود.
پردازندههای مدرن x86 همین سازوکار را تا سقف فضای آدرسدهی ۴ گیگابایتی گسترش دادهاند. راهنماهای اینتل و AMD وضعیت ریست یکسانی را تعریف میکنند: انتخابگر قطعه کد F000h، پایه پنهان FFFF0000h و اشارهگر دستورالعمل FFF0h که باعث میشود نخستین دستورالعمل از آدرس FFFFFFF0h یعنی ۱۶ بایت پایینتر از مرز ۴ گیگابایت خوانده شود. اینتل تأکید میکند که این آدرس فراتر از محدوده آدرسدهی یک مگابایتی پردازنده در حالت آدرس واقعی است و تراشه ۸۰۸۶ هرگز قادر به چنین کاری نبود.
این پایه پنهان تنها تا زمانی دوام میآورد که فریمور ثبات قطعه کد را دوباره بارگذاری کند و آن را با پایه معمول حالت واقعی جایگزین سازد. تا آن لحظه، اینتل هشدار میدهد که کد راهاندازی «نباید شامل پرش دور، فراخوانی دور یا اجازه وقوع وقفه باشد»، زیرا هر یک از این موارد ثبات قطعه را تغییر داده و پردازنده را از سقف حافظه خارج میکند.
پرش موجود در سقف حافظه نیز هرگز حذف نشده است. پروژه EDK2، پیادهسازی مرجع متنباز فریمور UEFI، بردار ریست (Reset Vector) خود را در همان آدرس قرار میدهد؛ دو دستورالعمل بیاثر (No-Op) و سپس یک پرش به باقی کد راهاندازی ۱۶ بیتی. به این ترتیب، راهنمای سال ۱۹۷۹ تقریباً نیم قرن بعد همچنان معتبر است.
رایانههای شخصی مدرن تا حد زیادی از بوت مبتنی بر BIOS قدیمی فاصله گرفتهاند. اینتل در سال ۲۰۱۷ اعلام کرد که قصد دارد تا سال ۲۰۲۰ پشتیبانی از BIOS قدیمی را پایان دهد و لنوو نیز متعاقباً این گزینه را از بسیاری از محصولات عرضهشده در همان سال حذف کرد. در سیستمهای صرفاً UEFI، بارگذار بوت سیستمعامل نیازی به اجرا در حالت واقعی ندارد؛ هرچند این بیشتر یک تغییر در فریمور است تا تغییری در معماری، و پردازنده همچنان کار خود را در حالت واقعی آغاز میکند.
هر هسته دیگر و سیستمعامل نیز از همین مسیر میگذرند
هنگامی که یک سیستم x86 راهاندازی میشود، تنها یک هسته به نام پردازنده راهانداز (Bootstrap Processor) فریمور را اجرا میکند و سایر هستهها منتظر اتمام آن میمانند. برای بیدار کردن هستهای دیگر، نرمافزار معمولاً یک سیگنال INIT و پس از آن یک وقفه بینپردازندهای راهاندازی (SIPI) ارسال میکند که به هسته میگوید از کجا اجرای کد را آغاز کند. اینتل آدرس شروع را 000VV000h تعریف میکند که در آن VV بردار SIPI است و آدرس را زیر مرز یک مگابایت قرار میدهد. همانطور که گفته شد، هر دو شرکت AMD و اینتل تصریح میکنند که هستههایشان در حالت ۱۶ بیتی شروع به کار میکنند.
در این توالی راهاندازی سنتی، هستههای اضافی میتوانند چندین بار وارد حالت واقعی شوند، زیرا فریمور میتواند هستهها را پیش از آنکه سیستمعامل دوباره آنها را راهاندازی کند، مقداردهی اولیه کند. در آزمون QEMU با دو هسته مجازی، فریمور بهتنهایی هسته دوم را پنج بار ریست کرد و هر بار پیش از سوئیچ به حالت محافظتشده، انفجاری کوتاه از کد ۱۶ بیتی را در آدرسهای همتراز با صفحه و زیر یک مگابایت اجرا کرد.
لینوکس کد مربوط به این فرآیند را در فایلی به نام trampoline_64.S نگه میدارد و توضیحی در ابتدای فایل تصریح میکند که در لحظه ورود، «پردازنده در حالت واقعی با آدرسدهی ۱۶ بیتی و داده ۱۶ بیتی قرار دارد.» در آزمون بوت یک هسته استاندارد لینوکس ۶.۱۸ در QEMU با دو هسته، پس از ارسال INIT توسط هسته، هسته دوم اجرای خود را در حالت واقعی از آدرس 99000h آغاز کرد؛ وقفهها را غیرفعال کرد، حافظه نهان (Cache) خود را پاک کرد، ثباتهای قطعه را پیکربندی کرد و پیش از بارگذاری جداول توصیفگر (Descriptor Tables) و ورود به حالت محافظتشده، تابع verify_cpu را اجرا کرد. این توالی شامل اجرای ۶۷ دستورالعمل ۱۶ بیتی بود. لینوکس همچنین هنگام بازگشت از حالت خواب S3 از یک قطعه کد جداگانه در حالت واقعی استفاده میکند.
ویندوز نیز دقیقاً همین کار را انجام میدهد. بررسی هسته ویندوز ۱۱ با شماره بیلد 10.0.28000.3086 (سپتامبر ۲۰۲۶) با استفاده از نمادهای اشکالزدایی عمومی مایکروسافت، سه تابع را نشان میدهد: HalpRMStub، HalpPMStub و HalpLMStub که بهترتیب به حالت واقعی، حالت محافظتشده و حالت طولانی مربوط میشوند. تابع HalpRMStub در قالب کد ۱۶ بیتی، وقفهها را غیرفعال میکند، قطعه کد را در قطعه داده کپی میکند و مقدار آن را چهار بیت به چپ جابهجا میکند تا آدرس فیزیکی خود را محاسبه کند؛ همان ریاضیات تراشه اصلی ۸۰۸۶، اما این بار در هسته ویندوز سال ۲۰۲۶. سپس یک جدول توصیفگر بارگذاری کرده و بیت حالت محافظتشده را فعال میکند. پژوهشگر امنیتی، ساتوشی تاندا، این مسیر راهاندازی را در سال ۲۰۲۰ در ویندوز ۱۰ مستند کرده بود و این مسیر همچنان در ویندوز ۱۱ حضور دارد.
در یک سرور بزرگ، این موضوع به آن معناست که احتمالاً صدها هسته میتوانند چندین بار این فرآیند را طی کنند؛ مگر آنکه فریمور از سازوکار جدیدتری به نام صندوق پستی (Mailbox) پشتیبانی کند که هستهها را از پیش در حالت ۶۴ بیتی به سیستمعامل تحویل میدهد. لینوکس از یکی از این سازوکارها پشتیبانی میکند و کد مربوط به آن به ماشینهای مجازی محرمانه TDX اینتل اشاره دارد.
اینتل تلاش کرد حالت واقعی را حذف کند، اما موفق نشد
در سال ۲۰۲۳، اینتل طرح X86S را پیشنهاد داد؛ نسخهای سادهشده از معماری x86 که حالتهای قدیمی از جمله حالت واقعی، آدرسدهی ۱۶ بیتی و راهاندازی سنتی هستهها بر پایه SIPI را حذف میکرد. اینتل استدلال میکرد که این حالتها کاربرد چندانی جز راهاندازی پردازندهها در حالت ۶۴ بیتی ندارند.
نسخه نهایی این مشخصات، یعنی بازنگری ۱.۲ در ژوئن ۲۰۲۴، پیشنهاد میکرد پردازنده مستقیماً در حالت صفحهبندیشده ۶۴ بیتی و با استفاده از یک جدول صفحه چهارسطحی در آدرسی ثابت آغاز به کار کند. آدرس ریست همچنان FFFFFFF0h باقی میماند، اما اجرا مستقیماً در حالت ۶۴ بیتی آغاز میشد و حالت واقعی بهکلی دور زده میشد. در این طرح، هستههای اضافی بهجای بردار SIPI زیر یک مگابایت، از یک وقفه راهاندازی ۶۴ بیتی جدید استفاده میکردند که به ساختاری حاوی وضعیت اولیه آنها اشاره داشت.
با این حال، هیچیک از این برنامهها محقق نشد. در دسامبر ۲۰۲۴، اینتل در گفتوگو با Tom's Hardware تأیید کرد که طرح X86S را کنار گذاشته است؛ اندکی پس از آنکه گروه مشورتی اکوسیستم x86 را همراه با AMD تشکیل داد. اینتل بعدها صفحه مربوط به X86S را تغییر داد و تنها نوشت: «بر اساس بازخوردهای اکوسیستم، اینتل تصمیم گرفته است طرح X86S را دنبال نکند.» این شرکت هرگز توضیح مفصلی ارائه نداد، هرچند Tom's Hardware اشاره کرد که تغییری در این حد و اندازه احتمالاً به همکاری AMD نیاز دارد. نخستین سال فعالیت این گروه مشورتی طرحهایی مانند FRED، AVX10، ACE و ChkTag را به همراه داشت، اما هیچیک به حذف حالت واقعی نمیپرداخت.
شاید یک تراشه x86 فقط ۶۴ بیتی از قبل عرضه شده باشد
نزدیکترین چیز به X86S در دنیای واقعی ممکن است اصلاً از اینتل یا AMD نیامده باشد. در ۷ سپتامبر ۲۰۲۶، کریستین لودلوف، متخصص معماری x86 که پایگاه Sandpile را اداره میکند، جزئیات پردازنده یک شرکت نامشخص را در فهرستهای پستی هسته لینوکس و binutils به اشتراک گذاشت. او مدعی شد از وی خواسته شده پیادهسازیای را مستند کند که تنها از PM64 و PML5 پشتیبانی میکند و از FRED و APX بهره میبرد و بیش از یک سال در مقیاس گسترده استفاده شده است. PM64 به حالت محافظتشده ۶۴ بیتی و PML5 به صفحهبندی پنجسطحی اشاره دارد. به تعبیر لودلوف: «پوف! حالت قدیمی؟ از بین رفت! حالت سازگاری؟ از بین رفت!»
هرچند حالت واقعی تنها بهعنوان نقطه مقایسه ذکر شده است، لودلوف جدول وضعیت ریست پردازندههای Sandpile را نیز با تغییرات طرح پیشنهادی حاشیهنویسی کرد. بر این اساس، تمام ثباتهای قطعه منقضی شدهاند، ثبات CR0 حفاظت و صفحهبندی را فعال دارد و بیتهای حالت طولانی در ثبات EFER بهصورت دائمی فعال هستند. اگر این اطلاعات دقیق باشد، تراشه مستقیماً در حالت صفحهبندیشده ۶۴ بیتی از ریست خارج میشود و در هیچ نقطهای حالت واقعی را تجربه نمیکند. با این حال، این جدول آدرس ریست جدیدی را مشخص نمیکند و نقطه ورود دقیق همچنان نامشخص است.
سازنده این تراشه ناشناخته مانده است، هیچ مستندات عمومی از فروشنده وجود ندارد و جزئیات صرفاً از سوی لودلوف مطرح شدهاند؛ هرچند او مرجعی شناختهشده در معماری x86 به شمار میرود. پایگاه Phoronix این افشاگری را به هشدارهای پیشین لودلوف درباره یک توسعهدهنده ثالث x86 مرتبط دانسته و درباره شرکتهایی مانند Zhaoxin، Hygon و RosaicLabs گمانهزنی کرده است، هرچند هیچیک تأیید نشدهاند. همچنین هیچ پردازنده تجاری در دسترس با این طراحی شناسایی نشده است.
در حال حاضر، اینتل و AMD همچنان راهاندازی در حالت واقعی را مستند میکنند، لینوکس هیچ پرچم ویژگی (Feature Flag) برای راهاندازی ۶۴ بیتی به سبک X86S ندارد و ویندوز ۱۱ نیز همچنان یک قطعه کد راهاندازی ۱۶ بیتی را حمل میکند تا همهچیز همانطور که باید کار کند. پردازندههای مدرن x86 بخش بینهایت کوچکی از عمر خود را در حالت واقعی سپری میکنند، اما فریمور و سیستمعاملها همچنان باید در هنگام مقداردهی اولیه هستههای پردازشی این موضوع را در نظر بگیرند. حجم کد قدیمی درگیر در این فرآیند واقعاً ناچیز است و تأثیر معناداری بر عملکرد روزمره ندارد؛ اما با این حال، ویندوز و لینوکس کد راهاندازی ۱۶ بیتی خود را حفظ کردهاند، چون پردازندههای مدرن x86 همچنان رفتاری در لحظه ریست را به ارث میبرند که به سال ۱۹۷۸ بازمیگردد.