강의

멘토링

커뮤니티

Inflearn コミュニティ Q&A

platformpjt029321 のプロフィール画像
platformpjt029321

投稿した質問数

システムソフトウェア開発のためのArmアーキテクチャの構造と原理 - 第2部 著者直講(2024年版)

Armv8例外ハンドラー(Linux Kernel)分析 Part.2

exception handler code

作成

·

95

0

안녕하세요

0xffffff8008082580: d53201f nop

...

이런 식의 exception handler 코드는 어디서 볼 수 있나요?

코딩-> 컴파일을 해서 나온 결과 인가요 아니면 저렇게 일일이 주소: 명령어 다 넣게 된 것인가요?

임베디드arm-architecture하드웨어-해킹cpu-architecturearmv7armv8cortex-a

回答 2

0

austinkim님의 프로필 이미지
austinkim
インストラクター

Armv8-A 기반 리눅스 커널은 익셉션 핸들러를 아래와 같은 방식으로 구현합니다.

  • vectors라는 심볼을 선언한다.

  • vectors라는 심볼의 주소를 리눅스 커널이 부팅하는 과정에서 VBAR_EL1 (익셉션 벡터 베이스 주소를 저장하는 레지스터)에 저장한다.

  • 이후 익셉션이 유발되면 VBAR_EL1에 저장된 주소를 기준으로 익셉션 벡터 주소로 분기한다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. platformpjt02님.

질문하신 내용은 ARM 아키텍처에서의 익셉션 핸들러 코드에 대한 것입니다. 주소와 연관된 명령어는 보통 어셈블리 레벨의 코드로, 컴파일된 결과를 디스어셈블링하여 볼 수 있는 형태입니다. 여기서 몇 가지 포인트를 간단히 설명드립니다:

  1. 컴파일된 바이너리: 일반적으로, C나 다른 고급 언어로 작성된 코드는 컴파일러에 의해 기계어 코드로 변환됩니다. 이때 생성된 기계어 코드는 특정 주소에서 실행되며, 종종 어셈블리 언어로 디스어셈블링해 확인할 수 있습니다.

  2. 디스어셈블러: 디스어셈블러는 미리 컴파일된 바이너리 파일의 기계어 코드를 사람이 읽을 수 있는 어셈블리 코드로 변환하는 도구입니다. 이를 통해 바이너리의 특정 부분이 어떤 명령어들로 구성되어 있는지를 볼 수 있습니다.

  3. 어셈블리 레벨 코딩: 일부 시스템에서는 개발자들이 특정한 성능이나 제어가 필요한 경우 직접 어셈블리 코드를 작성하기도 합니다. 하지만 일반적인 경우, 전체 프로그램을 직접 어셈블리 코드로 작성하는 것은 드문 상황입니다.

질문에서 제시하신 “0xffffff8008082580: d53201f nop” 형태는 디스어셈블된 코드의 한 줄로 볼 수 있으며, 이는 이미 컴파일된 코드에서 디스어셈블링하여 확인하는 방식이 일반적입니다.

관련하여 자세한 디스어셈블링 과정을 알고 싶으시면 다음 게시글을 참고하세요:
- 익셉션 핸들러 분석 및 디버깅 방법

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

platformpjt029321 のプロフィール画像
platformpjt029321

投稿した質問数

質問する