CLI (x86)

V instrukční sadě x86 kompatibilních procesorů je instrukce CLI  zkratkou pro "Clear Interrupt-Enable Flag". Resetuje příznak přerušení (IF) v registru EFLAGS . Když je tento příznak vymazán, procesor ignoruje všechna přerušení (kromě NMI) od externích zařízení.

Operační kód pro tuto instrukci je 0xFA.

Přehled

Instrukce CLI patří do třídy I/O instrukcí. Pokud je v chráněném režimu volána kódem, jehož CPL je číselně větší než IOPL, procesor vygeneruje výjimku #GP(0). Pokud je například IOPL = 2, může tento příkaz provést kód v ochranných kroužcích 0, 1 a 2 . Moderní operační systémy nastavují IOPL = 0, takže tuto instrukci může provést pouze jádro.

Všimněte si, že IF lze také upravit načtením EFLAGS, například pomocí instrukce POPF .

CLI se běžně používá jako synchronizační nástroj. Dvojici instrukcí CLI/STI lze použít ke zvýraznění nepřerušitelného kódu s asynchronními přerušeními. Na víceprocesorových systémech mění instrukce CLI pouze IF procesoru, na kterém běží, a nemění IF ostatních. Proto je tam pro synchronizaci kódu s obsluhou přerušení nutné dodatečně použít synchronizační objekty (obvykle spinové zámky). Například linuxové jádro má funkci spin_lock_irqsave, která zakazuje přerušení a pokouší se získat objekt spinlock.

Synchronní ( softwarová ) přerušení způsobená instrukcemi INT , INT3 , INTO , BOUND jsou zpracována bez ohledu na stav příznaku IF.

Protože instrukce HLT zastaví procesor, dokud nedojde k přerušení, způsobí kombinace CLI/HLT úplné zastavení stroje.

Viz také