커널 모듈을 만드는 방법을 배우고 있는데 모든 것이 잘 작동합니다. 컴파일하고 삽입하면 init .ko
함수 내부의 메시지가 올바르게 표시됩니다 . 그런 다음 모듈을 변경하고 제거하고 다시 삽입합니다. 메시지는 다시 정상입니다 .sudo insmod cheat.ko
printk
module_init
/etc/log/syslog
sudo rmmod cheat.ko
printk
그런 다음 새로운 기능을 시도하면 화면이 오류 메시지가 있는 tty처럼 됩니다. ctrl-alt-f2 ctrl-alt-f7(저는 우분투에 있습니다)을 수행하고 X 서버로 돌아갑니다.
소스 파일에 대한 최신 수정 사항을 취소하고 다시 컴파일했지만 이제 문제는 재부팅하지 않고 다시 테스트하기 위해 모듈을 다시 삽입할 수 없다는 것인데, 이는 테스트하기에 너무 짜증나는 일입니다.
다시 시작하지 않고 수정된 모듈을 다시 삽입하는 방법은 무엇입니까?
제가 시도한 것과 얻은 정보는 다음과 같습니다.
cat /etc/log/syslog
:나에게 관련된 유일한 정보는 다음과 같습니다.BUG: unable to handle kernel NULL pointer dereference at 00000003
그게 문제의 원인인 것 같은데, 다음과 같은 메시지가 나타납니다.
Oops: 0002 [#1] SMP
다음 내용은 끔찍한 디버그 정보이지만 모듈을 다시 삽입하는 방법에는 도움이 되지 않는 것 같습니다.
sudo insmod cheat.ko
: 아무 것도 출력하지 않고 명령이 중단됩니다. 이 터미널 에뮬레이터를 계속 사용할 수 있는 유일한 방법은 다음과 같습니다.c-c
sudo rmmod cheat
:Error: Module cheat is not currently loaded
sudo modprobe -r cheat.ko
FATAL: Module cheat.ko not found.
lsmod | grep cheat
:cheat 19009 -2
-2
그 안에 있는 사용 횟수는 매우 수상합니다...cat /proc/modules | grep cheat
cheat 19009 1 - Loading 0x00000000 (OF+)
흥미롭군요. 모듈이 아직 로드 중입니다...
편집하다
다른 사람들이 말했듯이 가상 머신을 사용하십시오. 적극 활용하시길 권해드립니다도보 여행가그것을 관리하기 위해.
편집 2
아니요, Vagrant는 초보자를 위한 것입니다. 대신 QEMU + Buildroot를 사용하세요.https://github.com/cirosantilli/linux-kernel-module-cheat
답변1
module_exit
Linux 커널은 모듈 함수가 성공적으로 반환되는 경우에만 모듈을 언로드합니다. 모듈의 일부 기능이 충돌하는 경우 커널은 복구할 수 있지만 모듈은 메모리에 잠겨 있습니다. 커널 데이터 구조를 살펴보고 모듈을 로드 불가능으로 표시하도록 강제할 수도 있지만( module_exit
아무 것도 수행하지 않도록 함수를 패치해 보십시오) 위험합니다. 가장 좋은 방법은 재부팅하는 것입니다.
커널 모듈을 테스트하는 일반적인 방법은 가상 머신에서 수행됩니다. 개발 컴퓨터에서 이 모듈을 테스트하지 마세요. 물리적 시스템과 비교했을 때 VM의 장점은 테스트 준비가 완료된 구성으로 VM 상태를 저장하고 필요한 만큼 여러 번 복원할 수 있어 테스트 사이의 시작 시간을 절약할 수 있다는 것입니다.