▣ 1장: Arm 프로세서 소개 1.1 Arm 프로세서의 역사 __1.1.1 에이콘의 설립 __1.1.2 Arm사의 설립 __1.1.3 2010년 이후의 모바일 시장 석권 1.2 Arm 프로세서의 시리즈 __1.2.1 Cortex-A 시리즈 __1.2.2 Cortex-R 시리즈 __1.2.3 Cortex-M 시리즈 1.3 Arm 프로세서의 전망 __1.3.1 Arm 프로세서의 출하량 __1.3.2 Arm의 생태계 1.4 Arm의 라이선스 모델 1.5 Arm 프로세서 관련 용어 __1.5.1 Arm 아키텍처란? __1.5.2 Arm 프로세서란? __1.5.3 Arm 코어란? 1.6 이 책의 구성 1.7 이 책에서 다루는 Arm 아키텍처와 운영체제 __1.7.1 Arm 아키텍처 __1.7.2 Arm 프로세서와 함께 다루는 운영체제 1.8 정리 ▣ 2장: Arm 아키텍처 학습 방법 2.1 Arm 프로세서는 왜 배워야 할까? __2.1.1 브링업을 잘 하기 위해 __2.1.2 디바이스 드라이버 개발을 잘 하기 위해 __2.1.3 RTOS나 리눅스 커널을 깊이 있게 이해하기 위해 __2.1.4 디버깅을 통한 문제 해결 능력을 키우기 위해 __2.1.5 Arm 아키텍처를 일반 소프트웨어 개발자도 배워야 하는 이유 2.2 Arm 프로세서를 공부하는 방법의 문제점 __2.2.1 Arm 어셈블리 명령어를 무리하게 암기한다 __2.2.2 Arm 아키텍처의 내용만 따로 배운다 __2.2.3 배운 내용이 실전 프로젝트에서 어떻게 활용되는지 파악하지 않는다 2.3 Arm 아키텍처는 어떻게 공부해야 할까? __2.3.1 디버깅을 하면서 어셈블리 명령어를 익힌다 __2.3.2 운영체제의 기본 원리와 함께 Arm 아키텍처를 배운다 __2.3.3 실전 프로젝트에서 배운 내용이 어떤 방식으로 구현돼 있는지 확인한다 2.4 정리 ▣ 3장: 레지스터 3.1 레지스터 소개 __3.1.1 레지스터란? __3.1.2 Arm 아키텍처의 레지스터 3.2 Armv7 아키텍처의 레지스터 __3.2.1 범용 레지스터 ____3.2.1.1 Arm 스펙에서 범용 레지스터 확인하기 ____3.2.1.2 R0 ~ R15 레지스터의 역할 ____3.2.1.3 범용 레지스터에서 뱅크드 레지스터란? __3.2.2 CPSR와 SPSR 레지스터 ____3.2.2.1 CPSR 레지스터 ____3.2.2.2 SPSR 레지스터 3.3 Armv8 아키텍처의 레지스터 __3.3.1 Armv8 아키텍처의 범용 레지스터 ____3.3.1.1 범용 레지스터 소개 __3.3.2 스페셜 레지스터 __3.3.3 PSTATE와 SPSR_ELx 레지스터 ____3.3.3.1 PSTATE ____3.3.3.2 SPSR_ELx 레지스터 ____3.3.3.3 PSTATE의 필드를 설정하는 명령어 __3.3.4 시스템 레지스터 __3.3.5 시스템 레지스터에 접근하는 명령어 3.4 정리 ▣ 4장: 어셈블리 명령어 4.1 Arm 어셈블리 명령어 소개 __4.1.1 어셈블리 명령어란? __4.1.2 어셈블리 명령어의 기본 형식 __4.1.3 어셈블리 명령어의 종류 __4.1.4 어셈블리 명령어로 무엇을 할 수 있을까? __4.1.5 어셈블리 명령어의 진실과 오해 4.2 데이터 처리 명령어 __4.2.1 Move 명령어 ____4.2.1.1 MOV 명령어 ____4.2.1.2 MVN 명령어 __4.2.2 산술 명령어 ____4.2.2.1 ADD 명령어 ____4.2.2.2 SUB 명령어 ____4.2.2.3 ADC 명령어 ____4.2.2.4 SBC 명령어 ____4.2.2.5 RSB 명령어 ____4.2.2.6 RSC 명령어 __4.2.3 비트 시프트 명령어 ____4.2.3.1 LSL 명령어 ____4.2.3.2 LSR 명령어 ____4.2.3.3 ASR 명령어 ____4.2.3.4 ROR 명령어 __4.2.4 논리 비트 명령어 ____4.2.4.1 AND 명령어 ____4.2.4.2 ORR 명령어 ____4.2.4.3 ORN 명령어 ____4.2.4.4 BIC 명령어 ____4.2.4.5 EOR 명령어 4.3 메모리 연산 명령어 __4.3.1 Load(ldr) 명령어 __4.3.2 Store(str) 명령어 4.4 Armv7 - A32 비교 및 분기 명령어 __4.4.1 플래그 설정 명령어 ____4.4.1.1 CMP 명령어 ____4.4.1.2 CMN 명령어 ____4.4.1.3 TST 명령어 ____4.4.1.4 TEQ 명령어 __4.4.2 조건부 코드 __4.4.3 B와 BL 명령어 ____4.4.3.1 B 〈label〉 명령어 ____4.4.3.2 BL 〈label〉 명령어 ____4.4.3.3 BR 명령어 ____4.4.3.4 BLR 명령어 4.5 Armv8 - A64 조건부 분기 명령어 __4.5.1 조건부 분기 명령어(B.COND) __4.5.2 Compare/Test 분기 명령어 ____4.5.2.1 CBZ 명령어 ____4.5.2.2 CBNZ 명령어 ____4.5.2.3 TBZ 명령어 ____4.5.2.4 TBNZ 명령어 4.6 트랩 관련 명령어 __4.6.1 SVC 명령어 __4.6.2 HVC 명령어 __4.6.3 SMC 명령어 4.7 프로세서 상태 제어 명령어 __4.7.1 xPSR(CPSR, SPSR) 레지스터 설정 명령어 __4.7.2 PSTATE 설정 명령어 4.8 정리 ▣ 5장: Armv7 - 동작 모드 5.1 Armv7 아키텍처의 동작 모드 소개 __5.1.1 PL와 동작 모드 소개 __5.1.2 어떤 동작 모드를 선택해야 할까? 5.2 동작 모드와 관련된 레지스터 __5.2.1 CPSR 레지스터 __5.2.2 SPSR 레지스터 5.3 동작 모드를 바꾸는 명령어 __5.3.1 MSR CPSR_C 명령어로 동작 모드 변경 ____5.3.1.1 MSR CPSR_C 명령어를 실행하면 변경되는 비트 ____5.3.1.2 MSR CPSR_C 명령어를 사용하는 예제 코드 분석 __5.3.2 SUBS와 MOVS 명령어 5.4 동작 모드를 활용한 리눅스 커널의 구현 방식 __5.4.1 동작 모드별로 스택을 저장 __5.4.2 익셉션이 유발된 후 슈퍼바이저 모드로 변경 5.5 정리 ▣ 6장: Armv8 - 익셉션 레벨 6.1 Armv8 아키텍처의 익셉션 레벨 __6.1.1 익셉션 레벨 소개 __6.1.2 익셉션 레벨과 특권 레벨 __6.1.3 익셉션 레벨은 어떻게 변경될까? 6.2 익셉션 레벨과 관련된 레지스터 __6.2.1 PSTATE와 CurrentEL 레지스터 __6.2.2 SPSR_ELx 레지스터 __6.2.3 ELR_ELx 레지스터 6.3 익셉션 레벨과 관련된 명령어 __6.3.1 mrs 〈Xt〉 CurrentEL __6.3.2 ERET 명령어 __6.3.3 슈퍼바이저 콜(시스템 콜 발생) __6.3.4 하이퍼바이저 콜 __6.3.5 시큐어 모니터 콜 6.4 익셉션 레벨을 읽고 제어하는 예제 코드 분석 __6.4.1 리눅스 커널에서 익셉션 레벨을 읽고 제어하는 루틴 __6.4.2 XEN 하이퍼바이저에서 익셉션 레벨을 체크 6.5 정리 ▣ 7장: 익셉션 소개 7.1 익셉션 소개 __7.1.1 CPU 아키텍처 관점에서 익셉션이란? __7.1.2 Arm 아키텍처 관점에서 익셉션이란? __7.1.3 소프트웨어 관점에서 익셉션이란? 7.2 익셉션의 동작 원리를 잘 알아야 하는 이유 __7.2.1 실전 프로젝트에서 문제해결 능력을 키울 수 있다 __7.2.2 운영체제를 깊이 있게 이해하기 위해 __7.2.3 하이퍼바이저, 트러스트존을 이해하기 위해 7.3 익셉션을 배우기 어려운 이유 __7.3.1 익셉션의 주요 내용은 CPU 설계 관점으로 설명한 내용이 많다 __7.3.2 익셉션이 발생하면 지정된 주소로 분기하는 동작이 낯설다 7.4 익셉션을 효과적으로 배우는 방법 __7.4.1 익셉션을 배우는 데 필요한 기반 지식을 함께 배운다 __7.4.2 익셉션의 기본 동작 원리를 먼저 배운다 __7.4.3 운영체제 커널에 구현된 익셉션 코드를 함께 분석한다 __7.4.4 실습을 하면서 익셉션을 배운다 7.5 익셉션을 구성하는 주요 개념 __7.5.1 익셉션이 발생할 때의 기본 동작 __7.5.2 익셉션 벡터 테이블 __7.5.3 익셉션과 관련된 레지스터 __7.5.4 익셉션 관련 코드는 어디에 구현됐을까? ____7.5.4.1 익셉션과 관련된 코드는 무엇일까? ____7.5.4.2 익셉션 핸들러란? 7.6 정리 ▣ 8장: Armv7 - 익셉션 8.1 Armv7 익셉션의 주요 동작 __8.1.1 Armv7 아키텍처의 익셉션 소개 __8.1.2 익셉션을 구성하는 주요 개념 8.2 익셉션의 전체 실행 흐름 __8.2.1 메모리 어보트 타입 익셉션의 실행 흐름 __8.2.2 인터럽트 타입 익셉션의 실행 흐름 __8.2.3 소프트웨어 인터럽트 익셉션의 실행 흐름 __8.2.4 익셉션의 전체 실행 흐름 정리 8.3 익셉션 종류별 레지스터 변경 __8.3.1 메모리 어보트 타입 익셉션 ____8.3.1.1 Prefetch Abort가 발생할 때 Arm 코어의 세부 동작 ____8.3.1.2 Data Abort를 유발할 때 Arm 코어의 세부 동작 ____8.3.1.3 Undefined Instruction 익셉션을 유발할 때의 Arm 코어의 세부 동작 __8.3.2 인터럽트 타입 익셉션을 유발할 때 Arm 코어의 세부 동작 __8.3.3 소프트웨어 인터럽트 8.4 파이프라인과 익셉션 __8.4.1 파이프라인의 어느 단계에서 익셉션이 발생할까? __8.4.2 익셉션이 유발된 시점의 이전 모드로 복귀하는 방법 정리 8.5 익셉션 벡터 테이블 __8.5.1 익셉션 벡터 테이블이란? __8.5.2 익셉션 벡터 테이블과 익셉션 핸들러 __8.5.3 익셉션 핸들러란? 8.6 익셉션과 같이 배워야 하는 운영체제 지식 __8.6.1 익셉션이 발생하면 프로세스는 어떻게 동작할까? __8.6.2 익셉션 벡터는 프로세스의 어느 공간에서 실행될까? 8.7 메모리 어보트 타입 익셉션은 실제로 어떻게 유발될까? __8.7.1 Undefined Instruction 익셉션이 발생하는 사례 __8.7.2 Prefetch Abort 익셉션이 발생하는 사례 __8.7.3 Data Abort 익셉션이 발생하는 사례 8.8 정리 ▣ 9장: Armv8 - 익셉션 9.1 Armv8 아키텍처의 익셉션 소개 __9.1.1 Armv8 익셉션의 특징 __9.1.2 Armv8 아키텍처의 익셉션을 잘 알아야 하는 이유 9.2 Armv8 익셉션의 종류와 분류 체계 __9.2.1 Synchronous 타입 익셉션 __9.2.2 Asynchronous 익셉션 타입 9.3 익셉션 클래스와 익셉션 신드롬 레지스터(ESR_ELx) __9.3.1 익셉션 신드롬 레지스터(ESR_ELx) __9.3.2 익셉션 클래스 ____9.3.2.1 메모리 어보트 관련 익셉션 클래스 ____9.3.2.2 트랩 관련 익셉션 클래스 ____9.3.2.3 코프로세서의 트랩 관련 익셉션 클래스 ____9.3.2.4 브레이크포인트 관련 익셉션 클래스 ____9.3.2.5 기타 익셉션 클래스 9.4 Armv8 익셉션을 구성하는 주요 개념 __9.4.1 익셉션의 유발 요인 __9.4.2 레지스터 업데이트 __9.4.3 익셉션 레벨 변경 __9.4.4 익셉션 벡터 테이블 __9.4.5 익셉션 핸들러 9.5 익셉션의 전체 실행 흐름 __9.5.1 Synchronous 익셉션의 실행 흐름 ____9.5.1.1 메모리 어보트로 Synchronous 익셉션이 처리되는 전체 흐름 ____9.5.1.2 소프트웨어 인터럽트로 Synchronous 익셉션이 처리되는 전체 흐름 __9.5.2 인터럽트 타입 익셉션의 실행 흐름 __9.5.3 익셉션의 전체 실행 흐름 정리 9.6 익셉션 종류별 레지스터 변경 __9.6.1 Synchronous 익셉션을 유발할 때 변경되는 레지스터 __9.6.2 IRQ 인터럽트 익셉션을 유발할 때 Arm 코어의 세부 동작 9.7 익셉션 벡터 테이블 분석 __9.7.1 익셉션 벡터 테이블을 구성하는 용어 __9.7.2 익셉션 벡터 테이블의 내용 해석하기 __9.7.3 익셉션 레벨별 익셉션 벡터 테이블 분석 ____9.7.3.1 VBAR_EL1을 기준으로 익셉션 벡터 테이블 분석 ____9.7.3.2 VBAR_EL2 기준 익셉션 벡터 테이블 분석하기 __9.7.4 익셉션 핸들러 코드 분석 __9.7.5 VBAR_EL1, VBAR_EL2 기준으로 익셉션 핸들러는 어디에 존재할까? 9.8 익셉션과 익셉션 모델 __9.8.1 EL0에서 익셉션 유발 __9.8.2 EL1에서 익셉션 유발 9.9 Illegal Return Event(허용되지 않는 익셉션 레벨 복귀) __9.9.1 Illegal Return Event란? __9.9.2 Illegal Return Event의 후속 처리 9.10 정리 ▣ 10장: GIC 10.1 인터럽트 컨트롤러 소개 __10.1.1 인터럽트 컨트롤러가 필요한 이유 __10.1.2 인터럽트 컨트롤러의 기본 구조 10.2 GIC 소개 __10.2.1 GIC는 왜 배워야 할까? __10.2.2 GIC의 기본 기능 __10.2.3 GIC 버전과 주요 기능 10.3 GIC의 기본 구조 __10.3.1 인터럽트 소스와 타입 ____10.3.1.1 SPI(Shared Peripheral Interrupt) ____10.3.1.2 PPI(Private Peripheral Interrupt) ____10.3.1.3 SGI 인터럽트 ____10.3.1.4 GIC 인터럽트 종류와 인터럽트 아이디 ____10.3.1.5 인터럽트 아이디를 읽어 제어하는 코드 리뷰 __10.3.2 인터럽트 상태 머신 ____10.3.2.1 레벨 센서티브 타입 인터럽트의 상태 머신 ____10.3.2.2 에지 트리거 타입 인터럽트의 상태 머신 10.4 GIC의 프로그래머 모델 __10.4.1 디스트리뷰터(GICD_*) 시스템 레지스터 ____10.4.1.1 GICD_IROUTER〈n〉 레지스터 ____10.4.1.2 GICD_IPRIORITYR〈n〉 레지스터 ____10.4.1.3 GICD_ICFGR〈n〉 레지스터 ____10.4.1.4 GICD_IGROUPR〈n〉 레지스터 ____10.4.1.5 GICD_IGRPMODR〈n〉 레지스터 __10.4.2 리디스트리뷰터 - Redistributors(GICR_*) ____10.4.2.1 GICR_ISENABLER0 레지스터 ____10.4.2.2 GICR_ICFGR0 레지스터 ____10.4.2.3 GICR_IPRIORITYR〈n〉 레지스터 ____10.4.2.4 GICR_IGROUPR0 레지스터 ____10.4.2.5 GICR_IGRPMODR0 레지스터 __10.4.3 CPU 인터페이스(ICC_*_ELn) ____10.4.3.1 ICC_IAR1_EL1 레지스터 ____10.4.3.2 ICC_EOIR1_EL1 레지스터 ____10.4.3.3 ICC_PMR_EL1 레지스터 ____10.4.3.4 ICC_RPR_EL1 레지스터 ____10.4.3.5 ICC_BPR0_EL1 레지스터 ____10.4.3.6 ICC_CTLR_EL1 레지스터 ____10.4.3.7 ICC_SRE_EL1 레지스터 ____10.4.3.8 ICC_IGRPEN1_EL1 레지스터 10.5 인터럽트 그룹 __10.5.1 인터럽트 그룹이 생겨난 이유 __10.5.2 인터럽트 그룹이란? 10.6 GIC 레지스터 설정 __10.6.1 전반적인 설정(GICD_CTRL) __10.6.2 PE에서 설정하는 GIC 시스템 레지스터 ____10.6.2.1 리디스트리뷰터 설정 ____10.6.2.2 CPU 인터페이스 설정 ____10.6.2.3 익셉션 벡터 베이스 주소와 SCR_EL3, HCR_EL2 설정 __10.6.3 SPI, PPI, SGI 설정 ____10.6.3.1 기본 속성 설정 ____10.6.3.2 SPI를 특정 CPU 코어에 타깃팅: Affinity 설정 __10.6.4 주요 기능 설정 및 동작 원리 ____10.6.4.1 시큐어 인터럽트 라우팅 ____10.6.4.2 러닝 우선순위와 인터럽트 동작 10.7 GIC 인터럽트 핸들러에서 인터럽트 처리하기 __10.7.1 Arm 코어의 익셉션 핸들러 루틴 __10.7.2 GIC 인터럽트 핸들러 루틴 __10.7.3 GIC 인터럽트 핸들러 코드 분석 10.8 정리 ▣ 11장: AAPCS(함수 호출 규약) 11.1 AAPCS 소개 __11.1.1 함수 호출과 관련된 진실과 오해 __11.1.2 Arm 스펙 문서에서의 AAPCS 11.2 소프트웨어 개발자는 왜 AAPCS를 알아야 할까? __11.2.1 프로그램의 근본 동작 원리 파악 __11.2.2 안정적이고 최적화된 코드 작성 __11.2.3 실전 프로젝트에서의 디버깅을 위한 기초 체력 증진 11.3 AAPCS를 배우는 방법 __11.3.1 AAPCS를 배우기 어려운 이유 __11.3.2 AAPCS를 효과적으로 배우는 방법 11.4 AAPCS를 배우기 위해 알아야 하는 지식 __11.4.1 스택 자료구조란? __11.4.2 프로세스의 스택 공간이란? __11.4.3 스택 포인터와 스택 프레임 __11.4.4 AAPCS와 관련된 레지스터 11.5 정리 ▣ 12장: Armv7 - AAPCS 12.1 Armv7 아키텍처에서의 AAPCS 관련 레지스터 __12.1.1 SP와 LR 레지스터란? __12.1.2 함수를 호출하기 위한 설계 12.2 서브루틴(함수)으로 분기될 때 실행되는 어셈블리 명령어 __12.2.1 스택과 관련된 명령어 ____12.2.1.1 PUSH 명령어 ____12.2.1.2 SUB 명령어 ____12.2.1.3 POP 명령어 __12.2.2 분기 명령어 12.3 AAPCS와 관련된 레지스터와 어셈블리 명령어 분석 __12.3.1 SP 레지스터의 세부 동작 __12.3.2 LR(R14) 링크 레지스터와 어셈블리 명령어 분석 __12.3.3 함수를 호출할 때 쓰이는 R0 ~ R3 레지스터와 명령어 분석 12.4 AAPCS와 C 코드 최적화 __12.4.1 함수 인자의 개수는 4개 이하로 제한 __12.4.2 함수 반환형은 워드 단위로 지정 __12.4.3 매우 자주 호출되는 함수는 inline 키워드로 선언 12.5 정리 ▣ 13장: Armv8 - AAPCS 13.1 Armv8 아키텍처의 AAPCS 관련 레지스터 __13.1.1 SP_ELn과 X30 레지스터란? __13.1.2 함수를 호출하기 위한 설계 13.2 서브루틴(함수)으로 분기될 때 실행되는 어셈블리 명령어 __13.2.1 스택과 관련된 명령어 ____13.2.1.1 STP 명령어 ____13.2.1.2 SUB 명령어 ____13.2.1.3 LDP 명령어 __13.2.2 분기와 복귀 명령어 ____13.2.2.1 BL 명령어 ____13.2.2.2 RET 명령어 13.3 AAPCS와 관련된 레지스터와 어셈블리 명령어 분석 __13.3.1 스택 포인터 레지스터의 세부 동작 __13.3.2 X30 링크 레지스터와 어셈블리 명령어 분석 __13.3.3 함수를 호출할 때 쓰이는 X0 ~ X7 레지스터와 명령어 분석 13.4 AAPCS와 C 코드 최적화 __13.4.1 함수 인자의 개수는 8개 이하로 제한 __13.4.2 매우 자주 호출되는 함수는 inline 키워드로 선언 13.5 정리 ▣ 14장: 트러스트존 14.1 트러스트존이란? __14.1.1 트러스트존이 도입된 이유 14.2 트러스트존의 주요 개념 __14.2.1 논시큐어 월드와 시큐어 월드란? __14.2.2 시큐어 모니터 콜 14.3 Armv7 아키텍처의 트러스트존 __14.3.1 시큐어 월드로 실행 흐름이 변경되는 과정 __14.3.2 시큐어 모드와 익셉션 벡터 테이블 __14.3.3 시큐어 상태와 SCR 레지스터 __14.3.4 시큐어 월드의 익셉션 핸들러 구현 __14.3.5 모니터 모드의 익셉션 핸들러 리뷰 14.4 Armv8 아키텍처의 트러스트존 __14.4.1 익셉션 레벨과 시큐어 모드와의 관계 __14.4.2 시큐어 상태와 SCR_EL3 레지스터 __14.4.3 SCR_EL3 레지스터에 접근하는 명령어 __14.4.4 트러스트존에서 구현된 익셉션 핸들러 14.5 트러스트존과 관련된 하드웨어 기능 __14.5.1 AWPROT, ARPROT 시그널 __14.5.2 트러스트존의 5가지 하드웨어 기능 14.6 트러스트존의 실제 구현 방식 __14.6.1 시큐어 월드에서 트러스티드 OS는 어떻게 구동할까? __14.6.2 시큐어 RTOS 구현 사례: QSEE 14.7 Arm 트러스티드 펌웨어 EL3 모니터 코드 리뷰 __14.7.1 Arm 트러스티드 펌웨어란? __14.7.2 EL3 모니터 익셉션 핸들러 코드 분석 ____14.7.2.1 EL3 모니터 익셉션 핸들러 코드 ____14.7.2.2 익셉션 종류별 익셉션 핸들러 코드 분석 ____14.7.2.3 익셉션 핸들러 코드 분석 14.8 정리 ▣ 15장: 가상화(Virtualization) 15.1 하이퍼바이저 소개 __15.1.1 하이퍼바이저란? __15.1.2 하이퍼바이저 타입 __15.1.3 하이퍼바이저를 구성하는 요소 __15.1.4 하이퍼바이저는 왜 알아야 할까? 15.2 가상화 관련 명령어 __15.2.1 HVC 명령어 __15.2.2 WFE, WFI 명령어 15.3 가상화 관련 레지스터 __15.3.1 HCR_EL2 레지스터 __15.3.2 HCR_EL2 레지스터에 접근하는 명령어 __15.3.3 HCR_EL2 레지스터에 접근하는 어셈블리 코드 분석 15.4 가상화와 익셉션 벡터 테이블 __15.4.1 익셉션 벡터 테이블 확인하기 __15.4.2 가상화 관점의 익셉션 벡터 테이블 분석 15.5 XEN 하이퍼바이저 코드 리뷰 __15.5.1 XEN 하이퍼바이저 소개 __15.5.2 EL2 익셉션 핸들러 코드 분석 ____15.5.2.1 익셉션 핸들러 코드 소개 ____15.5.2.2 익셉션 핸들러 코드 분석 __15.5.3 게스트 Exit를 처리하는 코드 분석 15.6 정리 ▣ 16장: Armv9 - CCA 16.1 CCA 소개 __16.1.1 CCA란? __16.1.2 CCA가 도입된 이유 __16.1.3 CCA를 구성하는 요소 __16.1.4 CCA와 관련된 오픈소스 프로젝트 16.2 RME __16.2.1 Realm 상태란? __16.2.2 Realm 월드의 소프트웨어 스택 __16.2.3 RMM ____16.2.3.1 RMM의 주요 기능 ____16.2.3.2 RMM에 접근하는 두 가지 채널 16.3 GPT와 주소 접근 권한 제어 __16.3.1 GPT(Granule Protection Table)란? __16.3.2 GPC(Granule Protection Check)의 동작 원리 16.4 RME 관련 시스템 레지스터 __16.4.1 SCR_EL3와 시큐어 상태 __16.4.2 GPTBR_EL3 레지스터 __16.4.3 GPCCR_EL3 레지스터 16.5 정리 ▣ 17장: 메모리 모델 17.1 메모리 모델 소개 __17.1.1 노멀 메모리 타입이란? __17.1.2 디바이스 메모리란? __17.1.3 메모리 맵과 메모리 모델 17.2 메모리 리오더링과 Weakly Ordered 속성 __17.2.1 메모리 리오더링 소개 __17.2.2 어드레스 의존성이란? __17.2.3 메모리 리오더링 예시 17.3 메모리 배리어 __17.3.1 Data Memory Barrier(DMB) __17.3.2 Data Synchronization Barrier(DSB) __17.3.3 Instruction Synchronization Barrier(ISB) 17.4 Shareability 도메인과 배리어 명령어 옵션 __17.4.1 멀티 코어 시스템에서 데이터 동기화 __17.4.2 Qualifier 및 Shareable 메모리 속성 __17.4.3 배리어 명령어 옵션 __17.4.4 배리어 명령어에 Qualifier를 적용하는 방법 17.5 배리어 명령어 사용 케이스 스터디 __17.5.1 리눅스 커널: 스핀락 해제 시 배리어 사용 __17.5.2 시스템 레지스터 설정 시 ISB 배리어 설정 17.6 정리 ▣ 18장: 캐시 18.1 캐시 소개 __18.1.1 캐시란? __18.1.2 메모리 아키텍처에서 캐시란? __18.1.3 L1 캐시와 L2 캐시란? __18.1.4 캐시 알고리즘의 배경 ____18.1.4.1 공간 지역성 ____18.1.4.2 시간 지역성 ____18.1.4.3 알고리즘 지역성 18.2 캐시의 기본 동작 원리 __18.2.1 캐시의 검색 방법 ____18.2.1.1 캐시에 접근하기 위해 주소를 분류하는 방식 ____18.2.1.2 캐시의 구성 __18.2.2 캐시 룩업의 동작 원리 ____18.2.2.1 캐시 히트 동작 ____18.2.2.2 캐시 미스 동작 __18.2.3 Way와 Set의 개념 18.3 멀티 레벨 캐시 __18.3.1 캐시의 성능 지표 __18.3.2 멀티 캐시를 구성하는 원리 __18.3.3 멀티 캐시 정책 18.4 Arm Cortex 프로세서의 캐시 구조 __18.4.1 Direct-Mapped 캐시 구조 __18.4.2 Set-Associative 캐시 구조 __18.4.3 Arm 프로세서별 캐시 스펙 18.5 캐시 제어 레지스터 __18.5.1 CTR_EL0 레지스터 __18.5.2 CLIDR_EL1 레지스터 __18.5.3 CCSIDR_EL1 레지스터 18.6 캐시 제어 어셈블리 명령어 __18.6.1 캐시 관련 용어 알아보기 __18.6.2 캐시 관련 어셈블리 명령어 18.7 정리 ▣ 19장: 메모리 매니지먼트 19.1 메모리 매니지먼트 소개 __19.1.1 메모리 매니지먼트란? __19.1.2 MMU란? __19.1.3 가상 주소와 물리 주소의 개념 __19.1.4 운영체제 관점에서 메모리 매니지먼트란? 19.2 MMU의 세부 동작 __19.2.1 MMU를 구성하는 주요 기능 __19.2.2 MMU에서 주소를 변환하는 과정 19.3 익셉션 레벨별 가상 주소 영역 __19.3.1 가상화 시스템에서 가상 주소 공간 __19.3.2 가상 주소 공간과 관련된 변환 테이블 베이스 주소 __19.3.3 가상 주소 영역의 사이즈는 어떻게 설정될까? 19.4 메모리 컨트롤 시스템 레지스터 __19.4.1 TTBR0_EL1, Translation Table Base Register 0(EL1) __19.4.2 TCR_EL1 레지스터 __19.4.3 SCTLR_EL1 레지스터 __19.4.4 FAR_EL1, Fault Address Register(EL1) 19.5 메모리 속성과 MMU를 설정하는 예제 코드 분석 __19.5.1 메모리 속성 정보를 설정하는 루틴의 예 __19.5.2 MMU를 설정하는 명령어 루틴 소개 - XEN 하이퍼바이저 19.6 정리 ▣ 부록A: 어셈블리 명령어 A.1 Armv7 어셈블리 명령어 __A.1.1 이동, 산술, 비트 연산 명령어 __A.1.2 비교 및 분기 명령어 __A.1.3 로드 및 스토어 명령어 __A.1.4 곱셈 명령어 __A.1.5 스택 제어 명령어 __A.1.6 시스템 명령어 __A.1.7 배리어 명령어 A.2 Armv8 - A64(Aarch64) 명령어 __A.2.1 이동, 산술, 비트 연산 명령어 __A.2.2 비교 및 분기 명령어 __A.2.3 로드 및 스토어 명령어 __A.2.4 시스템 명령어 __A.2.5 배리어 명령어 ▣ 부록B: 레지스터 B.1 Armv7 레지스터 __B.1.1 범용 레지스터 __B.1.2 시스템 레지스터 B.2 Armv8 레지스터 __B.2.1 범용 레지스터 __B.2.2 스페셜 레지스터 __B.2.3 시스템 레지스터 ▣ 부록C: 인라인 어셈블리 C.1 인라인 어셈블리 소개 C.2 인라인 어셈블리 명령어 형식 1 C.3 인라인 어셈블리 명령어 형식 2 ▣ 부록D: Arm 아키텍처 관련 실전 프로젝트 케이스 스터디 D.1 스택 오염 __D.1.1 스택 오염은 왜 발생할까? __D.1.2 스택 오염이 발생한 실제 예시 __D.1.3 스택 오염 문제는 어떻게 디버깅할까? D.2 스택 오버플로란? __D.2.1 스택 오버플로 증상과 그 원인 __D.2.2 스택 오버플로가 발생하면 시스템은 어떻게 오동작할까? __D.2.3 스택 오버플로는 어떻게 방지할까? ____D.2.3.1 코드를 Arm 아키텍처 관점으로 분석 ____D.2.3.2 컴파일러에서 스택 오버플로 검출 기능 활성화 ____D.2.3.3 배열 대신 동적 메모리를 할당하는 코드를 사용 ____D.2.3.4 스택 크기를 증가 ____D.2.3.5 디버깅 코드 활용