캐시 메모리의 종류
1. 직접 사상 방식 (Direct-Mapped Cache)
● 구조 및 동작
- 메인 메모리의 각 블록은 캐시의 한 특정 위치에만 매핑됩니다.
- 메모리 블록 주소의 일부 비트가 캐시 인덱스를 결정하며, 이 인덱스에 해당하는 캐시 라인에만 저장됩니다.
- 블록 충돌이 발생하기 쉬움: 서로 다른 여러 메모리 블록이 동일한 캐시 라인에 매핑될 경우, 계속해서 덮어쓰기(overwriting)가 일어남.
● 장점
- 구현이 간단하고 빠름 (인덱스를 통해 즉시 접근 가능)
- 하드웨어 비용이 낮음
● 단점
- 충돌이 자주 발생하면 캐시 효율이 급격히 떨어짐
2. 완전 연관 사상 방식 (Fully Associative Cache)
● 구조 및 동작
- 메모리 블록이 캐시의 어느 위치에든 저장 가능
- 각 캐시 블록에는 태그(tag)가 붙으며, 캐시 검색 시 전체 태그를 비교하여 일치 여부를 확인
- 주소의 모든 블록이 캐시의 모든 라인에 저장 가능하므로 유연성 높음
● 장점
- 캐시 미스 확률이 낮음 (충돌이 거의 없음)
- 유연한 저장 구조
● 단점
- 구현 복잡성 매우 높음 (모든 캐시 라인을 동시에 비교해야 하므로 비교 회로가 복잡)
- 비용과 전력 소비가 큼
3. 집합 연관 사상 방식 (Set-Associative Cache)
● 구조 및 동작
- 직접 사상 방식과 완전 연관 사상 방식의 절충안
- 캐시는 여러 개의 **세트(Set)**로 나뉘며, 각 세트는 여러 개의 **라인(Line)**을 가짐
- 메모리 블록은 특정 세트에만 매핑되지만, 그 세트 내의 어느 라인에든 저장 가능
- 예: 4-way set associative → 각 세트에 4개의 라인 존재
● 장점
- 직접 사상보다 충돌이 적고, 완전 연관 사상보다 구현이 간단
- 성능과 비용의 균형이 좋음
● 단점
- 세트 내에서의 비교가 필요하므로 완전히 단순하지는 않음
- 세트 크기에 따라 성능이 달라짐
휘발성에 따른 메모리 종류
volatile : RAM 계열 메모리
non - volatile : ROM 계열 메모리
소프트웨어에서 volatile 키워드
volatile : volatile 변수가 cmd에 포함되어 있는 경우 최적화 과정을 생략하라는 것을 명시한다.(무의미하게 반복되는 것처럼 보여도 의미있는 경우가 있다!)
int* rREG = ADDRESS;
i = *rREG;
print(i);
i = *rREG; //일반적인 컴파일러는 최적화 중 해당 코드를 삭제한다.
print(i);
i = *rREG; //일반적인 컴파일러는 최적화 중 해당 코드를 삭제한다.
print(i);
//반복은 의미가 있을 수 있다. ex) 최신 값 갱신 등
//volatile 변수를 이용하면 코드를 삭제하는 것을 방지한다.
#define rDATA (*(volatile unsigned int*) Address) : Address(rDATA)에 unsigned int 만큼의 바이트에 값을 써넣겠다.
MPU : 메모리 보호 유닛
여러 개의 프로세스가 동시에 실행되는 경우, 각 프로세스의 메모리 영역을 지켜줄 필요가 있다. 이를 위한 하드웨어적인 메커니즘을 제공하는 것이 MPU이다.
MMU : 메모리 관리 유닛 (MPU + Virtual Address Unit)
가상 메모리 주소를 실제 메모리 주소로 사상해주는 역할을 하는 유닛
virtual address : physical address가 편의에 의해 사상된 것 ex) 프로세스 내 상대 주소 등
physical address : 실제 메모리가 존재하는 주소
CPU <- I-Cache <- Fetch Unit <- ROM <- PC
CPU <- D-Cache <- LD/ST <- RAM(local value) <- SP
CPU -> V.add -> MMU(TLB : Translation Lookaside Buffer) -> P.addr <- ROM/RAM <- PC, SP, DEVICE
HW = 전기전자
FW = c/asm/ firmware
SW = PC (windows, linux)
C
C++ // python
Arm(소비재), PPC(무기, 의료장비 등 고가 장비), x86(방산 등 활용)
vxworks - RTOS (고가, 고성능)
freertos - RTOS (무료, 합리적인 성능)
linux - 많은 운영체제의 기반이 된다
ARM 아키텍처의 발전 단계
● ARMv1 ~ ARMv4 (1985~1994)
- 초기 버전으로, 32비트 RISC 명령어 집합 구조가 형성됩니다.
- ARM7TDMI (1994년)는 가장 성공적인 초기 ARM 코어로, Thumb 명령어 집합(16비트 압축 명령어)을 도입하여 코드 밀도를 개선하였습니다.
● ARMv5 (1995~2001)
- DSP 기능을 일부 통합하고, Jazelle 기술을 도입하여 Java 바이트코드의 하드웨어 실행을 지원함.
- ARM9, ARM10 시리즈 출시.
● ARMv6 (2001~2005)
- SIMD 명령어, 미디어 처리 향상, 캐시 시스템 개선.
- 멀티미디어 기기와 모바일 기기에 널리 사용됨. 예: Apple iPod.
● ARMv7 (2005~2011)
- 크게 3가지 프로파일로 구분됨:
- A (Application): 고성능 애플리케이션용 (예: Cortex-A 시리즈)
- R (Real-time): 실시간 시스템용 (예: Cortex-R 시리즈)
- M (Microcontroller): 마이크로컨트롤러용 (예: Cortex-M 시리즈)
- Thumb-2, NEON SIMD, TrustZone 보안 기술 도입.
● ARMv8 (2011~2020)
- 가장 중요한 변화는 64비트 지원(AArch64) 추가입니다.
- AArch64와 기존 AArch32 모드를 동시에 지원하여 이식성과 호환성을 유지.
- ARMv8.1~v8.6로 세분화되어 가며, 보안/가상화/SIMD 성능 지속 개선.
● ARMv9 (2021~현재)
- 보안과 AI 연산을 강화.
- Confidential Compute Architecture (CCA) 도입으로 하드웨어 기반 보안 영역 강화.
- Scalable Vector Extension (SVE2)로 AI 및 고성능 컴퓨팅 최적화.
ARM의 프로세서 모드
1. privilieged mode :
x86 : supervisor, 하나의 특권 모드에서 모든 기능 제공
ARM(legacy) : svc(supervisor call, default), UND(부정의 익셉션), IRQ(인터럽트), FIQ (인터럽트) , ABT (abort 익셉션) .. (기능별로 특권 모드를 분류)
svc 기능 분류에 따라 두 개로 분리 됨
legacy = ARM7, ARM9, ARM11, cortex-A, cortex-R
cortex-M : Handler mode(특권 모드 - 익셉션, 인터럽트 - no os env , default), Thread mode(특권 모드(펌웨어 어플리케이션 처리) + 비특권 모드(어플리케이션 처리) - os exit, ex) app on FreeRTOS)
2. non- privilieged mode :
x86 : user
ARM : usr(user)
Registers : ROM x, RAM x, Flip-Flop으로 구성된 메모리 소자(gate logic)
1. configuration register : 동작을 정의(ex) input mode vs output mode)
2. controll register : 제어를 담당하는 레지스터 ex) on or off
3. data register : 데이터를 읽거나 쓰는 레지스터
4. status register : 현재 상태에 대한 레지스터(메이저 스테이트 레지스터)
1.GPR - General Purpose Reg ex) r0 ~ r12, scratchpad register
2.SPR - Special Purpose Reg ex) SP(스택 포인터), link register(return address를 가지고 있음, BL, return 할 곳이 여러 곳이면 스택에 저장하고 활용한다.return from function), PC(다음 명령 주소) hardware-wired register
3.SFR - Special Function Reg : 위의 1, 2, 3, 4가 SFR 기능(Hardware-wired), 특이하게 address를 가진다.***
연산에 대한 대가 비교
(+/-) < (<< >>) < MUL < DIV
*** Bit operation ***
SFR을 조작할 때 주로 사용하거나, status 확인할 때 사용
mask : 관심있는 부분의 필드값
& : 관심있는 부분만 읽겠다.
| : 비트 필드 세트(1)
0으로 세팅 : 세팅하고자 하는 마스크를 이용하여(부정 후 and, 클리어 연산) -> 원하는 값으로 세팅 or 연산
^(XOR) : toggle 연산
'VEDA 복습' 카테고리의 다른 글
VEDA 27일차 - 임베디드 리눅스 (0) | 2025.04.22 |
---|---|
VEDA 26일차 - 임베디드 리눅스 프로그래밍 (0) | 2025.04.21 |
VEDA 24일차 - 임베디드 시스템 이해 (0) | 2025.04.17 |
VEDA 21일차 ~ 23일차 - Qt 프로젝트(일정 관리 어플리케이션) (0) | 2025.04.16 |
VEDA 18일차 ~ 20일차 : Qt 프로그래밍 (0) | 2025.04.10 |