2017-04-10 9 views
0

나는 주어진 프로세스가 충돌했다는 것을 "인식"할 필요가있는 커널 모듈을 만들고있다.사용자 프로세스가 신호를 종료/수신 할 때 커널 모듈을 인터럽트합니까?

지금 당장 내 방식은 커널 모듈에 주기적 타이머 인터럽트를 설정하는 것입니다. 모든 타이머 인터럽트마다 task_struct.state 및 task_struct.exitstate 값을 확인합니다.

커널 모듈에서 프로세스가 종료 될 때 또는 프로세스가 주어진 신호 (예 : SIGINT 또는 SIGHUP)를 수신 할 때 인터럽트를 설정하는 방법이 있는지 궁금합니다.

감사합니다.

편집 : 사용자 응용 프로그램을 수정할 수 없다는 점을 알아 두십시오. 아니면 다른 공급 업체의 소프트웨어에 대한 추가 요구 사항/제약 조건을 추가하면 고객에게 훨씬 더 어려운 판매가 될 것입니다 ...

답변

0

모듈에 문자 장치 노드를 만든 다음 해당 노드를 열 수 있습니다 사용자 공간 프로세스에서. 모듈에 간단한 cdev를 등록하는 데는 약 12 ​​개의 상용구 만 있습니다. 프로세스가 장치 노드를 열 때 cdev의 open 메서드가 호출되고 장치 노드가 닫힐 때 release 메서드가 호출됩니다. 프로세스가 의도적으로 또는 신호로 인해 종료되면 열려있는 모든 파일 디스크립터가 커널에 의해 닫힙니다. 따라서 release이 호출 될 수 있습니다. 이렇게하면 프로세스 상태를 폴링 할 필요가 없으므로 모듈 외부의 커널 코드를 수정할 필요가 없습니다.

또한 워치 독 스타일 시스템을 설정할 수도 있습니다. 여기서 프로세스는 1 바이트를 장치에 자주 작성해야합니다. write cdev 방법으로 타이머를 재설정하십시오. 쓰기없이 너무 많은 시간이 지나고 타이머가 만료되면 충돌이 발생하지 않고 종료 된 경우에도 프로세스가 어떻게 든 실패했다고 가정합니다. 예를 들어 뮤텍스 데드락을 허용하거나 프로세스를 무한 루프에 배치하는 프로그래밍 버그.

신호가 사용자 프로세스에 전달되는 지점이 커널 코드에 있습니다. 패치 할 수 있고, 프로세스 이름을 확인하고, 조건 변수가 일치하면 신호를 보낼 수 있습니다. 이것은 의도적 인 프로세스 종료가 아닌 신호를 잡을 것입니다. IMHO, 이것은 훨씬 더 못 생기고 커널 패치를 유지 관리해야합니다. 하지만 그렇게 어렵지는 않습니다. 단일 지점이 있습니다. 필요한 코드를 삽입 할 수 있고 모든 신호를 잡을 수있는 기능이 무엇인지, 미안합니다.

+0

감사! 여기 내가 언급 했어야 할 잡을 것이있다 : 나는 사용자 응용 프로그램을 수정할 수 없다. 아니면 다른 공급 업체의 소프트웨어에 대한 추가 요구 사항/제약 조건을 추가하면 고객에게 훨씬 더 어려운 판매가 될 것입니다 ... 아마 패치 방법은 살펴볼 항목이지만, off는 주기적 타이머 인터럽트로 인한 성능 저하가 허용 임계 값을 초과하는 경우에만 가치가 있습니다 ... –

+1

응용 프로그램을 시작하고 모듈에 신호를 보내는 래퍼가 있습니까? 프로세스 (즉, 래퍼)의 부모는 자식 (애플리케이션 프로세스)이'waitpid() '등을 통해 충돌하거나 종료하면 알림을받습니다. 래퍼가 드라이버의 장치 노드를 연 다음 장치 노드를 닫지 않고 앱을 exec() 할 수도 있습니다. 자식은 열린 파일 디스크립터를 상속 받아 닫거나 종료 될 때까지 열린 상태로 유지합니다. 래퍼는 앱을 시작한 후에 존재할 필요는 없습니다. – TrentP