리눅스데브코스 [9주차 - 3(1)]<ARM 프로세서 코어와 리눅스 커널(2)>

심우열·2023년 5월 31일
0

1. ELF

1. ELF란?

  • Executable and Linkable Format
  • Standard binary format for object files
  • One unified format for
    -> Relocatable object files(.o)
    -> Executable object files(a.out)
    -> Shared object files(.so)

2. Linux의 경우

  • 각 Architecture에 대해 elf.h 파일을 가짐

ex

  • ARM: arch/arm/include/asm/elf.h
  • AARCH64: arch/arm64/include/asm/elf.h

2. Building Blocks

1. Building Blocks 종류

  • if/else statements
  • for loops
  • while loops
  • arrays
  • function calls
    -> APCS에서 따로 확인

2. while, do/while, for

  • Assembly code 는 반복문은 항상 do/while로 해석하여 실행함

3. SIMD

SIMD 연산이란?

  • Single Instruction Multiple Data

1. Arm NEON vector units

  • ARM에서 SIMD 연산을 지원하기 위한 NEON

NEON에서 SIMD 연산

  • V0에서 4개의 프리시젼에 저장
  • V0에서 4개의 프리시전 가져옴
  • V1에서 4개의 프리시전 가져와 ADD 연산

2. SVE

1. Scalable Vector Extension

  • VLA(Vector Length Agnostic)
    -> Vector Length(VL): 128에서 2048bits 까지 지원하는 하드웨어 구현
  • 동적으로 가능한 vector length로 사용될 수 있도록 지원
  • VLA는 새로운 ISA를 정의하거나 하지 않고, 하드웨어에서 알아서 지원

2. SVE는 Advanced SIMD의 확장이 아님

  • SVE는 새로운 instruction 을 가지는 별도 extension
  • 원래 HPC나 서버를 타겟으로 사용했는데, AI 가 인기를 끌면서 media/image processing에 많이 사용됨

3. SVE는 자동 벡터화에 대한 기존의 장벽을 해결

  • Software-managed speculative vectorization 으로 명시적으로 프로그래머가 병렬 연산용으로 만든 loop가 아니어도 자동으로 vector 화 가능

4. Dynamic Vector Length

1. Per-lane predication

  • predicate register를 이용하여 각 lane에 적용

2. Predicate-driven loop control and management

  • 부분 vector를 처리하여 scalar loop header를 없앰

3. Vector partitioning & software-managed speculation

  • First Faulting Load를 지원하는 register를 이용하여 여러 페이지에 걸친 벡터 연산 지원

4. APCS

1. APCS란?

  • ARM Procedure Call Standard

1. ARM architecture 에서 사용하는 procedure 호출 및 복귀 규칙

  • 서로 다른 컴파일러에서 생성된 object code들도 규칙을 지키면 함께 link 가능
  • APCS를 통해 high-level language 와 assembly 코드 간 procedure 호출 가능

2. APCS 정의

  • Use of registers
  • Use of stack
  • Format of stack-based data structure
  • Mechanism for argument passing

2. Procedure

1. Argument 와 Parameter, Caller 와 Callee

//func()는 Callee, int a 와 int b는 Parameters
void func(int a, int b){
}
int main(void){
	//여기서 func()는 Caller, 100과 200은 Arguments
	func(100,200)
}

2. Argument의 전달

  • By registers
  • By Stack
  • By Memory

1. Caller saver Procedure

2. Callee saver Procedure

3. ARM 32bit

  • 처음 4개의 argument R0~R3 4개의 레지스터로 전달
  • 나머지 parameter는 stack에 역순으로 push 되어 전달
  • 따라서 4개 이하의 parameter를 사용하는 것이 효율적

4. AArch 64

  • 처음 8개의 argument R0~R7 8개의 레지스터로 전달
  • 따라서 8개 이하의 parameter를 사용하는 것이 효율적

3. Return 값의 전달

  • 1word 이하: R0
  • 2~4word 의 긴 값: R0-R1, R0-R2, R0-R3
profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

0개의 댓글