A boot szektor bootloaderében miért olyan fontos az önmagát állandóan meghívó (jmp $) végtelen ciklusú utasítás?
Az első jó felé kapirgál, de nem pontosan ez a helyzet.
A bootloader tulajdonképpen nem áll le soha. A processzor számára ismeretlen fogalom a program vége. Az egész memóriát egyetlen egy, irdatlan hosszú bájtsorként értelmezi, így is hajtja végre.
Amikor futtatsz valamit (az ugrásoktól, ciklusoktól most tekintsünk el egy pillanatra), akkor a CPU mindig egyre magasabb címről fog utasítást betölteni.
Amikor elér a bootloader végére, elkezdi végrehajtani azt a bármit is, amit utána talál. Innentől egyrészt kiszámíthatatlan, a futás, másrészről előbb-utóbb bele fog szaladni vagy egy BIOS reboot rutinba, vagy egy olyan utasítássorozatba, amely dupla-, illetve tripla kivételt okoz (ennek részleteibe most ne menjünk bele). Triple kivételkor a helyzet menthetetlennek számít, így ilyenkor az alaplap automatikusan reseteli a CPU-t.
Egyébként a jmp $ (amely valóban saját magára ugrik, mivel a $ jel ASM-ben az aktuális sor memóriabeli címét jelenti) bad practice, mert feleslegesen darálja az órajelet, ezzel fűtve a procit és zabálva az áramot. Bootloaderben azért van létjogosultsága, mert csak két bájtot foglal. Ahol ván elég hely, ott a helyes megoldás:
_halt_cpu:
˙˙˙˙cli
˙˙˙˙hlt
˙˙˙˙jmp _halt_cpu
Az utolsó ugrásra azért van szükség, mert bár a megszakításokat letiltottuk, és így a CPU elvileg vég nélküli alvásba kezd, gyakorlatilag egy NMI bármikor betehet ennek, így ekkor vissza kell küldeni a processzort az alvós kódra.
Ha minden igaz, nem hagytam ki semmit...
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!