티스토리 뷰

하이퍼바이저

  • 하드웨어에서 시스템의 운영 체제와 리소스를 분리해 VM에 할당하여 가상 머신을 생성하고 구동하는 소프트웨어

EL2, EL3 는 하드웨어에서 지원하며 각 Cpu 를 사용하는 곳에서 옵션으로 키고 끌수있음

프로세서 상태 레지스터, 범용 레지스터, 특수목적 레지스터, ABI 레지스터가 따로 존재

SCR_EL3 (Secure configuration register) 어떤 익셉션이 레벨 3으로 갈지 정의 (16p)


adr & adrl assembly

  • adr -> pc 기준으로 +- 1MB 범위 내, adrl 더 넓게 (4kb 단위로 +-4gb adrp + 4kb offset)

.align

  • <바운더리>는 정렬할 바이트 단위를 나타냅니다. 예를 들어, .align 12는 2^12 바이트(즉, 4096 바이트)의 배수로 정렬합니다.

https://www.bhral.com/post/arm-v8-linux-kernel-head-s-4

DMB 란 LDR, STR 등 memory access instruction의 reordering을 방지하는 것이다.


페이지 테이블 생성

  • idmap방법 virtual=physical 방법으로 MMU가 사용되지 않는 boot 초반 같은 경우에 사용한다.
  • MMU 가 켜졌을때 다음에 실행할 주소는 물리 주소이기때문에, MMU 가 꺼진상태일때 미리 세팅해주는 용도
  • swapper 페이지 테이블 - 커널 이미지 영역을 매핑
  • idmap, swapper 테이블 모두 0 으로 초기화

idmap_text_start

  • 보통 커널의 텍스트(코드) 영역이 시작되는 주소를 의미합니다.

create_pgd_entry

  • 페이지 전역 디렉토리(PGD) 엔트리를 설정하여 가상 주소의 최상위 비트를 매핑합니다.

create_table_entry

  • 페이지 테이블 엔트리를 설정하여 가상 주소의 중간 비트를 매핑합니다.

create_block_map

  • 큰 연속 메모리 블록을 매핑하는 데 사용되며, 여러 페이지 테이블 엔트리를 설정합니다.

cpu 초기화
. Translation Look-aside Buffers (TLB)

  • TLB는 하드웨어 캐시로, 매우 빠른 연관 메모리 (associative memory)로 구성된다.

dsb nsh - 메모리 연산 대기

 

MOV R0, #0 // 레지스터 R0를 0으로 설정
STR R0, [R1] // 레지스터 R0의 값을 메모리 주소 R1에 저장
DSB NSH // 데이터 동기화 배리어(Non-Shareable)
LDR R2, [R1] // 메모리 주소 R1의 값을 레지스터 R2에 로드

MOV R0, #0: 레지스터 R0에 0을 로드합니다.
STR R0, [R1]: 레지스터 R0의 값을 메모리 주소 R1에 저장합니다.
DSB NSH: 이 명령어는 이전의 메모리 저장 명령어(STR)가 완료될 때까지 기다립니다.
LDR R2, [R1]: 메모리 주소 R1에서 값을 읽어 레지스터 R2에 로드합니다. 이 명령어는 DSB가 완료된 후에 실행됩니다.

 

msr -> special register = register / mrs -> register = special register

CPACR_EL1 (Architectural Feature Access Control Register, EL1)

 - ARMv8-A 아키텍처에서 사용되는 시스템 레지스터 중 하나로, EL1(예: 커널 모드)에서 접근할 수 있는 코프로세서(Coprocessor) 및 SIMD/FP(단일 명령 다중 데이터/부동 소수점) 기능을 제어합니다. 이 레지스터를 사용하여 특정 기능에 대한 접근 권한을 설정하고 관리할 수 있습니다.

 

CPACR_EL1의 구조
CPACR_EL1 레지스터는 32비트 또는 64비트 크기로 구성되며, 각 비트 필드는 특정 기능에 대한 접근 권한을 설정하는 데 사용됩니다. 주요 비트 필드는 다음과 같습니다:

Bits [31:20], RES0: 예약됨(0으로 설정)
Bits [19:18], FPEN: SIMD/FP(NEON) 기능 접근 제어
00: 모든 접근을 트랩함.
01: EL0의 접근을 트랩함.
10: 모든 접근을 허용함.
11: 모든 접근을 허용함.

 

Memory Attribute Indirection Register(MAIR)은 ARMv8-A 아키텍처에서 메모리 속성을 정의하는 중요한 시스템 레지스터

w: 32비트 레지스터, x : 64비크 레지스터

 

MOV     X5, #0x123456789ABCDEF0  // X5 레지스터에 64비트 값 설정
MOV     W5, #0x98765432          // W5 레지스터에 32비트 값 설정 (X5의 하위 32비트를 덮어씀)
// 이제 X5 레지스터는 0x1234567898765432

 

bic : bit clear / orr : or with registher

TCR 레지스터는 ARM 프로세서에서 사용되는 시스템 레지스터 중 하나로, Translation Control Register의 약어입니다. TCR 레지스터는 가상 메모리 시스템에서 페이지 테이블과 관련된 설정을 제어하는 데 사용됩니다.

.section .text, "ax"
위 예제는 코드 섹션을 정의하며, "ax" 플래그는 섹션의 속성을 나타냅니다:

 

a: Allocatable - 섹션이 실행 가능한 코드 또는 데이터를 포함할 수 있음.
x: Executable - 섹션에 있는 코드가 실행 가능하다는 것을 나타냄.

 

 

MMFR 레지스터는 ARM 아키텍처에서 사용되는 시스템 레지스터 중 하나입니다. MMFR은 Memory Model Feature Register의 약어로, 메모리 시스템의 특정 기능 및 속성을 설명하는 데 사용됩니다. 이 레지스터는 시스템이 지원하는 메모리 시스템의 세부 사항을 알려줍니다.

 

> 4kb, 16kb, 64kb, custom

 

UBFX destination_register, source_register, starting_bit, length (extract bit field)

TTBR0 -> idmap, TTBR1 -> swapper / 유저레벨, 커널레벨 테이블 변환 베이스 주소 설정

ISB 명령어는 ARM 아키텍처에서 사용되는 "Instruction Synchronization Barrier"의 약자

ic iallu 명령 IC (Instruction Cache) IALLU (Invalidate All Unifying)

https://www.google.com/url?sa=i&url=https%3A%2F%2Fcommunity.nxp.com%2Fpwmxy87654%2Fattachments%2Fpwmxy87654%2Fimx-processors%2540tkb%2F5659%2F2%2FHow%2520to%2520boot%2520the%2520kernel.pdf&psig=AOvVaw2s8gq5VO0dFWA_XtZ019JF&ust=1719129542856000&source=images&cd=vfe&opi=89978449&ved=2ahUKEwi_2Ijf3u6GAxVAkVYBHfC8ADQQjhx6BAgAEBY

.set intiial_sp, init_thread_union + THREAD_START_SP -> define 처럼 컴파일타임에 바뀐다고 생각하면 됨


익셉션

 - FAR_EL1은 ARM 아키텍처에서 사용되는 레지스터로, 예외가 발생한 경우(예를 들어 데이터 접근 예외)에 발생한 주소(Fault Address Register, FAR)를 저장하는 레지스터입니다. 이 레지스터는 ARM64 아키텍처에서 사용되며, Exception Level 1 (EL1, 커널 모드)에서 예외가 발생했을 때 사용됩니다. ->하드웨어가 자동으로 저장

 

DAIF 비트 (Interrupt Masking) I -> IRQ
 - https://developer.arm.com/documentation/ddi0595/2021-06/AArch64-Registers/DAIF--Interrupt-Mask-Bits

 

아까 코드가 왜 이해가 안되나 했더니 x30 레지스터가 일반적으로 lr 로 쓰이는군요. x22, x23 등도 x0~29 저장할때 이미 저장했는데 왜 다시 사용하는건가 했더니, pc, pstate, syscall no 등을 저장하기 위해서 임시 레지스터로 사용하고 이후 exception 처리시에도 이때 설정했던 x23 값을 다시 사용하네요

 

IRQ
 - tsk :인터럽트가 발생하기 전 쓰레드의 정보
 - irq 가 선점되면 기존 irq 핸들링을 하다가 컨텍스트스위칭을 하는건가보다
 - thread_info 의 선점카운트가 0이어야 다른곳에서 선점이 가능하다. 크리티컬 섹션 보호나 락 뮤텍스, 인터럽트 처리기 보호등의 이유

 

el0_syncv
 - A supervisor call (SVC): 시스템 콜 발생시
 - da data abort

 

work_pending

 - 리눅스 커널에서 사용되는 개념으로, 커널 내에서 비동기적인 작업(Asynchronous Work)이 실행 대기 중인지 여부를 나타내는 함수나 매크로

댓글