ftrace
은 커널의 기능 추적에 사용됩니다. 이제 인터럽트는 어떻게 작동합니까? 인터럽트 모드에서 커널 기능을 추적 할 수 있습니까? 그렇다면 어떻게 작동하는지 설명 할 수 있습니다. 함수 호출을 추적하는 함수를 작성하려고하는데 수퍼바이저 모드에서 제대로 작동하지만 인터럽트 모드에서는 작동하지 않습니다 (루프에 들어가기). 내가 그것을 IRQ 모드에서 작동하게 만들 필요가있다.ftrace는 인터럽트 서비스 루틴을 어떻게 추적합니까?
답변
자세한 내용은 Linux kernel ARM exception stack init과 마찬가지로 Linux에서 사용되는 IRQ 스택의 양은 최소화되어 있습니다. ARM에는 IRQ 모드에 대해 lr
및 sp
을 비롯한 여러 개의 뱅크 레지스터가 있습니다. Linux ARM 커널에서 이러한 레지스터는 정보를 감독자 (8K) 스택으로 전송하는 데에만 잠깐 사용됩니다. 이 관리자 스택은 메모리 관리자, 스케줄러 및 파일 시스템 정보에 대한 포인터와 작업 상황에 맞는 블록을 포함 또한 커널 프로세스 당 할당하고있다.
Linux에서 감독자 스택은 FIQ, IRQ, 정의되지 않은 명령어, 데이터 및 명령어 오류를 비롯한 모든 모드에 대한 스택 정보를 가지고 있습니다. 이는 하나의 스택 만 추적해야 함을 의미합니다. 특별한 정보 (의사 어셈블러)는 UNWIND(.fnend)
과 ENDPROC(__irq_usr)
과 같이 entry-armv.S에 포함되어 있으며 스택 추적 코드가 스택의 데이터 레이아웃을 이해할 수 있도록 unwind 테이블을 생성하기 위해 커널에 ELF 정보를 주석으로 표시합니다.
Vector page mapping in ARM Linux에는 스택/모드 전환을 수행하는 vector_name
어셈블러 매크로와 같은 몇 가지 추가 세부 정보가 있습니다. vector_name
어셈블러 매크로는 실제로 IRQ 모드로 실행되는 유일한 코드입니다. irq_usr
및 irq_svc
은 감독자 모드에서 감독자 스택과 함께 실행됩니다.
ftrace는 stack에서 함수 이름을 어떻게 출력합니까? ftrace (나는 코드를 의미 함)에 함수 이름을 출력하는 구현 부분을 지적 할 수 있습니까? 커널 소스에서 ftrace.c 파일을 검사했지만 이해할 수 없었습니다. – karthikpj
[stacktrace.c] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/kernel/stacktrace.c?id=refs/tags/) v4.10-rc3)은 [ARM lr 및 fp] (http://stackoverflow.com/questions/15752188/arm-link-register-and-frame-pointer/15752671#15752671)에 따라 표준 오프셋을 사용하여 스택 추적을 수행합니다. . [unwind.c] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/kernel/unwind.c?id=reffs/tags/v4). 10-rc3)은 기능을 결정하기 위해 PC와 테이블을 참조하는보다 현대적인 버전입니다. –
Mike Frysinger의 [ftrace-design] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/Documentation/trace/ftrace-design.txt)에는 자세한 내용과 현재 사용중인 커널 버전이어야합니다. –
"* _irq_handler"에서 기능 추적을 수행하면 내 추적 출력 (x86 시스템)의 라인입니다. "Xorg-1448 [000] d.h. 830819.774909 : ironlake_irq_handler <-__ handle _irq_event_percpu". "h"는 hardirq 컨텍스트에 있음을 의미합니다. 그것은 두 번째 질문에 대답합니까? 그리고 첫 번째로 확장 할 수 있습니까? – michaeljt