Guillermo Austin Kim
Posts
998 posts[Arm프로세서] Armv7: Arm 동작 모드를 활용한 리눅스 커널의 구현 방식
Arm 스팩 문서를 보면 리눅스 커널에서 Arm 아키텍처를 이루는 주요 기능들이 어떤 방식으로 구현됐는지 예로 듭니다. 리눅스 커널은 오픈 소스이고 Armv7 아키텍처 기반에서 구동되는 리눅스 제품이 많기 때문입니다. 리눅스 커널에서 Arm의 동작 모드를 활용한 구현 방식을 소개합니다.
[Arm프로세서] Armv7: subs와 movs 명령어를 실행해 Arm 동작 모드 변경
Arm 동작 모드를 바꾸는 다른 방법은 spsr 레지스터의 [7:0] 비트를 변경하고 다음과 같은 형식의 명령어를 실행하는 것입니다. ❑ subs pc, lr, #4 ❑ movs pc, lr sub은 뺄셈 연산, mov는 레지스터의 값을 이동시키는 연산을 수행하는 명령어입니다. 그런데 위 명령어를 보면 각 명령어의 끝에 s와 같은 접미사가 있습니다. Arm 코어가 위와 같은 ‘subs’ 혹은 ‘movs’ 명령어를 보면 내부적으로 다음과 같이 실행합니다. ❑ spsr 레지스터의 값을 cpsr 레지스터에 백업하자. ❑ spsr 레지스터의 M[4:0]에 저장된 모드로 변경하자. 위와 같은 동작은 하드웨어적으로 수행됩니다. [중요]mov와
[리눅스커널] 동기화: 큐드 스핀락(queued spinlock) 분석 - 1
큐드 스핀락은 왜 배워야 할까 Aarch64 아키텍처 기반 리눅스 커널에서 스핀락은 큐드 스핀락 방식이 적용됩니다.그 이유는 다음 링크를 보면 알 수 있습니다. 링크:git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=c11090474d70590170cf5fa6afe85864ab494b37 Will Deacon이란 Arm 사의 개발자가 'arm64: locking: Replace ticket lock implementation with qspinlock'이란 커밋 타이틀과 함께 큐드 스핀락 코드를 Arm64 코드에 적용했는데요. 그런데 다음과 같은 코드를 보면 흥미로운 사실을 알 수 있습니다. diff --git a/ar
[Arm프로세서] Armv7: msr cpsr_c 명령어로 Arm 동작 모드 변경
PL1로 정의된 Arm 동작 모드끼리는 동작 모드 변경이 가능합니다. 특히 부팅 과정에서 PL1로 정의된 Arm 동작 모드를 변경하면서 스택을 설정합니다. msr cprs_c 명령어를 실행하면 변경되는 비트 먼저 다음 그림을 보면서 cpsr 레지스터의 M[4:0] 비트를 설정하는 방법을 알아봅시다. 그림 3.3 'msr cpsr_c, #Mode | I_Bit | F_Bit' 명령어를 실행할 때 적용되는 비트 'msr cpsr_c, #Mode | I_Bit | F_Bit' 명령어를 실행하면 M[4:0] 비트가 포함된 [7:0] 비트에 위치한 값이 변경됩니다. 즉, Arm 동작 모드를 나타내는 M[4:0]번째 비트와 인터럽트와 FIQ를 설정하는 비트까지 함께 업데이트합니다. 먼저 msr 명령어는 Co
[Arm프로세서] Armv7: Arm 동작 모드를 바꾸는 명령어
익셉션이 발생하면 해당 Arm 동작 모드로 진입합니다. 그런데 시스템을 디자인을 할 때는 Arm 동작 모드를 바꿔야 할 상황이 있습니다. Arm 아키텍처에서는 이를 위한 명령어를 지원하는데 2가지 방식이 있습니다. ❑ msr cpsr_c, #Mode | I_Bit | F_Bit ; ❑ movs, subs 명령어 먼저 'msr cpsr_c' 명령어를 사용해 Arm 동작 모드를 변경하는 방법을 알아봅시다.


