티스토리 뷰
하이퍼바이저
- 하드웨어에서 시스템의 운영 체제와 리소스를 분리해 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)
.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)이 실행 대기 중인지 여부를 나타내는 함수나 매크로
'개발 > 코드로 알아보는 ARM 리눅스 커널 TIL' 카테고리의 다른 글
20240907 4.2.2 메모리 맵 (p249) & 4.3 존 (p.254) (0) | 2024.11.16 |
---|---|
20240831 - sparse init (p269) (0) | 2024.11.16 |
20240817 페이징과 매핑 (p200) & memblock(p221) (0) | 2024.11.16 |
20240627 - ARMv8아키텍처 (p34) (0) | 2024.11.09 |
코드로 알아보는 ARM 리눅스 커널 TIL 카테고리 추가 (0) | 2024.11.09 |
- Total
- Today
- Yesterday
- Visual Studio
- vrpit
- C++
- cockroach db
- 잘못된 빨간줄
- chrome-extension
- SuffixArray
- 에러 위치 찾기
- 우리는 vr핏이라고 부릅니다
- 면접
- Quest2
- ad skip
- shared_from_this
- set value
- Golang
- mysql
- 영상 픽셀화 하기
- red underline
- print shared_ptr class member variable
- Obstacle Avoidance
- Reciprocal n-body Collision Avoidance
- it's called a vrpit
- 코어 남기기
- vr핏
- hole-punching
- 클래스 맴버 변수 출력하기
- boost
- 카카오
- 봄날에 스케치
- RVO
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |