작성
·
52
0
안녕하세요
0xffffff8008082580: d53201f nop
...
이런 식의 exception handler 코드는 어디서 볼 수 있나요?
코딩-> 컴파일을 해서 나온 결과 인가요 아니면 저렇게 일일이 주소: 명령어 다 넣게 된 것인가요?
답변 2
0
Armv8-A 기반 리눅스 커널은 익셉션 핸들러를 아래와 같은 방식으로 구현합니다.
vectors라는 심볼을 선언한다.
vectors라는 심볼의 주소를 리눅스 커널이 부팅하는 과정에서 VBAR_EL1 (익셉션 벡터 베이스 주소를 저장하는 레지스터)에 저장한다.
이후 익셉션이 유발되면 VBAR_EL1에 저장된 주소를 기준으로 익셉션 벡터 주소로 분기한다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. platformpjt02님.
질문하신 내용은 ARM 아키텍처에서의 익셉션 핸들러 코드에 대한 것입니다. 주소와 연관된 명령어는 보통 어셈블리 레벨의 코드로, 컴파일된 결과를 디스어셈블링하여 볼 수 있는 형태입니다. 여기서 몇 가지 포인트를 간단히 설명드립니다:
컴파일된 바이너리: 일반적으로, C나 다른 고급 언어로 작성된 코드는 컴파일러에 의해 기계어 코드로 변환됩니다. 이때 생성된 기계어 코드는 특정 주소에서 실행되며, 종종 어셈블리 언어로 디스어셈블링해 확인할 수 있습니다.
디스어셈블러: 디스어셈블러는 미리 컴파일된 바이너리 파일의 기계어 코드를 사람이 읽을 수 있는 어셈블리 코드로 변환하는 도구입니다. 이를 통해 바이너리의 특정 부분이 어떤 명령어들로 구성되어 있는지를 볼 수 있습니다.
어셈블리 레벨 코딩: 일부 시스템에서는 개발자들이 특정한 성능이나 제어가 필요한 경우 직접 어셈블리 코드를 작성하기도 합니다. 하지만 일반적인 경우, 전체 프로그램을 직접 어셈블리 코드로 작성하는 것은 드문 상황입니다.
질문에서 제시하신 “0xffffff8008082580: d53201f nop” 형태는 디스어셈블된 코드의 한 줄로 볼 수 있으며, 이는 이미 컴파일된 코드에서 디스어셈블링하여 확인하는 방식이 일반적입니다.
관련하여 자세한 디스어셈블링 과정을 알고 싶으시면 다음 게시글을 참고하세요:
- 익셉션 핸들러 분석 및 디버깅 방법
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.