ARM64 inline asm 포팅 가이드 (커널/Clang 포팅 관점)
ARM64(AArch64)에서 inline asm은 “문법이 어렵다”보다 컴파일러가 더 엄격하고 최적화가 더 공격적이라서 사고가 난다.특히 벤더 커널을 Clang으로 옮길 때는 constraint 선택 + clobber + barrier 3개가 대부분의 원인이다. 이 글에서는 ARM64에서…
ARM 아키텍처
ARM64(AArch64)에서 inline asm은 “문법이 어렵다”보다 컴파일러가 더 엄격하고 최적화가 더 공격적이라서 사고가 난다.특히 벤더 커널을 Clang으로 옮길 때는 constraint 선택 + clobber + barrier 3개가 대부분의 원인이다. 이 글에서는 ARM64에서…
이 글에서는 Linux 커널 기준으로 자주 사용하는 inline asm constraint를 정리한다. GCC + Clang 공통 기준으로, 특히 Clang에서 주의해야 할 포인트를 포함한다. 1. 기본 구조 asm volatile ( "asm template"…
이 글은 Ubuntu 환경에서 Clang / LLVM 툴체인을 이용해 Linux 커널을 실제로 빌드하는 방법을 단계별로 정리한다. Clang/LLVM 툴체인 설치는 아래 글을 먼저 확인한다. https://junorionblog.co.kr/linux-%ec%bb%a4%eb%84%90-clang-llvm-%ed%88%b4%ec%b2%b4%ec%9d%b8-%ec%a4%80%eb%b9%84%ed%95%98%ea%b8%b0/ Ubuntu 커널 빌드에 대한건 아래 글을…
ARMv8 아키텍처는 64비트 레지스터 아키텍처로, 고성능 및 저전력 임베디드 시스템에서 사용되는 주요 기술이다. 이 아키텍처에는 다양한 레지스터가 존재 하는데, 이 글에서는 이러한 레지스터에 대해 알아본다. General-Purpose Registers AArch64 는 모든…
AArch64 아키텍처는 64비트 ARM 아키텍처로, 다양한 용도로 사용되는 여러 레지스터를 제공한다. 이 레지스터들은 다양한 목적으로 사용되며, 프로세서 상태, 데이터, 벡터 연산 등 다양한 기능을 지원한다. 이 글에서는 AArch64 레지스터에 대해…
ARM 아키텍처에서는 코프로세서와 레지스터 간의 데이터 전송을 위한 MRC (Move to Coprocessor from ARM Register) 및 MCR (Move to ARM Register from Coprocessor) 명령어를 제공한다. 이 글에서는 MRC 와 MCR…
ARM 아키텍처에서는 소프트웨어 인터럽트를 수행하는 데 사용되는 SWI (Software Interrupt) 명령어를 제공한다. 소프트웨어 인터럽트는 주로 운영체제와의 상호작용에 사용된다. 이 글에서는 SWI 명령어에 대해 알아본다. Software interrupt instruction 소프트웨어 인터럽트 명령은…
ARM 아키텍처에서는 메모리에서 데이터를 읽어오고 새로운 데이터로 교체하는 데 사용되는 SWP (Single Data Swap) 명령어를 제공한다. 이 글에서는 SWP 명령어에 대해 알아본다. Swap instruction Syntax <SWP>{cond}{B} Rd,Rm,[Rn] {cond} : 조건…
ARM 아키텍처에서는 여러 개의 레지스터를 한 번에 메모리에 읽거나 메모리에 쓰는 데 사용되는 LDM (Load Multiple)과 STM (Store Multiple) 명령어를 제공한다. 이 글에서는 LDM 과 STM 명령어에 대해 알아본다. Block…
ARM 아키텍처에서는 메모리에서 데이터를 로드하거나 메모리에 데이터를 저장하는 데 사용되는 LDR (Load Register)와 STR (Store Register) 명령어가 있다. 이 글에서는 LDR 과 STR 명령어에 대해 알아본다. Single data transfer instructions…