【環境】
- DOS 6.X/debug32
- 某廠牌 Laptop
【原理】
- OS 透過 SMI/SCM hook BIOS routine,達到所需要的功能。
【所需暫存器】
- AX
- AH: command
- AL: starting value
- BX
- DX (port number )
【操作】
假設port number 為 0xB2, starting value 為 0xC3。
- Check SMI service(AH=00) ,回傳值 AX=0x4456(DV) 表示成功。
C:\>debug32 Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994 CPU = 686, Real Mode, Id/Step = 06FD. A20 disable -a 100 313C:0100 B8C300 mov ax, 00c3 313C:1013 BAB200 mov dx, b2 313C:0106 EF out dx, ax 313C:0107 [Enter] -p=100 AX=00C3 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=313C ES=313C SS=313C CS=313C IP=0103 NV UP DI PL NZ NA PO NC 313C:0103 BAB200 MOV DX,00B2h Trace Interrupt - p [按到跑到 out dx, ax] ... AX=4456 BX=0000 CX=0000 DX=00B2 SP=0000 BP=0000 SI=0000 DI=0000 DS=313C ES=313C SS=313C CS=313C IP=0107 NV UP DI PL NZ NA PO NC 313C:0107 D0FF SAR BH,1
- BIOS廠商自行定義的 SMI(省略)。
【程式】
- 在 Linux 要下 smi call,請參考
Intel SpeedStep SMI driver.
http://lxr.free-electrons.com/source/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c?v=2.6.28;a=m68knommu