강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của platformpjt029321
platformpjt029321

câu hỏi đã được viết

Cấu trúc và Nguyên lý của Kiến trúc Arm dành cho Phát triển Phần mềm Hệ thống - Phần 2 Bài giảng trực tiếp từ tác giả (Phiên bản năm 2024)

Phân tích trình xử lý ngoại lệ Armv8 (kernel Linux) Phần 2

exception handler code

Viết

·

95

0

안녕하세요

0xffffff8008082580: d53201f nop

...

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

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

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

Câu trả lời 2

0

austinkim님의 프로필 이미지
austinkim
Người chia sẻ kiến thức

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

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

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

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

감사합니다.

0

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

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

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

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

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

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

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

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

Hình ảnh hồ sơ của platformpjt029321
platformpjt029321

câu hỏi đã được viết

Đặt câu hỏi