Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

230224
1178
109352


[라즈베리파이] 시스템 콜 - 소프트웨어 인터럽트란 11. System Call

소프트웨어 인터럽트를 한 문장으로 정의해 봅시다. 
소프트웨어 인터럽트는 인터럽트가 아닙니다. 인터럽트는 하드웨어서 올려주는 전기 신호로 언제 발생할지 모르는 비동기적인 이벤트이나 통지입니다.

그런데 소프트웨어 인터럽트는 ARM 프로세서에서 제공하는 “svc” 어셈블리 명령어를 실행하면 동작합니다. 소프트웨어 인터럽트를 발생하는 주체는 소프트웨어 관점으로 프로세스입니다. 소프트웨어 인터럽트란 용어의 인터럽트는 하드웨어 디바이스에서 비동기적으로 전달하는 신호는 아닙니다.

실제 인터럽트가 발생하면 ARM 프로세서는 인터럽트를 익셉션의 한 종류로 처리합니다. 리눅스 커널에서 다음은 같이 동작합니다.
1. 익셉션 발생(인터럽트는 비동기적인 신호)
2. 익셉션 벡터로 ARM 프로그램 카운터를 이동
3. 익셉션 벡터에서 기존에 실행 중인 레지스터 세트를 스택 공간에 저장
4. 익셉션 종류에 따른 서브 루틴으로 분기
5. 익셉션 처리를 마무리한 후 익셉션 서브 루틴을 실행한 주소로 복귀
6. 스택에 푸시한 레지스터를 ARM 레지스터 세트에 로딩해서 익셉션 발생 전 실행했던 주소로 이동

소프트웨어 인터럽트는 인터럽트가 아니라고 했습니다.
대신 소프트웨어 인터럽트는 ARM에서 지원하는 어셈블리 코드 "svc" 명령어를 명시적으로 실행해서 익셉션을 유발하는 동작입니다. 따라서 소프트웨어 인터럽트는 비동기적인 이벤트는 아닙니다. 

위에서 언급한 인터럽트 익셉션이 발생했을시 6가지 동작 과정에서 익셉션이란 단어를 소프트웨어 인터럽트란 단어로 바꿔 봅시다.
1. 유저 모드에서 svc "0x00000000" 명령어 실행으로 커널 코드 진입
2. 소프트웨어 인터럽트 벡터로 ARM 프로그램 카운터를 이동
3. 소프트웨어 인터럽트 벡터에서 기존에 실행 중인 레지스터 세트를 스택 공간에 저장
4. 소프트웨어 인터럽트 종류에 따른 서브 루틴으로 분기
5. 소프트웨어 인터럽트 처리를 마무리한 후 소프트웨어 인터럽트 서브 루틴을 실행한 주소로 복귀
6. 소프트웨어 인터럽트에 푸시한 레지스터를 ARM 레지스터 세트에 로딩해서 소프트웨어 인터럽트 전 실행했던 주소로 이동(유저 모드 복귀)

소프트웨어 인터럽트를 유발하는 소스가 다른 것이지 ARM 프로세서에서 인터럽트 벡터를 실행해서 인터럽트를 처리하는 방식은 같습니다.

ARM 프로세서 인터럽트 벡터가 __irq_svc 인 것과 마찬가지로 소프트웨어 인터럽트 벡터는 vector_swi 입니다.
즉 다음과 같은 과정으로 실행 흐름이 변경되는 것입니다.

위 동작은 순수히 ARM 프로세서 익셉션 관점으로 설명을 한 것입니다.

ARM 프로세서 입장에서 지금 실행 중인 운영체제가 리눅스인지 모릅니다. 따라서 소프트웨어 인터럽트를 발생한 다음 시스템 콜 테이블로 분기하는 동작을 합니다. 이는 리눅스 시스템에서 시스템 콜을 POSIX에 따라 구현한 것입니다.

#Reference 시스템 콜


Reference(워크큐)
워크큐(Workqueue) Overview

.

핑백

덧글

댓글 입력 영역