메시지 신호 인터럽트
Message Signaled InterruptsMSI(Message Signalized Interrupts)는 전용 인터럽트 라인의 Out-of-Band 주장을 대체하기 위해 특수 인밴드 메시지를 사용하여 인터럽트를 신호하는 대체 인밴드 방법이다.장치에서 구현하기 더 복잡하지만, 메시지 표시 인터럽트는 핀 기반 대역 외 인터럽트 신호 전달에 비해 몇 가지 중요한 이점을 가지고 있다.
메시지 표시 인터럽트는 버전 2.2 이후 PCI 버스와 나중에 사용 가능한 PCI Express 버스에서 지원된다.일부 비 PCI 아키텍처는 또한 메시지 표시 인터럽트를 사용한다.
개요
전통적으로, 장치는 호스트 처리 환경에 대한 인터럽트 신호를 보낼 때 주장하는 인터럽트 라인(핀)을 가지고 있다.이 전통적인 형태의 인터럽트 신호는 주 데이터 경로와 별도로 그러한 제어 정보를 전송하기 위해 전용 경로를 사용하기 때문에 대역 외 형식의 제어 신호 전달이다.MSI는 주 데이터 경로를 통해 인터럽트를 나타내는 특수 메시지를 교환함으로써 이러한 전용 인터럽트 라인을 인밴드 신호로 대체한다.특히 MSI는 소량의 인터럽트 설명 데이터를 메모리가 매핑된 특수 I/O 주소에 쓸 수 있도록 하고, 칩셋은 그 후 해당 인터럽트를 프로세서에 전달한다.[1][2][3]
MSI와의 일반적인 오해는 장치가 인터럽트의 일부로 프로세서로 데이터를 전송할 수 있게 한다는 것이다.메모리 쓰기 트랜잭션의 일부로 전송되는 데이터는 어떤 프로세서에 어떤 인터럽트를 트리거할 것인지 결정하기 위해 칩셋에 의해 사용된다. 그 데이터는 인터럽트 핸들러에 추가 정보를 전달하는 장치에 사용할 수 없다.[1][2][3]
예를 들어, PCI Express는 별도의 인터럽트 핀을 전혀 가지고 있지 않다. 대신, 특별한 인밴드 메시지를 사용하여 핀 어설션이나 디서션이 에뮬레이션될 수 있다.일부 비 PCI 아키텍처도 MSI를 사용한다. 다른 예로 HP GSC 장치는 인터럽트 핀이 없으며 메모리 공간에서 프로세서의 인터럽트 레지스터에 직접 쓰는 것만으로 인터럽트를 발생시킬 수 있다.[citation needed]HyperTransport 프로토콜은 MSI도 지원한다.[4]
이점
장치에서 구현하기 더 복잡하지만, 메시지 표시 인터럽트는 핀 기반 대역 외 인터럽트 신호 전달에 비해 몇 가지 중요한 이점을 가지고 있다.기계적인 측면에서는 핀의 수가 적기 때문에 커넥터가 더 단순하고, 더 저렴하며, 더 신뢰할 수 있다.이는 표준 PCI 커넥터에 이점은 아니지만 PCI Express는 이러한 절감 효과를 활용한다.
MSI는 가능한 인터럽트의 수를 증가시킨다.기존 PCI는 카드당 4개의 인터럽트로 제한되었지만(그리고 모든 카드에서 공유되었기 때문에 대부분 1개의 카드만 사용), 메시지 표시 인터럽트는 카드당 수십 개의 인터럽트를 허용하며, 그것이 유용할 때 카드당 수십 개의 인터럽트를 허용한다.[1]
약간의 성능상의 장점도 있다.소프트웨어에서, 핀 기반의 인터럽트는 메모리에 대한 쓰기로 경주를 할 수 있다.즉, PCI 디바이스는 데이터를 메모리에 쓴 다음 인터럽트를 보내 DMA 쓰기가 완료되었음을 표시한다.그러나 PCI 브리지나 메모리 컨트롤러는 일부 다른 메모리 사용에 간섭하지 않기 위해 쓰기를 버퍼링할 수 있다.인터럽트는 DMA 쓰기가 완료되기 전에 도착할 수 있었고 프로세서는 메모리에서 오래된 데이터를 읽을 수 있었다.[5]이 경주를 방지하기 위해 DMA 쓰기가 완료되었는지 확인하기 위해 장치에서 인터럽트 핸들러가 읽어야 했다.이 읽기는 중간 정도의 성능 저하가 있었다.MSI 쓰기는 DMA 쓰기를 통과할 수 없으므로 경주는 없어진다.[6]
MSI 유형
PCI는 Message Signalized Interrupts를 지원하는 두 가지 선택적 확장을 정의한다. MSI와 MSI-X. PCI Express는 기존의 PCI 인터럽트를 모방하기 위한 자체의 메시지 기반 메커니즘을 정의한다.
MSI
MSI(PCI 2.2에 처음 정의됨)는 디바이스가 1, 2, 4, 8, 16 또는 32개의 인터럽트를 할당할 수 있도록 허용한다.장치는 (일반적으로 인터럽트 컨트롤러의 제어 레지스터)에 쓸 주소와 이를 식별하기 위한 16비트 데이터 워드로 프로그래밍된다.인터럽트 번호는 데이터 워드에 추가되어 인터럽트를 식별한다.[1]Windows와 같은 일부 플랫폼은 32개의 인터럽트를 모두 사용하지 않고 최대 16개의 인터럽트만 사용한다.[7]
MSI-X
MSI-X(PCI 3.0에서 처음 정의됨)는 장치에 최대 2048개의 인터럽트를 할당할 수 있도록 허용한다.원본 MSI가 사용하는 단일 주소는 일부 아키텍처에서는 제한적인 것으로 밝혀졌다.특히 개별 인터럽트를 다른 프로세서로 타겟팅하기 어렵게 해 일부 고속 네트워킹 애플리케이션에 도움이 된다.MSI-X는 더 많은 인터럽트를 허용하고 각 인터럽트마다 별도의 대상 주소와 데이터 단어를 제공한다.MSI-X를 사용하는 장치가 반드시 2048 인터럽트를 지원하는 것은 아니다.[3][8][9][10]
MSI-X의 경우 MSI(64비트 주소 지정 및 인터럽트 마스킹)의 옵션 기능도 필수 사항.
PCI Express 레거시 인터럽트 에뮬레이션
PCI Express에는 물리적 인터럽트 라인이 없지만 어설션_과 같은 전용 PCI Express 메시지를 통해 PCI의 물리적 라인 4개를 에뮬레이트한다.ITA 및 Deassert_INC. (PCI Express 계층에서) 메시지 기반이기 때문에, 이 메커니즘은 PCI 계층 MSI 메커니즘의 장점 중 일부 또는 전부는 아니다. 즉, 디바이스당 4개의 가상 회선이 버스에서 더 이상 공유되지 않으며(PCI Express 컨트롤러가 여전히 레거시 인터럽트를 내부적으로 결합할 수 있지만), 인터럽트 변경은 더 이상 본질적으로 la로 인한 영향을 받지 않는다.조건을 충족하다
PCI Express는 디바이스가 PCI 드라이버와 소프트웨어 호환성을 유지하며 이러한 레거시 인터럽트 메시지를 사용할 수 있도록 허용하지만 PCI 계층에서 MSI 또는 MSI-X도 지원해야 한다.
x86 시스템
인텔 시스템의 경우, 단일 코어(단일 코어) 시스템에서도 PCI(및 PCI Express) MSI/MSI-X가 작동하도록 LAPIC를 활성화해야 한다.[11][12]이러한 시스템에서 MSI는 인터럽트 서비스를 필요로 하는 프로세서/코어의 LAPIC에 인터럽트 벡터를 직접 작성함으로써 처리된다.2009년의 Intel LAPICs는 최대 224개의 MSI 기반 인터럽트를 지원했다.[12]Linux를 사용하는 2009 Intel 벤치마크에 따르면 MSI를 사용하면 I/O APIC 제공에 비해 인터럽트의 대기 시간이 거의 3배 감소했다고 한다.[13]
운영 체제 지원
Microsoft 운영 체제 제품군에서 Windows Vista 이상 버전에서는 MSI와 MSI-X를 모두 지원한다.2004년경 롱혼 개발 사이클에서 지원이 추가되었다.[14]MSI는 Windows XP 또는 Windows Server 2003과 같은 이전 버전에서는 지원되지 않는다.[15]
Solaris Express 릴리즈 6/05는 MSI an MSI-X에 대한 지원을 새로운 장치 드라이버 인터페이스(DDI) 인터럽트 프레임워크의 일부로 추가했다.[16]
FreeBSD 6.3과 7.0은 MSI와 MSI-X에 대한 지원을 추가했다.[17]
OpenBSD 5.0은 MSI에 대한 지원을 추가했으며 6.0은 MSI-X에 대한 지원을 추가했다.[18][19]
리눅스는 2003년경 MSI와 MSI-X에 대한 지원을 얻었다.[20]2.6.20 이전 버전의 Linux 커널은 MSI/MSI-X 구현에 심각한 버그와 한계가 있는 것으로 알려져 있다.[21]
하이쿠는 2010년경 MSI에 대한 지지를 얻었다.[22]MSI-X 지원은 이후 2013년에 추가되었다.[23]
NetBSD 8.0은 MSI 및 MSI-X에 대한 지원을 추가했다.
VxWorks 7은 MSI 및 MSI-X 지원
참조
- ^ a b c d PCI Local Bus Specification Revision 2.2. Section 6.8 (MSI). PCI-SIG. December 1998.
- ^ a b PCI Local Bus Specification Revision 2.3. Section 6.8 (MSI). PCI-SIG. 2002.
- ^ a b c PCI Local Bus Specification Revision 3.0. Section 6.8 (MSI & MSI-X). PCI-SIG. August 2002.
- ^ Don Anderson; Jay Trodden (2003). HyperTransport System Architecture. Addison-Wesley Professional. p. 200. ISBN 978-0-321-16845-0.
- ^ Coleman, James (2009). "Overview of Interrupt Delivery Methods, Legacy XT-PIC Interrupts, XT-PIC Limitations". Reducing Interrupt Latency Through the Use of Message Signalled Interrupts (PDF). Intel Corporation. p. 10.
- ^ Corbet, Jonathan; Rubini, Alessandro; Kroah-Hartman, Greg (2009). "Chapter 15: Memory Mapping and DMA". Linux Device Drivers (3rd ed.). O'Reilly Media. Retrieved 2019-04-20.
- ^ Microsoft. "Enabling Message-Signalled Interrupts in the Registry". Microsoft Corporation. Retrieved 12 April 2013.
- ^ "Section 6.1: MSI & MSI-X". PCI Express Base Specification Revision 1.0a. PCI-SIG. April 2003.
- ^ "Section 6.1: MSI & MSI-X". PCI Express Base Specification Revision 1.1. PCI-SIG. March 2005.
- ^ "MSI-X Engineering Change Notice". PCI Local Bus Specification Revision 2.3 (PDF). PCI-SIG.
- ^ 유니프로세서 PC의 APIC 기반 인터럽트 하위 시스템
- ^ a b Coleman, James (2009). Reducing Interrupt Latency Through the Use of Message Signalled Interrupts (PDF). Intel Corporation. pp. 10, 11.
- ^ Coleman, James (2009). "Results, Workstation Class Platform". Reducing Interrupt Latency Through the Use of Message Signalled Interrupts (PDF). Intel Corporation. p. 19.
- ^ 2004년 8월 11일 Microsoft Windows Vista의 향상된 아키텍처
- ^ PCI, PCI-X 및 PCI Express: 질문과 대답, 2005년 11월 18일, 4페이지
- ^ John Stearns, Gobinda Tatti, Edward Gillett 및 Anish Gupta, (2006년 3월 27일) Solaris Express 6/05 OS에서 Solaris Express 고급 인터럽트 핸들러의 MSI 지원 변경 사항
- ^ John H. Baldwin, "FreeBSD 하의 x86 시스템에 대한 PCI 인터럽트", "가용성" 섹션
- ^ Mark Kettenis, (2011년 5월) MSI를 지원하는 아키텍처에 대한 MSI 중단(amd64, i386, 스파르c64 지금까지만 해당)
- ^ Mark Kettenis, (2016년 5월) MSI-X에 대한 초기 지원이 추가됨
- ^ MSI-HOWTO.txt 첫 번째 버전
- ^ Miry10GE를 사용하면 Linux 2.6.18 이하에서 MSI-X 인터럽트를 사용할 수 있는가?
- ^ [1] Haiku가 MSI 지원 추가 커밋
- ^ [2] 하이쿠에서 MSI-X 지원 추가 커밋