
Cet article traite de l'utilisation inhabituelle des fonctionnalités du mode protégé de l' architecture x86 - pour effectuer des calculs sans exécuter d'instructions, c'est-à -dire en raison des mécanismes internes du processeur: commutation de tùches matérielles , gestion intelligente de la mémoire et logique non triviale d' appel d'un gestionnaire d'interruption . Comme vous le savez , tout systÚme quelque peu complexe a l' exhaustivité de Turing , il n'est donc pas surprenant de le trouver à des endroits inattendus dans le x86 naturellement évolué. J'invite sous la coupe ceux qui s'intéressent à de telles perversions de bas niveau.
Cette publication est basĂ©e sur un article intitulĂ© «La machine bizarre de page-faute: leçons de calcul sans instruction» . Cela rĂ©chauffe l'Ăąme que l'un de ses co-auteurs, Sergey Bratus , soit diplĂŽmĂ© de longue date de Phystech . J'ai appris ce travail pour la premiĂšre fois dans l'article de Gwern Barwen "Surprisingly Turing-Complete" , qui contient de nombreux exemples Ă©tonnants de systĂšmes Turing-complets. D'ailleurs, une partie de celui-ci a Ă©tĂ© traduite en HabrĂ© , mĂȘme si seules trois phrases sont attribuĂ©es au phĂ©nomĂšne dĂ©crit dans cet article.
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, . -, , , , " " , . â " ", "" , . , , .
( ):
-
Implémentation par Krister Walfridsson: référentiel Github , description générale , quelques détails d'implémentation
Article original "The Page-Fault Weird Machine: Lessons in Instruction-less Computation" , référentiel Github compagnon avec l'implémentation de l'auteur
Bien sûr, manuels du développeur de logiciels pour les architectures IntelŸ 64 et IA-32