시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리

$57.96
SKU
9791158394349
+ Wish
[Free shipping over $100]

Standard Shipping estimated by Fri 12/6 - Thu 12/12 (주문일로부 10-14 영업일)

Express Shipping estimated by Tue 12/3 - Thu 12/5 (주문일로부 7-9 영업일)

* 안내되는 배송 완료 예상일은 유통사/배송사의 상황에 따라 예고 없이 변동될 수 있습니다.
Publication Date 2023/06/22
Pages/Weight/Size 188*240*30mm
ISBN 9791158394349
Categories IT 모바일 > 컴퓨터 공학
Description
친절한 선배 개발자가 Arm 아키텍처에 대해 꼼꼼하게 알려주듯, Arm 아키텍처(Armv8-A, Armv7-A) 아키텍처를 쉽고 친절하게 설명합니다! 이 책에서는 Arm 아키텍처를 구성하는 주요 기능 중에서 실전 프로젝트에 바로 적용될 만한 내용을 선별해 자세히 설명합니다. 또한 리눅스 커널이나 하이퍼바이저, 트러스티드 펌웨어 같은 시스템 소프트웨어에서 Arm 아키텍처를 구성하는 주요 기능들이 어떤 방식으로 활용되는지 상세하게 다룹니다. 각 장에서 설명하는 내용은 시스템 반도체나 전기자동차 같은 시스템 소프트웨어 개발에 그대로 적용될 수 있습니다.
Contents
▣ 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장: 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 레지스터
____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 스펙 문서에서의 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 디버깅 코드 활용
Author
김동현
LG전자에서 11년째 임베디드 리눅스 BSP 엔지니어로 일하고 있다. 주로 리눅스 커널 드라이버를 안정화(Kernel Stability Troubleshooting)하거나 보드를 브링업하는 과제에 참여했다. 로우 레이어 소프트웨어(부트로더, 리눅스 커널 드라이버)의 다양한 문제를 해결할 수 있는 디버깅 방법에 관심이 많으며 실무 지식을 블로그를 통해 다른 개발자와 공유하는 것을 즐긴다.
LG전자에서 11년째 임베디드 리눅스 BSP 엔지니어로 일하고 있다. 주로 리눅스 커널 드라이버를 안정화(Kernel Stability Troubleshooting)하거나 보드를 브링업하는 과제에 참여했다. 로우 레이어 소프트웨어(부트로더, 리눅스 커널 드라이버)의 다양한 문제를 해결할 수 있는 디버깅 방법에 관심이 많으며 실무 지식을 블로그를 통해 다른 개발자와 공유하는 것을 즐긴다.