커널 디버깅 도구인 KGDB는 어떻게 작동하나요?
KGDB 디버깅 환경을 설치하려면 Linux 커널에 kgdb 패치를 추가해야 합니다. 패치는 명령 처리, 트랩 처리 및 직렬 포트 통신의 세 가지 주요 부분을 포함하여 GDB 원격 디버깅에 필요한 기능을 구현합니다. KGDB 패치의 주요 기능은 Linux 커널에 디버깅 스텁을 추가하는 것입니다. 디버깅 스텁은 Linux 커널의 작은 코드 조각이며 GDB를 실행하는 개발 시스템과 디버깅된 커널 사이의 중개자입니다. GDB와 디버그 스텁 간의 통신은 GDB 직렬 프로토콜을 통해 이루어집니다. GDB 직렬 프로토콜은 다양한 디버깅 명령을 포함하는 메시지 기반 ASCII 코드 프로토콜입니다. 중단점을 설정할 때 KGDB는 중단점 명령을 트랩 명령으로 대체합니다. 중단점이 실행되면 제어가 디버깅 스텁으로 이전됩니다. 이 시점에서 스텁을 디버깅하는 작업은 원격 직렬 통신 프로토콜을 사용하여 현재 환경을 GDB로 전송한 다음 GDB로부터 명령을 받는 것입니다. GDB 명령은 스텁에게 다음에 수행할 작업을 알려줍니다. 스텁이 실행을 계속하라는 명령을 받으면 프로그램의 실행 환경을 복원하고 CPU 제어권을 커널로 반환합니다. KGDB 패치는 커널에 다음 세 가지 구성 요소를 추가합니다:
(1) GDB 스텁
GDB 스텁은 디버깅 계측(줄여서 스텁)이라고 하며 KGDB 디버거의 핵심입니다. . 호스트에서 GDB의 다양한 요청을 처리하는 데 사용되는 Linux 커널의 작은 코드 조각이며 커널이 디버그 상태에 있을 때 대상 머신 보드의 프로세서를 제어합니다.
(2) 예외 처리 기능 수정
이 예외가 발생하면 커널은 제어권을 KGDB 디버거에 넘기고 프로그램은 KGDB에서 제공하는 예외 처리 기능으로 들어갑니다. 그 안에서 프로그램의 다양한 상황을 분석할 수 있다.
(3) 직렬 통신
GDB와 스텁은 GDB 직렬 프로토콜을 통해 통신합니다. 다양한 디버깅 명령이 포함된 메시지 기반 ASCII 코드 프로토콜입니다. 직렬 포트 외에 네트워크 카드를 사용하여 통신할 수도 있습니다. KGDB와 GDB 간의 작업 프로세스를 설명하기 위해 커널 중단점 설정을 예로 들어 보겠습니다. 중단점을 설정할 때 KGDB는 커널 코드를 수정하고 중단점 위치의 명령어를 예외 명령어(ARM에서는 정의되지 않은 명령어임)로 대체합니다. 실행이 중단점에 도달할 때 예외가 발생하면 제어는 스텁의 예외 처리 기능으로 이전됩니다. 이때 스텁의 임무는 GDB 직렬 통신 프로토콜을 사용하여 현재 환경을 GDB로 전송한 다음 GDB로부터 명령을 받는 것입니다. GDB 명령은 스텁에게 다음에 수행할 작업을 알려줍니다. 스텁이 실행을 계속하라는 명령을 받으면 원래 대체된 명령을 복원하고 프로그램의 실행 환경을 복원하며 CPU 제어권을 커널로 반환합니다.