인프런 커뮤니티 질문&답변

김상현님의 프로필 이미지

작성한 질문수

ARM Cortex-M 프로세서 프로그래밍

s522_익셉션 사례 분석

Memory fault, Bus fault 관련 질문드립니다.

해결된 질문

23.03.28 07:30 작성

·

1.6K

1

강사님. 강의 잘 보고 있습니다.

수업을 듣다보니 Bus fault, Memory fault에 대해 궁금해져서 질문 드립니다.

구글링해도 명확한 답을 못 찾아서 그런데, 둘은 어떤 오류가 감지될 때 실행되는 익셉션인지 설명해주실 수 있을까요?

답변 1

0

홍영기님의 프로필 이미지
홍영기
지식공유자

2023. 03. 28. 23:55

안녕하세요. 김상현님!

질문하신 내용에 대한 각종 자료의 부재로 저도 이 부분에 대한 이해도가 떨어집니다.

아쉬운대로 이 질문들을 챗지티피에 물어보았습니다.

그 결과를 공유합니다. 긴글주의요망!!!

pm0214-stm32 TRM 문서내의 4.4.12 Bus fault status register (BFSR) 와 4.4.13 Memory management fault address register (MMFSR)을 함께 참조하시면 좋습니다.


첫째, 버스 폴트에 대해서 물어보았습니다.

버스폴트 유형1. LSPERR: Bus fault on floating-point lazy state preservation

LSPERR (Lazy State Preservation Error)는 Cortex-M 프로세서에서 발생하는 특정한 버스 폴트입니다. 이 오류는 부동 소수점(Floating-Point) 유닛의 지연 상태 보존(Lazy State Preservation) 동작 중에 발생합니다.

Cortex-M 프로세서에는 부동 소수점(Floating-Point) 연산을 지원하는 FPU(Floating-Point Unit)이 포함되어 있을 수 있습니다. FPU는 복잡한 수치 연산을 빠르게 처리할 수 있도록 도와줍니다. FPU는 일반 레지스터와 별도의 레지스터 집합을 사용하며, 이 레지스터들은 부동 소수점 상태를 저장하는 데 사용됩니다.

부동 소수점 연산을 포함하는 프로세스 간의 전환 시, Cortex-M 프로세서는 보통 FPU 레지스터를 저장하고 복원하는 작업을 수행합니다. 그러나 이 작업은 매우 자주 발생하므로, 성능을 최적화하기 위해 Cortex-M 프로세서는 지연 상태 보존(Lazy State Preservation)이라는 기술을 사용합니다.

지연 상태 보존은 프로세서가 FPU 상태를 실제로 사용할 때까지 레지스터 저장 및 복원 작업을 연기합니다. 이 방식을 사용하면, FPU를 사용하지 않는 프로세스 전환에 대한 오버헤드를 줄일 수 있습니다.

그러나 지연 상태 보존 동작 중에 메모리 액세스 오류가 발생할 경우, LSPERR이 발생합니다. 이러한 오류는 일반적으로 하드웨어 결함, 전원 문제 또는 잘못된 시스템 구성으로 인해 발생합니다

버스폴트 유형2. STKERR: Bus fault on stacking for exception entry

STKERR (Stacking Error)는 Cortex-M 프로세서에서 발생하는 버스 폴트의 한 유형입니다. 이 오류는 프로세서가 예외 처리를 위해 스택 연산을 수행하는 동안 메모리 액세스 문제가 발생했음을 나타냅니다.

Cortex-M 프로세서는 예외 발생 시 현재 실행 중인 작업을 중단하고 예외 처리 루틴을 시작합니다. 이 과정에서 프로세서는 현재 실행 상태를 저장하기 위해 스택에 일부 레지스터 값을 푸시합니다. 이렇게 함으로써, 예외 처리가 완료된 후 원래의 작업을 계속할 수 있습니다.

STKERR는 다음과 같은 상황에서 발생할 수 있습니다:

1. 잘못된 스택 포인터: 프로세서의 스택 포인터가 잘못된 메모리 주소를 가리키거나 메모리 영역 외부에 있을 경우 발생할 수 있습니다. 이 경우, 스택 연산이 실패하며 STKERR이 발생합니다.

2. 스택 오버플로: 프로세서의 스택 메모리가 충분하지 않을 경우 스택 오버플로가 발생하며, 이로 인해 STKERR이 발생할 수 있습니다.

3. 메모리 액세스 문제: 하드웨어 결함, 전원 문제, 시스템 구성 오류 등으로 인해 프로세서가 스택 메모리에 액세스할 수 없을 때 STKERR이 발생합니다.

버스폴트 유형3. IMPRECISERR: Imprecise data bus error

IMPRECISERR (Imprecise Data Bus Error)는 ARM Cortex-M 프로세서에서 발생하는 버스 폴트의 한 유형입니다. 이 오류는 데이터 버스에서 비동기적인 액세스 오류가 발생했을 때 발생하며, 이로 인해 정확한 주소 정보를 알 수 없습니다. 이것이 "Imprecise"라는 용어가 사용되는 이유입니다.

IMPRECISERR는 다음과 같은 상황에서 발생할 수 있습니다:

1. 메모리 연산의 타이밍 문제: 프로세서가 메모리에 액세스하려고 할 때, 메모리 연산의 타이밍에 문제가 생길 수 있습니다. 이는 하드웨어 결함, 전원 문제, 시스템 구성 오류 등으로 인해 발생할 수 있습니다.

2. 동시 메모리 액세스 충돌: 프로세서가 동시에 메모리에 액세스하려고 할 때, 충돌이 발생할 수 있습니다. 예를 들어, DMA (Direct Memory Access) 연산과 프로세서의 메모리 액세스가 동시에 발생하며, 이로 인해 IMPRECISERR이 발생할 수 있습니다.

3. 캐시 일관성 문제: 프로세서의 캐시와 메인 메모리 간의 일관성을 유지하지 못할 경우 발생할 수 있습니다. 이는 프로세서가 잘못된 데이터를 읽거나 쓰게 되어 IMPRECISERR을 일으킬 수 있습니다.

버스폴트 유형4. PRECISERR: Precise data bus error

PRECISERR (Precise Data Bus Error)는 ARM Cortex-M 프로세서에서 발생하는 버스 폴트의 한 유형입니다. 이 오류는 데이터 버스에서 동기적인 액세스 오류가 발생했을 때 발생하며, 이로 인해 정확한 주소 정보를 알 수 있습니다. 이것이 "Precise"라는 용어가 사용되는 이유입니다.

PRECISERR는 다음과 같은 상황에서 발생할 수 있습니다:

1. 잘못된 메모리 주소 액세스: 프로세서가 잘못된 메모리 주소를 액세스하려고 할 때 발생합니다. 예를 들어, 초기화되지 않은 포인터를 사용하거나 메모리 맵 외부의 주소를 액세스하려는 경우입니다.

2. 미사용 메모리 영역 액세스: 프로세서가 허용되지 않은 메모리 영역을 액세스하려고 할 때 발생합니다. 예를 들어, 프로세서가 소프트웨어에서 사용이 금지된 메모리 영역에 액세스하려는 경우입니다.

3. 데이터 버스 에러: 프로세서가 메모리에 액세스하려고 할 때, 하드웨어적인 문제로 인해 데이터 버스 에러가 발생할 수 있습니다. 이는 일반적으로 하드웨어 결함, 전원 문제 또는 잘못된 시스템 구성으로 인해 발생합니다.

버스폴트 유형5. IBUSERR: Instruction bus error

IBUSERR (Instruction Bus Error)는 ARM Cortex-M 프로세서에서 발생하는 버스 폴트의 한 유형입니다. 이 오류는 명령어 버스에서 동기적인 액세스 오류가 발생했을 때 발생하며, 주로 프로세서가 메모리에서 명령어를 읽는 동안 문제가 발생했음을 나타냅니다.

IBUSERR는 다음과 같은 상황에서 발생할 수 있습니다:

잘못된 메모리 주소 액세스: 프로세서가 올바르지 않은 메모리 주소에서 명령어를 읽으려고 할 때 발생합니다. 예를 들어, 초기화되지 않은 함수 포인터를 호출하거나 메모리 맵 외부의 주소에서 명령어를 가져오려는 경우입니다.

실행 권한이 없는 메모리 영역 액세스: 프로세서가 실행 권한이 없는 메모리 영역에서 명령어를 읽으려고 할 때 발생합니다. 이는 보안 기능이나 메모리 보호 장치에 의해 실행이 제한된 영역에서 발생할 수 있습니다.

명령어 버스 에러: 프로세서가 메모리에서 명령어를 읽는 동안 하드웨어적인 문제로 인해 명령어 버스 에러가 발생할 수 있습니다. 이는 일반적으로 하드웨어 결함, 전원 문제 또는 잘못된 시스템 구성으로 인해 발생합니다.


둘째, 메모리 관리 폴트에 대해서 물어보았습니다.

MEM 폴트 유형1. DACCVIOL: Data access violation flag

DACCVIOL (Data Access Violation)은 ARM Cortex-M 프로세서의 Memory Management Fault Status Register (MMFSR)에 있는 플래그입니다. 이 플래그는 프로세서가 데이터 메모리에 액세스하려고 할 때 발생하는 권한 위반을 나타냅니다. 즉, 프로세서가 읽기 또는 쓰기 권한이 없는 메모리 영역에 액세스하려고 할 때 이 플래그가 설정됩니다.

DACCVIOL이 설정되는 상황은 다음과 같습니다:

1. 실행 권한이 없는 메모리 영역 액세스: 프로세서가 실행 권한이 없는 메모리 영역에서 데이터를 읽거나 쓰려고 할 때 발생합니다. 이는 보안 기능이나 메모리 보호 장치에 의해 액세스가 제한된 영역에서 발생할 수 있습니다.

2. 잘못된 메모리 주소 액세스: 프로세서가 올바르지 않은 메모리 주소를 액세스하려고 할 때 발생합니다. 예를 들어, 초기화되지 않은 포인터를 사용하거나 메모리 맵 외부의 주소를 액세스하려는 경우입니다

MEM 폴트 유형2. IACCVIOL: Instruction access violation flag

IACCVIOL (Instruction Access Violation)은 ARM Cortex-M 프로세서의 Memory Management Fault Status Register (MMFSR)에 있는 플래그입니다. 이 플래그는 프로세서가 명령어 메모리에 액세스하려고 할 때 발생하는 권한 위반을 나타냅니다. 즉, 프로세서가 읽기 권한이 없는 메모리 영역에서 명령어를 가져오려고 할 때 이 플래그가 설정됩니다.

IACCVIOL이 설정되는 상황은 다음과 같습니다:

실행 권한이 없는 메모리 영역 액세스: 프로세서가 실행 권한이 없는 메모리 영역에서 명령어를 가져오려고 할 때 발생합니다. 이는 보안 기능이나 메모리 보호 장치에 의해 액세스가 제한된 영역에서 발생할 수 있습니다.

잘못된 메모리 주소 액세스: 프로세서가 올바르지 않은 메모리 주소에서 명령어를 가져오려고 할 때 발생합니다. 예를 들어, 초기화되지 않은 함수 포인터를 호출하거나 메모리 맵 외부의 주소에서 명령어를 가져오려는 경우입니다

MEM 폴트 유형3. MSTKERR: Memory manager fault on stacking for exception entry

MSTKERR (Memory Manager Fault on Stacking for Exception Entry)는 ARM Cortex-M 프로세서의 Memory Management Fault Status Register (MMFSR)에 있는 플래그입니다. 이 플래그는 프로세서가 예외 진입 과정에서 스택에 데이터를 저장하는 동안 메모리 관리 오류가 발생했음을 나타냅니다.

MSTKERR는 다음과 같은 상황에서 발생할 수 있습니다:

1. 스택 오버플로: 프로세서의 스택이 메모리 영역을 벗어나거나 스택 영역 내에서 다른 데이터를 덮어 쓸 때 발생합니다. 이는 프로세서가 예외를 처리하기 위해 스택에 데이터를 저장하려고 할 때 발생할 수 있습니다.

2. 메모리 보호 오류: 스택 영역에 대한 액세스 권한이 제한되어 있거나, 메모리 보호 장치 설정이 올바르지 않은 경우 발생할 수 있습니다. 이로 인해 프로세서가 스택에 데이터를 저장하려고 할 때 메모리 관리 오류가 발생할 수 있습니다

 

여기까지가 제가 chatGPT를 통해 얻어낸 정보입니다. 이 글은 인공지능에 의해 생성된 글로써 그 내용을 보증할 수 없습니다. 참고로만 사용해 주시길 부탁드립니다.