시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리
친절한 선배 개발자가 Arm 아키텍처에 대해 꼼꼼하게 알려주듯, Arm 아키텍처(Armv8-A, Armv7-A) 아키텍처를 쉽고 친절하게 설명합니다! 이 책에서는 Arm 아키텍처를 구성하는 주요 기능 중에서 실전 프로젝트에 바로 적용될 만한 내용을 선별해 자세히 설명합니다. 또한 리눅스 커널이나 하이퍼바이저, 트러스티드 펌웨어 같은 시스템 소프트웨어에서 Arm 아키텍처를 구성하는 주요 기능들이 어떤 방식으로 활용되는지 상세하게 다룹니다. 각 장에서 설명하는 내용은 시스템 반도체나 전기자동차 같은 시스템 소프트웨어 개발에 그대로 적용될 수 있습니다.
LG전자에서 11년째 임베디드 리눅스 BSP 엔지니어로 일하고 있다. 주로 리눅스 커널 드라이버를 안정화(Kernel Stability Troubleshooting)하거나 보드를 브링업하는 과제에 참여했다. 로우 레이어 소프트웨어(부트로더, 리눅스 커널 드라이버)의 다양한 문제를 해결할 수 있는 디버깅 방법에 관심이 많으며 실무 지식을 블로그를 통해 다른 개발자와 공유하는 것을 즐긴다.
▣ 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 명령어____4.4.3.2 BL 명령어____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 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장: GIC10.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 레지스터____10.4.1.2 GICD_IPRIORITYR 레지스터____10.4.1.3 GICD_ICFGR 레지스터____10.4.1.4 GICD_IGROUPR 레지스터____10.4.1.5 GICD_IGRPMODR 레지스터__10.4.2 리디스트리뷰터 - Redistributors(GICR_*)____10.4.2.1 GICR_ISENABLER0 레지스터____10.4.2.2 GICR_ICFGR0 레지스터____10.4.2.3 GICR_IPRIORITYR 레지스터____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 스펙 문서에서의 AAPCS11.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 - AAPCS12.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 - AAPCS13.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 구현 사례: QSEE14.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 - CCA16.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 인라인 어셈블리 명령어 형식 1C.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 디버깅 코드 활용