HOME / CATALOG / 임베디드 & 모바일
임베디드 & 모바일

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

Armv8-A와 Armv7-A로 배우는 시스템 반도체와 전기자동차 시스템 개발의 핵심
지은이 김동현
도서 정보
출간일
2023년 6월 22일
쪽수
744쪽
판형
188*240*30mm
ISBN
9791158394349
시리즈
임베디드 & 모바일 시리즈_042
정가
48,000원
난이도
ERR 오탈자 등록
도서 소개
저자 소개
목차
정오표

도서 소개

친절한 선배 개발자가 Arm 아키텍처에 대해 꼼꼼하게 알려주듯, Arm 아키텍처(Armv8-A, Armv7-A) 아키텍처를 쉽고 친절하게 설명합니다!

이 책에서는 Arm 아키텍처를 구성하는 주요 기능 중에서 실전 프로젝트에 바로 적용될 만한 내용을 선별해 자세히 설명합니다. 또한 리눅스 커널이나 하이퍼바이저, 트러스티드 펌웨어 같은 시스템 소프트웨어에서 Arm 아키텍처를 구성하는 주요 기능들이 어떤 방식으로 활용되는지 상세하게 다룹니다.

각 장에서 설명하는 내용은 시스템 반도체나 전기자동차 같은 시스템 소프트웨어 개발에 그대로 적용될 수 있습니다.

★ 이 책에서 다루는 내용 ★

  • Arm 아키텍처의 기본인 어셈블리 명령어, 레지스터, AAPCS
  • Armv8-A에서 정의된 익셉션 레벨, Armv7-A의 동작 모드
  • 익셉션의 동작 원리 및 익셉션 핸들러 코드 분석을 통한 원리 설명
  • 하이퍼바이저의 근간인 가상화와 시큐리티 기술의 핵심인 트러스트존
  • 메모리 아키텍처와 캐시, 메모리 모델과 배리어의 동작 원리

 

도서 상세 이미지

저자 소개

김동현 (austindh.kim@gmail.com)

《디버깅을 통해 배우는 리눅스 커널의 구조와 원리》의 저자이며, LG전자에서 12년째 Arm 프로세서 기반 리눅스 시스템 엔지니어로 일하고 있다. 주로 Arm 프로세서에서 설계된 신규 칩셋(SoC: Application Processor) 기반의 프로젝트에서 시스템(타깃 보드)을 브링업하거나 다양한 트러블슈팅으로 크래시 이슈를 해결하는 과제에 참여했다. Arm 아키텍처에 관심이 많고 특히 Arm 아키텍처를 구성하는 기능들이 리눅스 커널, 부트로더 혹은 하이퍼바이저에 어떤 방식으로 구현됐는지 디버깅하는 것을 즐긴다. 로우 레벨 소프트웨어의 다양한 문제를 해결하는 디버깅 방법에 관심이 많고, 실무 지식을 다른 동료 개발자와 공유하면서 기쁨을 느낀다.

목차

  • ▣ 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 디버깅 코드 활용

정오표

  • 51쪽, 본문 밑에서 2번째 줄

    익셉션 레벨마다

    ==>

    익셉션 레벨(EL0 제외)마다

  • 51쪽, 페이지 하단 불릿 목록의 첫 번째 항목 삭제

    • EL0: SPSR_EL0

    ==>

    (삭제)

  • 96쪽, 표 4.9 제목 변경

    표 4.9 CMP 명령어가 실행된 후 업데이트되는 CPSR 조건 플래그

    ==>

    표 4.9 CMP 명령어가 실행된 후 업데이트되는 CPSR 조건 플래그(볼드체로 표기)

  • 96쪽, 표 4.9 내용을 다음과 같이 변경(밑줄 추가)

    조건 결과
    R2 == 0 CPSR.{N,Z,C,V}
    R2 == 0x12 CPSR.{N,Z,C,V}
    R2 == 0x13 CPSR.{N,Z,C,V}
    R2 == 0x14 CPSR.{N,Z,C,V}
  • 105쪽, 본문 첫 번째 줄

    TBZ 명령어는 레지스터 값의

    ==>

    TBNZ 명령어는 레지스터 값의

  • 128쪽, '정보'란의 2번째 줄

    R13(SP) 레지스터는 뱅크드되어 있어 R14_<mode>로 표기됩니다.

    ==>

    R13(SP) 레지스터는 뱅크드되어 있어 R13_<mode>로 표기됩니다.

  • 147쪽, 표 6.4의 마지막 행, 2열

    0b1001

    ==>

    0b1101

  • 448쪽, 그림 13.9를 다음 그림으로 교체

    그림 13.9

  • 449쪽, 그림 13.11을 다음 그림으로 교체

    그림 13.11

  • 449쪽, 그림 13.12를 다음 그림으로 교체

    그림 13.12

  • 450쪽, 그림 13.13을 다음 그림으로 교체

    그림 13.13

  • 449쪽, 페이지 상단 코드를 다음 코드로 교체

    01 <__fork>:
    02 STP X29, X30, [SP, #-0x20]!
    03 STP X27, X28, [SP, #+0x10]
    ...
    04 LDP X27, X28, [SP, #+0x10]
    05 LDP X29, X30, [SP] #+0x20
  • 449쪽, 두 번째 코드

    04 LDP X28, X27, [SP, #+0x10]

    ==>

    04 LDP X27, X28, [SP, #+0x10]
  • 450쪽, 본문 5번째 줄

    이어서 0x1FFF0 주소에 있는 X28의 값을 0x28, 0x1FFF8 주소에 있는 X27의 값을 0x27에 로딩합니다. 이 동작은 그림의 화살표로 표기된 부분에 해당됩니다. 참고로 0x1FFF0과 0x1FFF8 주소에 저장된 데이터는 다음과 같이 __fork 함수의 03번째 줄에서 이미 푸시된 X28, X27 레지스터의 값입니다.

    ==>

    이어서 0x1FFF0 주소에 있는 X27의 값을 0x27, 0x1FFF8 주소에 있는 X28의 값을 0x28에 로딩합니다. 이 동작은 그림의 화살표로 표기된 부분에 해당됩니다. 참고로 0x1FFF0과 0x1FFF8 주소에 저장된 데이터는 다음과 같이 __fork 함수의 03번째 줄에서 이미 푸시된 X27, X28 레지스터의 값입니다.

  • 450쪽, 페이지 중간 코드의 3번째 줄

    03 STP X28, X27, [SP, #+0x10]

    ==>

    03 STP X27, X28, [SP, #+0x10]
  • 464쪽, 본문 3번째 줄

    아래의 21 ~ 24번째 줄과 같이 프로세스의 스택 주소(sp+40, sp+36)에 저장됩니다.

    21 52800120 mov w0, #0x9 // #9
    22 b9002be0 str w0, [sp, #40]
    23 52800140 mov w0, #0xa // #10
    24 b90027e0 str w0, [sp, #36]

    ==>

    아래의 25 ~ 28번째 줄과 같이 프로세스의 스택 주소(sp+8, sp)에 저장됩니다. 즉, 9번째 인자인 9는 sp 스택 주소, 10번째 인자인 10은 sp+8 스택 주소에 저장됩니다.

    25 b94027e0 ldr w0, [sp, #36]
    26 b9000be0 str w0, [sp, #8]
    27 b9402be0 ldr w0, [sp, #40]
    28 b90003e0 str w0, [sp]
  • 495쪽, 표 14.3의 마지막 행, 4열

    논시큐어 애플리케이션(EL0)

    ==>

    논시큐어 커널(EL1)

  • 505쪽, 본문 6번째 줄

    만약 EL2에서 Synchronous 익셉션이 유발되면

    ==>

    만약 EL3에서 Synchronous 익셉션이 유발되면

  • 505쪽, 본문 6번째 줄

    프로그램 카운터가 0x26a800 주소로 분기됩니다.

    ==>

    프로그램 카운터가 0xe046200 주소로 분기됩니다.

  • 505쪽, 본문 9번째 줄

    프로그램 카운터가 0x26aa80 주소로 분기됩니다.

    ==>

    프로그램 카운터가 0xe046280 주소로 분기됩니다.

  • 511쪽, 본문 6번째 줄

    EL1에서 IRQ 인터럽트 익셉션이 발생해도

    ==>

    EL1에서 FIQ 인터럽트 익셉션이 발생해도

  • 560쪽, 12번째 줄(소제목)

    SCR.EL3.NSE와 SCR.EL3.NS 비트 조합으로 본 시큐리티 상태

    ==>

    SCR_EL3.NSE와 SCR_EL3.NS 비트 조합으로 본 시큐리티 상태

  • 625쪽, 본문 10번째 줄

    십진수로는 15(0b1111)입니다. 21532768인데,

    ==>

    십진수로는 4(0b1111)입니다. 2416인데,

WHERE TO BUY · 정가 48,000원
WHERE TO BUY · 정가 48,000원