상세 컨텐츠

본문 제목

GIC

CS지식 학습

by Tabris4547 2024. 4. 18. 10:29

본문

728x90

인터럽트 컨트롤러

당장 여러분의 PC주변을 살펴보면

다양한 기기를 사용한다는 걸 느끼실 수 있습니다.

제가 사용하는 노트북만 생각하더라도

터치패드/카메라/외장하드/랜선 등등을 사용하고 있습니다.

각각의 기기에 대해서 인터럽트가 걸릴테죠.

그렇다면 이 각각에 대해서

어떤 걸 우선적으로 처리해야할까요?

인터럽트 컨트롤러는 다음의 기능을 수행합니다.

 

1. 각 인터럽트 활성화/비활성화

2. 각 인터럽트 우선순위 레벨 설정

3. 인터럽트를 처리할 수 있는 타깃프로세서 리스트

4. 각 인터럽트를 논시큐어/시큐어 설정

5. 페리페럴(외부 I/O장치)에서 전달되는 인터럽트를

레벨 센서티브 혹은 에지 트리거로 설정.

 

위의 동작을 수행한 후, 결과를 CPU Core에 전달합니다.

 

 

GIC(Generic Interrupt Controller)

GIC는 Arm사가 설계한 인터럽트 컨트롤러입니다.

64비트기반 대부분의 arm아키텍쳐에서 사용하고있으며

GIC관련 인터페이스가 잘 갖춰져있어 대부분 64비트에서 쓰인다 볼 수 있습니다.

위에서 인터럽트 컨트롤러를 알고있다면

GIC의 큰 기능에 대해서는 금방 파악하실 수 있습니다.

 

GIC를 구성하는 인터럽트 소스 종류

GIC를 구성하는 인터럽트 소스는 크게 4가지로 이뤄져있습니다.

다음 표에 나온대로

SPI PPI SGI LPI 등의 소스로 구성되어있습니다.

(periheral이라는 말이 생소하실 수 있는데

'병렬적으로 연결된 기기'정도로 해석할 수 있고

더 쉽게 PC에 연결된 기기들이라고 생각하시면 됩니다.)

각각을 자세하게 해석해보겠습니다.

 

SPI

'shared'라는 말이 공유하다를 의미하는데

뭘 공유하는 걸까요?

CPU코어 여러대를 공유한다는 의미입니다.

만약 CPU코어가 4개라면

이 인터럽트를 0번에서 처리할 수 있고

아니면 3번에서 처리할 수 있는 식입니다.

 

PPI

'private'이 '개인소유'라는 의미를 가지는데

위의 SPI의 예시랑 비교한다면

'특정 CPU코어전용'이라고 보면 됩니다.

즉, 특정 인터럽트는

CPU 코어 3번에서만 처리한다는 식입니다.

 

SGI

I/O장치에서 발생하는 물리적인 인터럽트와 달리

소프트웨어적으로 발생하는 인터럽트입니다.

 

 

구조도

GIC를 구성하는 하드웨어 블록입니다.

그림에서 하얀 박스로 그려진 부분이 GIC에 해당한다고 보면 됩니다.

디스트리뷰터와 리디스트리부터에서는

인터럽트를 받아 처리합니다.

CPU Interface에서는 인터럽트마다 우선순위를 설정하고

인터럽트의 정보를 통합해 CPU Core에 전달합니다.

 

코드분석

bootlin에서 관련 함수를 가져와봤습니다.

커널 5.4120버전의 gic_handle_irq함수입니다.

코드를 보면 간단해보입니다.

인터럽트 값을 읽어서 해당 값에 따라 함수가 if문에 따라 동작한다보면 됩니다.

그럼 이 코드가 의미하는 바는 무엇일까요?

Arm아키텍쳐에서는 인터럽트를 익셉션의 한 종류로 처리합니다.

인터럽트가 발생하면 user공간인 EL0에서 

Kernel 공간인 EL1로 넘어갑니다.

그때, 프로세스 정보를 레지스터에 push하고

GIC handler함수로 넘어갑니다.

handler함수에서 해당 인터럽트가 어떤 종류인지 체크한 후에

그에 맞게 arm 아키텍쳐가 동작한다 해석하면 됩니다.

 

 

참고자료

데브코스 리눅스커널 전문가 과정

Arm 아키텍처의 구조와 원리

728x90

'CS지식 학습' 카테고리의 다른 글

메모리 가상화(memory virtualization)  (0) 2024.04.29
스택카나리(Stack canary)  (0) 2024.04.10
시스템 콜의 ftrace 분석을 해보자!  (0) 2024.04.02
익셉션(Exception)  (0) 2024.03.15
인터럽트  (1) 2024.03.13

관련글 더보기

댓글 영역