그래서 최근 HLT
CPU를 정지시키는 opcode 가 있음을 알았습니다 . 멋지다, 어떻게되는지 보자!
user@box:~$ cat > test.c
int main(void)
{
__asm__("HLT");
return 0;
}
user@box:~$ gcc -o test test.c
user@box:~$ ./test
Segmentation fault (core dumped)
user@box:~$
어이! 지루 해요
밝혀진 HLT
것은 특권 교육이므로 다른 것을 시도해 봅시다.
user@box:~$ mkdir test; cd test
user@box:~/test$ cat > test.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
int init_module(void)
{
__asm__("hlt");
return 0;
}
void cleanup_module(void)
{
}
user@box:~/test$ echo obj-m += test.o > Makefile
user@box:~/test$ make -C /lib/modules/$(uname -r)/build modules M=$(pwd)
[...]
user@box:~/test$ sudo insmod test.ko
user@box:~/test$
아무 반응이 없습니다! 지루한!
결과적으로 HLT
다음 인터럽트까지 CPU를 정지시킵니다. 멋지므로 인터럽트 비활성화를 시도해 봅시다. CLI
우리가 원하는 것을 할 것 같습니다.
user@box:~/test$ sudo rmmod test
user@box:~/test$ sed -i 's/hlt/cli; hlt/' test.c
user@box:~/test$ make -C /lib/modules/$(uname -r)/build modules M=$(pwd)
[...]
user@box:~/test$ sudo insmod test.ko
...이 시점에서 OS가 입력에 응답하지 않습니다. 커서를 움직이거나 키보드를 사용하여 아무 것도 입력 할 수 없습니다. 꽤 얼었다.
그렇지 않은 것을 제외하고. 내 GUI 패널의 시계가 계속 작동했습니다. 심지어 음악조차 계속 연주했다. 마치 마우스와 키보드 만 작동을 멈췄습니다. 내 (USB) 키보드에 더 이상 전원이 공급되지 않으며 캡 잠금 LED도 작동하지 않는다는 것을 깨달았습니다.
그래서 여기서 무슨 일이 있었습니까? 시스템에 "전화 끊기"라고 생각되는 한 쌍의 지침이 왜 내 USB 장치 만 종료해야합니까? 왜 다른 모든 것들이 계속 작동합니까? 보너스 : 실제로 시스템을 정지 시키려면 어떻게해야합니까?
CLI
CPU가 실행중인 CPU에만 적용되므로 여러 개의 CPU가있는 경우 각 CPU에서 실행해야합니다. 온 의존하지 아무것도CLI+HLT
CPU는 메리의 길에 계속 무료 것