드라이버 모듈의 코드 흐름을 어떻게 알 수 있나요?

드라이버 모듈의 코드 흐름을 어떻게 알 수 있나요?

저는 Linux 장치 드라이버 작업을 하고 있습니다. 주요 초점은 Wi-Fi 드라이버입니다. 장치를 연결할 때 코드가 어떻게 흐르는지 알고 싶습니다. 어쩌면 printk각 함수에 한 줄을 추가하는 등의 작업을 수행할 수도 있습니다. 내가 가지고 있는 장치는 드라이버에서 지원됩니다 ath9k_htc. 학습 목적으로 드라이버 코드를 일부 변경하고 싶습니다.

Linux에서 드라이버 모듈의 코드 흐름을 이해하는 정확하거나 일반적인 방법은 무엇입니까?

답변1

내가 이것을하고 싶을 때 나는 사용한다ftrace액자. 먼저 특수 파일 시스템을 마운트합니다:

mount -t tracefs nodev /sys/kernel/tracing

(루트로서, 이 모든 작업을 수행하려면 루트여야 하며 어쨌든 모든 작업을 루트로 수행하게 되며 를 사용하는 것보다 루트 쉘을 갖는 것이 더 쉽습니다 sudo).

그런 다음 해당 디렉터리로 전환합니다.

cd /sys/kernel/tracing

README간단한 요약을 제공하는 기본 콘텐츠가 포함되어 있습니다 . 내가 사용하는 함수 호출을 탐색하기 위해함수 그래프 추적기, function_graph존재하다 available_tracers. 예를 들어 관심 있는 기능을 식별하세요.ath9k_htc_tx, 설정

echo ath9k_htc_tx > set_graph_function

다른 기능을 추가할 수 있으므로 >>첫 번째 기능 다음에 사용하세요. 다음 명령을 사용하여 구성된 기능을 볼 수 있습니다.

cat set_graph_function

을 작성할 때 set_graph_function실행 중인 커널에 대해 함수를 확인합니다. 함수를 찾을 수 없으면 쓰기가 실패하므로 아무것도 추적할 수 없게 되면 즉시 알 수 있습니다.

기능을 설정한 후 추적기를 활성화합니다.

echo function_graph > current_tracer

trace그런 다음 파일을 보십시오 . 추적기를 다시 비활성화하려면,

echo nop > current_tracer

또는 tracing_on0 또는 1(0은 추적을 비활성화하고 1은 추적을 다시 활성화)을 작성하여 전환합니다.

답변2

요점은 드라이버가 상위 인터페이스와 하위 인터페이스를 함께 연결한다는 것입니다. 의 경우 ath9k_htc하위 인터페이스가 USB이고 상위 인터페이스가 네트워크 스택입니다.

제어 흐름은 동기화 없이 두 인터페이스의 이벤트에 반응할 수 있는 상태 시스템입니다. 예를 들어, 네트워크 인터페이스가 드라이버에 멀티캐스트 그룹에 참여하도록 알리는 동시에 장치가 제거되지 않도록 알리는 것이 전적으로 가능합니다. USB 하위 시스템 - 다중 프로세서 시스템에서 이러한 이벤트는 서로 다른 CPU에 보고될 수 있으며 드라이버는 동시에 입력됩니다.

대부분의 드라이버에는 프로세스 또는 스레드 컨텍스트가 없으며 순전히 이벤트 기반이며 이벤트 루프는 드라이버 외부에 있으므로 일반적으로 특정 이벤트를 처리하고 전달을 시도하며 실패하면 어딘가에 기록하는 많은 작은 함수를 볼 수 있습니다. , 즉시 반환합니다.

일반적인 드라이버에서 제어 흐름을 시각화하는 가장 현명한 방법은 잠글 수 있는 공유 리소스와 이에 액세스하는 기능의 맵을 그리는 것입니다. 일반적인 통신 라인은 목록을 잠그고, 여기에 데이터를 추가하고, 잠금을 해제하는 것이기 때문입니다. 한쪽에는 USB 관련 기능을, 다른 한쪽에는 네트워크 관련 기능을 그리면 그림이 가장 명확해집니다.

관련 정보