تناقش هذه المقالة الاستخدام غير المعتاد لميزات الوضع المحمي لهندسة x86 - لإجراء عمليات حسابية دون تنفيذ التعليمات ، أي بسبب الآليات الداخلية للمعالج: تبديل مهام الأجهزة ، وإدارة الذاكرة الذكية ، والمنطق غير التافه لاستدعاء معالج المقاطعة . كما تعلم ، فإن أي نظام من أي تعقيد له Turing الكمال ، لذلك ليس من المستغرب أن تجده في أماكن غير متوقعة في x86 المتطور بشكل طبيعي. أدعو تحت الخفض المهتمين بمثل هذه الانحرافات منخفضة المستوى.
يستند هذا المنشور إلى مقال بعنوان "الآلة الغريبة لخطأ الصفحة: دروس في الحساب بدون تعليمات" . إنه يثلج الصدر أن أحد المؤلفين المشاركين ، سيرجي براتوس ، خريج Phystech منذ فترة طويلة . تعلمت أولاً عن هذا العمل من مقالة جويرن باروين "Surprisingly Turing-Complete" ، والتي تحتوي على العديد من الأمثلة الرائعة لأنظمة Turing-Complete . بالمناسبة ، تمت ترجمة جزء منه إلى حبري ، على الرغم من تخصيص ثلاث جمل فقط للظاهرة الموصوفة في هذا المقال.
2013 , x86-64, long mode, . x86 .
, , , " ", . , : -, , , — ( QEMU, ). -, , . , , red pill, , . red pills , "", , , . red pill , , , "" . , , . , . : Neutrino(2016 .), Conficker(2008 .), Rebhip(2011 .), IRC : Phatbot(2008 .), Rbot, SDbot/Reptile, Mechbot, SpyBot ( ). -, . "" unikernel.
"" , , - ? , x86.
IA-32 , . call gates , , . , , — , ; . x86-64 .
, ( , , ), — 32-bit Linux ( ) double fault, , . Double fault , - ; , . , , double fault , , , , Linux , double fault , kernel panic "" . double fault - , triple fault, .
x86 , task-state segment(TSS). , , . EIP
(instruction pointer) — , ESP
(stack pointer) — , CR3
— ( , page directory), EAX
ECX
, .
, , . , , GDT(Global Descriptor Table) — IDT(Interrupt Descriptor Table) — . , , : memory segment descriptor — (, ), TSS descriptor — task-state segment, interrupt-gate descriptor — , , — far call. , — , — .
-
, , , -? , , page fault double fault, 4- . , , ( , x86 ) ESP
4. , ESP
, ? , 32 , double fault-.
. , , EIP
, , 0xFFFFFFFF
. page fault, . , page fault :
if (esp == 0) {
goto double_fault_handler;
} else {
esp -= 4;
goto page_fault_handler;
}
- , … - . , "" . ( IDT GDT) TSS, CR3
, , , , (, TSS, ). IDTR GDTR ( TSS, ) IDT GDT, , "" ⇒ ⇒ ⇒ CR3
⇒ IDT GDT, . IDT TSS, .
movdbz-
, "" :
, "". IDT GDT, .
TSS, , . , TSS
EIP
,ESP
,CR3
.
"" TSS , ( ),
ESP > 0
,ESP
4,ESP
.
CR3
2 ,ESP
TSS, GDT (. Task Register) .
3 , ,
EIP
, , page fault; double fault.
, : rsrc
— ESP
, TSS; rdest
— ESP
, TSS, GDT CR3
TSS. label_zero
— , double fault, label_nonzero
— page fault. ESP
, 4, , .
if (rsrc == 0) {
rdest = rsrc;
goto label_zero;
} else {
rdest = rsrc - 1;
goto label_nonzero;
}
— , movdbz
, move-branch-if-zero-or-decrement (-----). , subtract-and-branch-if-negative (-----), movdbz
( ), - . , , — - Brainfuck movdbz
-.
, movdbz
:
movdbz rdest, rsrc, label_nonzero, label_zero
real-mode A20 high memory, , . , Intel , , , . , ESP
( #SS
— stack-segment fault), . ESP
, 4 "" , 0 1023, 0 4095 ( 4 ). , , .
,
: 4 "destination TSS" ESP
, CR3
. , , ESP
, TSS, -- , . CR3
, , CR3
IDT
, , — "". TSS — , ; , movdbz
. "" TSS ECX
EDX
( TSS ). , TSS ESP
, CR3
TSS c rdest
, .
Busy bit
busy bit, TSS GDT , . , , 5 . , , . , , . , , , , , 8 10, .
: GDT , TSS! GDT 16 , 8 — , , TSS, EAX
ECX
. , TSS EAX
ECX
TSS ( , TSS) busy bit-. , TSS 4 busy bit TSS GDT . IDT GDT — , 8 16 .
, " "? -, , , — red pill, . -, x86, . -, , , , " " , . — " ", "" , . , , .
( ):
-
التنفيذ بواسطة Krister Walfridsson: مستودع Github ، وصف عام ، بعض تفاصيل التنفيذ
المقال الأصلي "The Page-Fault Weird Machine: Lessons in Instruction-less Composition" ، مستودع Github المصاحب مع تنفيذ المؤلف
بالطبع أدلة مطوري برامج معماريات Intel® 64 و IA-32