2017-11-17 14 views
0

"인터럽트 컨텍스트"에 있으므로 Irq 서비스 루틴에서 커널 로그에 메시지를 인쇄해야한다는 요구 사항이 있습니다. printk가이 시나리오에 권장되지 않는다는 것을 이해합니다. 그래서 가장 좋은 대안은 무엇입니까? 제안 해 주셔서 감사합니다.인터럽트 컨텍스트에서 무언가를 kmsg로 안전하게 인쇄하는 방법

printk_deferred에 대한 한 가지 옵션에 대해 들었는데, 이것은 스케줄러에서 사용되는 것으로 나타 났지만 아직 irq isr에서 사용 된 곳을 찾지 못했습니다. 누구든지 printk_deferred와 printk의 차이점을 설명 할 수 있습니까?

+2

[printk가 인터럽트 처리기 안에있을 수 있습니다. 정말 그렇게 나쁘습니까?] (https://stackoverflow.com/questions/8738951/printk-inside-an-interrupt-handler-is-it-really-that -bad) – sawdust

+0

어떤 인터럽트를 기록 하시겠습니까? 그 인터럽트가 두 번째로 수천 번 발생한다면 어떨까요? 모든 단일 작업을 정말로 기록 하시겠습니까? 글쎄 ... 나는 실제로 권장하는대로 작업 표, softirq 또는 workqueue로 연기 된 동작을 만들 것입니다. 'request_irq' 루틴을 가진 드라이버를 살펴보고 IRQ 핸들러가 있어야합니다. 서비스 함수를 직접 호출하지 않기 때문입니다. – 0xDen

+0

주석을 주셔서 감사합니다. @ 0xDen 인터럽트는 매 20ms마다 생성됩니다. 메시지를 인쇄하기위한 특정 조건 검사가 있습니다. 인쇄 메시지가 약 10 분마다 발생한다고 가정합시다. –

답변

1

하나의 일반적인 아이디어는 인터럽트 처리기에서 인쇄 할 변수 또는 정보를 업데이트 한 다음 커널 스레드에서 그 값을 커널 로그 버퍼로 인쇄하는 것입니다. 이 방법은 처리자가 그대로 유지되며 우리의 목표도 달성됩니다.