이어서 디바이스 메모리를 알아봅시다. 메모리 맵을 보면 다양한 페리페럴 디바이스의 세부 정보와 함께 레지스터를 볼 수 있습니다. 이를 Memory-Mapped I/O 혹은 디바이스 메모리라고 합니다.
디바이스 메모리 타입은 노멀 메모리 타입과 어떤 차이점이 있을까요? Arm 프로세서 입장에서 노멀 메모리로 마킹된 데이터는 메모리에 접근하는 명령어의 순서를 바꾸는 메모리 리오더링 기법이 적용됩니다. 하지만 디바이스 메모리인 경우는 다릅니다. 디바이스 메모리로 마킹된 데이터에 액세스할 때 메모리 리오더링이 적용되면 프로그래머가 예상하지 못한 오동작이 발생할 수 있습니다. 그래서 디바이스 메모리로 마킹된 데이터는 명령어를 순차적으로 실행해야 합니다.
디바이스 메모리는 페리페럴을 제어하는 용도로 사용되므로 명령어는 디바이스 메모리 타입으로 마킹된 메모리 영역에 로딩되면 안 됩니다. 그래서 디바이스 메모리로 지정된 영역은 실행 불가(not executable)로 지정돼야 합니다. 디바이스 메모리 영역으로 지정된 공간을 '실행 불가'로 설정하지 않으면 프로세서는 명령어를 메모리에서 미리 예측해 로딩할 수도 있어 그 결과 시스템이 예상치 못한 오동작을 할 수 있습니다.
'시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 > 17장: 메모리 모델' 카테고리의 다른 글
[Arm프로세서] 메모리 리오더링 예시 (0) | 2024.01.01 |
---|---|
[Arm프로세서] 어드레스 의존성이란? (0) | 2024.01.01 |
[Arm프로세서] 메모리 리오더링 소개 (0) | 2024.01.01 |
[Arm프로세서] Armv8:메모리 맵과 메모리 모델 (0) | 2024.01.01 |
[Arm프로세서] Armv8: 노멀 메모리 타입이란 (0) | 2024.01.01 |