글 자체는 꽤 오래된건데 요새 PCI-E 3.0을 넘어서는 스펙의 소식이 없으니 복습 삼아 한번 보세요.

 

PC는 옛날부터 확장을 위해 주요 부품을 전부 메인보드에 탑재하지 않고, 확장 슬롯에 장착하는 식으로 부품을 추가 및 변경할 수 있도록 했습니다. 이 확장 슬롯과 본체를 연결하는 것이 바로 버스입니다.

 

처음엔 확장 슬롯을 사용해 케이스 내부에서 부품을 연결하는 것을 버스라 불렀으나, 이후에는 USB처럼 케이스 외부의 디바이스를 연결하는 버스도 등장했으며 지금은 이쪽의 비중이 상당히 커졌습니다.

 

 

PC용 버스의 역사를 되돌아보기: 처음은 4.77MHz

 

1.png

PC용 확장 버스의 로드맵

 

처음은 전반적인 부분을 보도록 하겠습니다. 위 로드맵은 IBM PC 이후 사용해 온 확장 슬롯 방식의 범용 버스를 정리한 것입니다. 몇개는 범용이라 부르기 어려운 것도 있는데 거기에 대해선 뒤에서 설명하도록 하겠습니다.

 

1981년에 발표된 IBM PC에서 채용된 것이 통칭 IBM PC 버스라 불리는 것입니다. 기능 면에서 보면 이후에 등장하는 XT 버스에 가까운 것이나 엄밀히 말하면 약간 다릅니다(IBM  PC/XT에서 다소 기능이 추가됨). 일단 여기에선 분리해서 소개하겠습니다.

 

이 IBM PC 버스에 연결되는 부품에는 다음과 같은 것이 있습니다.

  • 메모리
  • 그래픽 카드
  • 키보드/마우스 인터페이스 카드
  • RS-232C 인터페이스 카드
  • 프린터 인터페이스 카드
  • FDD 인터페이스 카드
  • HDD 인터페이스 카드
  • 카세트 인터페이스 카드

최초의 IBM PC는 4.77MHz로 구동하는 8비트 버스로 외부와 연결되는 인텔 8088을 CPU로 탑재했기에 메모리가 확장 버스를 경유한다고 해서 문제될 것이 없었습니다.

 

2년 후에 등장한 IBM PC/XT에서는 기본적인 성능은 마찬가지고 확장성을 약간 강강화했으며, 여기에 따라 버스에서도 약간의 제어 신호를 추가했는데 그것이 바로 XT 버스입니다. 버스 폭은 8비트이며 클럭 속도는 CPU와 같은 4.77MHz입니다.

 

 

오랬동안 쓰인 ISA 버스의 등장

 

이 XT 버스를 확장하는 형태로 등장한 것이 IBM PC/AT에서 등장한 ISA 버스입니다. IBM PC/AT는 CPU에 80286(처음에는 6MHz로 구동했으나 나중에 8MHz가 됨)를 탑재했고 CPU의 버스 폭도 16비트로 늘었습니다.

 

2.jpg

 

2007년에 판매된 ISA 버스 탑재 메인보드. 사진 가장 아래가 ISA 버스의 확장 슬롯이며 그 위엔 PCI 버스가 있습니다.

 

IBM PC/AT에서는 메모리도 범용 버스와 다른 버스에 접속되며 범용 버스도 XT 버스로는 좁다고 판단해 XT 버스를 8비트 확장해 16비트가 됐습니다. 작동 클럭은 CPU에 맞춰 8MHz까지 올라갔습니다. 이렇게 XT 버스를 확장한 것이 ISA 버스이며 이후 15년 가까이 쓰이게 됐습니다.

 

참고로 IBM PC/AT가 등장했을 당시에 이 버스는 AT 버스라고 불렸습니다. 이게 ISA 버스라고 이름이 붙은 건 나중에 설명할 EISA 버스가 등장하면서부터입니다.

 

그리고 이 ISA 버스는 확장 카드를 만들기 간단하고 그냥저냥 성능이 나오기에 널리 보급됩니다. 게다가 여러 제한이 있긴 하지만 의외로 확장성이 있다는 점이 높게 평가돼 산업용 제품에선 아직까지도 ISA 버스를 일부 제품에서 쓰이기도 합니다.

 

다만 가격은 논외로 치더라도 성능이 썩 높지 않으며 확장성은 있지만 제한이 많다는 단점이 있다보니, CPU의 성능이 높아지거나 시스템이 복잡해지면서 단점이 제기됐습니다.

 

 

마이크로 채널과 EISA 버스의 대립

 

ISA 버스의 한계를 내다보고 IBM이 출시한 것이 MicroChanel(MCA 버스)였습니다. 그러나 성능이나 확장성은 어쨌든 간에 규격이 오픈되지 않아 이걸 쓰려면 IBM에 로열티를 내야 하다보니 결국 크게 보급되지 않았습니다.

 

이에 맞서 PC 제조 업체들의 단체에서도 독자적으로 ISA를 기반으로 확장한 EISA 버스라는 32비트 확장 버스를 정의했습니다. 이것은 XT 버스나 ISA 버스와 호환성을 유지했기에 성능 자체는 ISA의 두배 정도로 성능 개선에 큰 도움이 되진 않았습니다. 그래서 결국 서버용 등 일보 용도로만 쓰이는 데 그쳤습니다. 그리고 앞에서도 말한대로 EISA의 스펙을 정할 때 그 바탕이 되는 ISA 버스의 스펙을 정하지 않으면 안된다는 점을 빼놓을 수 없습니다.

 

이러한 경험을 토대로 1990년부터 차세대 범용 I/O 버스를 책정하려는 움직임이 시작됐습니다. 이는 PCI-SIG라는 단체가 태어나게 했고 그 성과는 나중에 PCI 1.0이란 이름으로 1992년에 등장하게 됩니다. 그러나 1989년부터 이미 버스의 대역폭이 부족한 현상은 그래픽카드에서 특히 두드러졌습니다.

 

이를 해결하기 위해서 칩셋 제조사인 미국 OPTi와 몇몇 제조사가 독자적인 버스 스펙을 책정하려는 움직임을 보였습니다. 독자적이라고는 해도 대부분은 당시 주류였던 인텔 486 버스를 그대로 꺼내 접속하는 형식이었는데요. 최종적으로 VESA 로컬 버스(VL 버스)라는 이름으로 표준화됐습니다.

 

다만 VL 버스는 여러가지 문제가 있어 여유 폭도 적고 확장성도 부족했습니다. 또 486의 신호선을 그대로 썼기에 CPU가 펜티엄으로 바뀌면서 칩셋 내에서 펜티엄의 신호를 486의 신호로 바꿔야 하는 삽질이 들어가게 됐습니다.

 

이런 문제를 해결한 것이 1993년에 등장한 PCI 버스입니다. 그런데 PCI 버스 1.0은 여러가지로 스펙의 버그나 애매한 점이 많아 이걸 조정한 PCI 버스 2.0이 출시되면서 겨우 보급됐습니다. 이 PCI가 본격적으로 보급을 시작한 1994년에는 VL 버스와 EISA 버스는 시장에서 아예 사라지게 됩니다.

 

 

그래픽용 AGP, 서버용 PCI-X의 등장

 

VL 버스와 EISA는 사라졌지만 ISA 버스는 느린 속도의 기기들이 계속 사용했습니다. 그러나 ISA 버스를 사용하는 확장 카드가 리소스를 서로 경쟁하게 되면서 윈도우 95 이후의 OS에서는 큰 문제가 생기게 됩니다.

 

MS-DOS 시절 확장 카드가 이용하는 인터럽트 번호(IRQ)와 I/O 포트 어드레스, DMA 채널 번호 등의 리소스는 확장 카드에서 하드웨어적으로 해결하는 게 일반적이었으나, 윈도우 95와 윈도우 NT에서는 리소스의 관리를 소프트웨어적으로 해결하는 시스템을 쓰게 됩니다. 그러나 소프트웨어가 준비된다 하더라도 하드웨어가 이를 맞추지 못하면 사용이 없습니다. 이를 해결하기 위해 PnP ISA(Plug and Play ISA)라 불리는 ISA의 확장 기능도 발표됐지만 PnP ISA를 지원하지 않는 카드에선 의미가 없고, 이걸 지원하는 카드에서도 자주 문제가 발생하곤 했습니다.

 

그래서 1998년부터 ISA 버스를 없애려는 움직임이 마이크로소프트를 중심으로 해서 점점 커졌습니다. 인텔도 1999년에 출시한 인텔 810 칩셋 이후에선 원칙적으로 ISA 버스를 뺐습니다. 원칙적이라는 말이 붙은 이유는 ISA 버스 대신 마련된 LPC라는 온보드 디바이스 전용 버스에 LPC/ISA 브릿지 칩을 탑재해 ISA 버스 슬롯을 지원하는 제품이 잠시 나왔기에 그렇습니다. 그러나 이런 제품도 2000년대 들어 점점 사라지게 됐습니다.

 

ISA 버스가 사라져갈 때쯤 보급이 시작된 것이 1997년에 등장한 AGP(Accelerated Graphics Port)입니다. 이름 그대로 그래픽 카드 전용 규격으로 PCI 버스를 기반으로 하면서 전송 속도를 2배(AGP 1.0)~8배(AGP 3.0)까지 올린 규격입니다.

 

AGP의 원래 목적은 그래픽 카드에 3D 표시 기능이 추가되면서 필요로 하는 데이터의 양이 늘어났고, 거기에 맞춰서 메인 메모리에 있던 텍스처 데이터를 빠르게 그래픽 카드에 전송하기 위함이었습니다. 비디오 메모리를 대용량으로 탑재할 수 없는 저가형에선 AGP를 통해 텍스처 정보를 빠르게 전송할 수 있다는 의미가 있었습니다. 그러나 실제로는 그래픽카드에 대량의 비디오 메모리가 탑재되면서 텍스처를 거기에 저장하는 게 일반적인 상황이 됐고, AGP 자체는 3D 렌더링 성능 애것에 그리 큰 영향을 주진 못했다고 할 수도 있을 것입니다.

 

AGP는 PCI 기준으로 2배속이나 4배속으로 작동하는데 전송 속도는 나중에 설명할 PCI-X와 같습니다. 이 점을 노려 AGP와 PCI-X를 모두 지원하는 칩셋을 만들어 데스크탑과 워크스테이션/로우엔드 서버를 모두 노리는 칩셋 제조사도 있었습니다. 하지만 실제로는 이런 칩셋이 워크스테이션/로우엔드 서버에서는 거의 쓰이지 않았고, PCI-X용으로 쓰이지 않았던 일도 있었습니다.

 

AGP가 등장한 것 외에도 PCI 자체를 강화한 일도 있었습니다. 원래 PCI는 33MHz로 구동하며 버스 폭은 32비트와 64비트를 정의했지만, 1995년에 제정된 PCI 버스 2.1의 스펙에서는 66Mhz 구동도 지원했습니다. 그 결과 데스크탑용은 32비트에 33MHz, 서버용은 64비트에 33/66Mhz라는 차별화도 가능했습니다.

 

서버용 규격으로 PCI 성능을 더 강화한 것이 PCI-X입니다. 버스 폭은 64비트지만 전송 속도는 66/100/133MHz로 올렸습니다. 또 2003년에 제정된 PCI-X 2.0에서는 266/533MHz의 전송 속도도 추가됐는요. 이게 미처 보급되기도 전에 PCI 익스프레스로 건너가게 됩니다.

 

 

지금의 주인공. PCI-E와 그 확장

 

이제 지금 버스의 주인공이라 할 수 있는 PCI 익스프레스입니다. PCI와 전혀 다른 접속 방식을 사용해 성능을 대폭 높인다는 게 이 버스가 생겨난 동기입니다. 2002년에는 1.0이 발표됐지만 여기에선 통신이 제대로 되지 않는다는 버그가 있어 몇몇 문제를 수정한 1.0a가 2004년에, 거기서 한층 더 수정을 한 1.1이 2005년에 발표됩니다.

 

처음에는 PCI-E를 지원하는 제품이 칩셋과 그래픽카드밖에 없었지만, PCI-E 2.0이 등장한 2006년부터 기가비트 이더넷 컨트롤러나 레이드 컨트롤러, SATA 컨트롤러 등 지원하는 제품도 늘어나 지금까지 이르렀습니다.

 

2009년에는 프로토콜 확장과 에러 수정을 더한 2.1도 나왔습니다. 그리고 2010년에는 차세대인 PCI-E 3.0도 나왔습니다. 1.x/2.x에서 스펙이 정해지고 칩셋과 그래픽카드가 이를 먼저 도입해 스펙을 구현한 것과는 달리 3.0에서는 도입하려는 움직임이 둔해졌습니다. 지금은 신형 그래픽카드가 나오면서 쓰이고 있지만요.

 

이렇게 PCI-E가 보급되면서 PCI 버스는 PC에서 점점 사라져갔습니다. 얼마 전까지만 해도 PCI 슬롯이 달린 메인보드를 보기가 어렵지 않았으나 이제는 PCI-E로 단일화됐다고 해도 과언이 아니지요. 다만 ISA 버스와 달리 PCI 버스는 아직 임베디드 등에서 널리 쓰이고 있기에 어떤 부분에선 현역이라 할 수 있겠습니다.

 

이렇게 PC에서 쓰이는 버스를 간단하게 소개했습니다. 다음부터는 좀 더 자세히 설명하겠습니다.

 

 

XT 버스를 확장해서 태어닌 ISA 버스

 

좀 더 쉽게 이해하기 위해서 3가지 버스의 관계를 그림으로 표현했습니다. 큰 원으로 표시한 것이 IBM PC/XT에서 채용된 XT 버스입니다. 이 XT 버스에서 어드레스와 데이터를 8비트씩 확장해 16비트 버스로 만든 것이 ISA 버스입니다.

 

3.png

 

XT, ISA, VL 버스의 관계

 

VL 버스는 나중에 설명할 ISA 버스와는 전혀 별개의 것으로서 어드레스와 데이터를 32비트 폭으로 만든 버스입니다. 그런 의미에서 VL 버스는 노란색으로 확장된 32비트 버스로 표시했습니다. VL 버스는 단독으로는 작동할 수 없으며 반드시 ISA 버스/EISA 버스와 제휴할 필요가 있습니다. 그래서 위 그림처럼 VL 버스+ISA 버스나 VL 버스+EISA 버스 형식으로 구현됩니다.

 

XT 버스로 되돌아갑시다. 아래 그림에 나온대로 XT 버스는 i8088을 기반으로 한 PC용 버스입니다. 그래서 데이터 버스는 8비트지요. 다만 i8088은 최대 1MB의 메모리 스페이스를 가지기에 이를 지원하기 위해서 어드레스 버스는 1MB 분에 해당하는 20비트가 준비됩니다(SA0~SA19).

 

4.png

 

XT 버스의 핀 구성

 

IRQ2~IRQ7은 인터럽트 신호입니다. 이를 설명하려면 I/O의 기본적인 설명을 해둘 필요가 있을 것입니다. 아래 그림은 CPU에서 FDD에 액세스할 때의 처리 흐름을 나타낸 것입니다(HDD도 같습니다).

 

5.png

 

FDD에 데이터를 기록할 때의 처리 흐름

 

(1) CPU는 FDD I/F의 컨트롤러에 I/O 리퀘스트를 보냅니다.

(2) 이에 따라서 FDD I/F는 FDD에 데이터를 기록합니다.

(3) FDD가 기록을 끝내면 완료 통지를 FDD I/F에게 돌려줍니다.

(4) FDD I/F는 CPU에 완료 통지를 보냅니다.

(5) CPU는 완료 통지를 받고 파일 쓰기를 마칩니다.

 

완료 통지가 올 때까지 기다리는 이유는, 만약 데이터 기록에 실패했을 경우 다시 기록하라고 에러 처리를 보내기 위함입니다. 쓰기 요청을 냈을 때 그걸로 끝나지 않습니다. 여기에서 문제가 되는 건 CPU는 언제 마무리가 되는지를 모른다는 것입니다.

 

 

인터럽트 신호의 장점

 

6.png

 

FDD에 데이터를 기록할 때의 처리 흐름

 

여기에서 이용되는 첫번째 방법이 Polling입니다. 폴링의 경우 CPU는 정기적으로 FDD I/F에게 데이터 기록이 끝났냐고 확인을 합니다. 고속 I/O는 그렇게 할 필요가 없지만 FDD 같은 저속 I/O에서는 끝나기까지 시간이 있습니다. 그래서 CPU는 작업이 완료될 때까지 몇번이나 FDD I/F에 접속해 그때 그때 상황을 확인합니다.

 

두번째 방법이 IRQ(Interrupt ReQuest) 신호를 쓰는 것입니다. 아래 그림이 IRQ를 사용할 경우의 처리 흐름입니다. FDD가 데이터 기록을 시작하기까지는 과정이 같지만 끝난 후부터 다릅니다.

 

7.png

 

IRQ를 이용한 FDD의 데이터 기록 처리 흐름

 

FDD는 데이터 기록이 끝나면 그것을 FDD I/F에 통지합니다. 또한 FDD I/F는 IRQ 신호를 사용해 CPU 측에 뭔가가 끝났다(혹은 무슨 일이 생겼다)는 것을 알려줍니다. IRQ 신호 자체는 1개, 즉 일어났다거나 일어나지 않았다는 것 뿐이며, 1비트 데이터라 구체적으로 무슨 일이 일어났다고까지 통보는 불가능하지만 그건 별 문제가 안됩니다. 이 IRQ 신호가 설정되면 CPU에는 인터럽트가 들어가 특정 처리 루틴을 넣게 됩니다. 이 처리 루틴 속에서 CPU는 FDD I/F에 접속해 완료 통지나 에러 통지 등을 읽어보는 식입니다.

 

이 방식의 장점은 2가지 있습니다.

 

이벤트(여기서 든 예에선 FDD의 기록 작업이 끝났음)가 발생하면 즉시 그것을 CPU에 통보할 수 있습니다. Polling에서는 이벤트가 발생하고 그것을 CPU가 알기까지 시차가 발생합니다. FDD 정도라면 어떻게 되겠으나 고속 디바이스일 경우 이게 병목 현상이 되는 경우가 있습니다.

 

또 CPU가 폴링할 필요가 없으니 대기 시간 동안 다른 처리가 가능합니다.

 

한편 단점은 1개의 디바이스가 1개의 IRQ를 점유한다는 것입니다. XT 버스에 할당된 IRQ는 다음 8가지의 종류가 있었습니다.

 

0 시스템 타이머 4 COM1
1 키보드 5 HDD 컨트롤러/LPT2(PC/AT)
2 범용(미사용) 6 FDD
3 COM2 7 LPT1

 

이 중 시스템 타이머와 키보드는 메인보드에서 사용하기에 XT 버스에는 신호가 오지 않습니다. 또 XT 버스에서는 IRQ 2를 쓸 수 있지만 IBM PC/AT의 ISA 버스에선 이걸 쓰기가 어렵습니다.

 

 

CPU를 사용하지 않고 데이터를 전송하는 DMA의 도입

 

XT 버서를 이해하려면 DMA에 대해서도 설명할 필요가 있습니다. DMA는 Direct Memory Access의 줄임말입니다. 예를 들면 FDD의 경우 데이터 읽기가 섹터 단위이기에 한번에 512바이트를 읽고 쓰게 됩니다.

 

XT 버스 등 I/O 디바이스에서 데이터를 읽어들일 경우엔 일반적으로 PIO(Programmable I/O)라는 방법을 사용합니다. 이를 사용함으로써 CPU는 메모리가 아니라 I/O 버스(XT 버스)에 직접 접근할 수 있게 되는데, 결과적으로 FDD에서 데이터를 읽을 경우 아래 그림과 같은 작업에 따라 1바이트 읽기가 완료됩니다.

 

8.png

 

PIO에 의한 FDD 데이터 읽기 과정

 

(1) FDD I/F에서 1바이트 데이터를 읽어냄(빨간 화살표)

(2) 읽어 낸 데이터를 메모리에 기록(녹색 화살표)

 

(1)번 단계에서 읽어 낸 데이터는 CPU 내부의 레지스터에 저장될 뿐이니 이걸 메모리에 기록하지 않으면 사라지게 됩니다. 즉 1섹터 분량의 데이터를 읽어낼 경우 (1)과 (2)를 512번 반복해야 합니다. 효율이 엄청나게 나쁘지요.

 

그래서 생각해낸 것이 DMA입니다. DMA을 사용할 경우 전송을 시작하기 전에 미리 메모리에 512바이트 분량의 읽기 영역을 확보해 두고 이를 DMAC(DMA 컨트롤러)에 가르쳐 줍니다. 그럼 DMAC는 FDD I/F에서 CPU을 거치지 않고 직접 메모리에 데이터를 기록하도록 제어합니다. 기록되는 주소는 차례차례 바뀌니 같은 주소에 데이터를 덮어 쓸 일도 없습니다.

 

9.png

 

DMA에 의한 FDD 데이터 읽기 과정

 

이 DMA을 제어하기 위한 신호선이 DQR(DMA Request)과 DACK(DMA Acknowledge)로, XT 버스의 경우에는 1과 3의 두가지 DMA가 준비돼 있었습니다.

 

 

80286에 맞춰 도입된 16비트 버스 ISA

 

XT 버스는 62핀 커넥터를 사용해 8비트 치고는 비교적 핀 수가 많았습니다. 당시엔 8088을 물려 썼으니 그걸로도 충분했지요. 버스 속도는 CPU에 맞춰 4.77MHz였으나 XT 호환 기종 중에는 6~8MHz로 CPU가 조금 빠르게 작동하는 제품도 있었습니다. 그래서 이러한 호환 기종에 탑재된 XT 버스는 당연히 6Mhz나 8MHz의 속도로 작동했습니다. 당시엔 그런 속도의 차이가 별 문제가 되지 않았지요.

 

상황이 바뀌는 건 IBM PC/AT가 등장하면서부터입니다. IBM PC/AT는 CPU로 i80286을 탑재했으며 사용 가능한 메모리는 16MB, 버스 폭은 16비트로 늘어났습니다. 이에 대응하기 위해 XT 버스와 호환성을 유지하면서 16비트로 확장한 것이 ISA 버스입니다. 

 

10.png

 

ISA 버스의 신호 배치

 

우선 어드레스가 확장됐습니다. 상위 4비트(SA20~SA23)를 추가하는 것이 아니라 상위 7비트(LA17~LA23)를 래치(버퍼)를 통해 제공했습니다. 그림을 보면서 설명하지요. 

 

11.png

 

ISA 버스에서 어드레스 상위/하위 할당

 

하위 어드레스 17비트는 무조건 SA0~17에, 상위 4비트는 무조건 LA20~23로 가며 나머지 17~19비트는 양쪽 어드레스 버스에 신호 전달의 형태가 됩니다. 데이터에선 이렇게 복잡하지 않고 하위 8비트는 계속해서 XT 버스, 상위 8비트가 ISA 버스에서 확장된 쪽에 연결됩니다.

 

다만 IRQ의 확장이 좀 성가십니다. IBM PC나 IBM PC/XT에서는 IRQ 관리에 인텔의 8259 PIC(Programmable Interrupt Controller)라는 칩을 사용했습니다. 최대 8개까지의 IRQ 신호를 관리할 수 있는 칩인데 IBM PC/AT에서는 접속하는 기기가 늘어나면서 부족해진 겁니다. 

 

그래서 IRQ 신호를 총 16개로 늘렸으며 8259을 2개 이용하도록 만들었는데 그 경우 연결은 아래 그림처럼 됩니다. 위쪽 녹색이 IBM PC/XT에서 계승된 것이며 아래쪽의 파란색이 IBM PC/AT에서 확장된 부분입니다.

 

12.png

 

PC/AT에서 IRQ의 할당

 

IBM PC/XT와의 호환성을 유지하기 위해서는 최종적으로 신호선을 하나의 INTR(인터럽트 출력)로 모을 필요가 있었습니다. 그래서 확장된 8259의 IRQ는 INT 2를 같이 사용하는 형태로 구현됐습니다. 이 때 추가된 IRQ는 다음과 같이 할당됩니다.

 

8 RTC( 실시간 클럭) 12 PS/2마우스
9 미사용(IRQ2와 중복) 13 FPU(i80287)
10 범용 14 IDE1
11 범용 15 IDE2

 

ISA 버스에서는 DMA 컨트롤러도 강화됐습니다. 0/5/7의 3종류 DRQ/DACK이 추가돼 총 5개의 DMA전송이 가능해졌습니다.

 

 

CPU의 속도 향상을 따라올 수 없게 된 ISA 버스

 

이 ISA 버스 또한 당시의 CPU와 같은 속도로 움직였습니다. 그래서 처음엔 6MHz, 나중에 8MHz로 고속화됐습니다. 그러나 인텔은 최종적으로 i80286의 속도를 12.5MHz까지 올렸고 뒤이어 AMD의 호환 칩은 25MHz까지 올라갔습니다. 다만 25MHz 버전이 나왔을 때는 전체 시장이 i80386으로 건너가고 있었던지라 이를 탑재한 제품은 거의 없었습니다.

 

그래도 AT 호환기종을 만드는 업체 중에는 12MHz와 16MHz의 i80286을 탑재한 제품이 있었습니다. 그 경우 ISA 버스도 16MHz로 동작하지만 이 정도의 속도 차이가 날 경우 정상 동작하지 않는 ISA 버스 카드가 대량으로 등장하면서 논란을 불러 일으켰습니다.

 

또 CPU가 i80386에서 i80486으로 바뀌면서 기준 클럭이 33MHz~50MHz, CPU의 작동 클럭은 100MHz를 넘겼습니다. 이런 클럭으로 ISA 버스가 작동하는 건 불가능합니다.

 

그런 이유로 해서 베이스 클럭을 기반으로 해 ISA 버스용 클럭 신호를 따로 만들게 됐습니다. 가장 많이 쓰인 건 베이스 클럭 33MHz를 4로 나누거나 25Mhz를 3으로 나눈 8.33MHz입니다. 이것은 최종적으로 EISA에서도 쓰였으며 ISA 버스도 여기에 맞춰 8.33MHz로 작동했습니다.

 

 

ISA 버스의 한계로 PC의 성능이 제약됨

 

앞서 이야기한대로 ISA 버스의 전신인 XT 버스가 나왔을 때만 해도, CPU 버스와 같은 속도로 움직이기에 고속 버스라 할 수 있었습니다. 그러나 1985년의 i80386이 등장한 이후 CPU의 성능이 급속히 올라가면서 버스의 대역폭도 부족하게 됐습니다.

 

예를 들면 i80286의 경우 8MHz로 구동하며 CPU 버스 폭은 16비트라 외부와의 연결 대역이 16MB/s에 불과했습니다. 그런데 i486-33MHz가 되면 33MHz에서 32비트 폭이라 버스 대역이 132MB/s에 도달해 거의 10배로 뛰어오르게 됩니다. 허나 ISA 버스는 33MHz의 1/4인 8.33MHz로 구동하며 버스 폭도 16비트에 지나지 않습니다. 대역폭은  16.7MB/s로 i486의 /18입니다.


게다가 ODP(Over Drive Processor)같은 제품이 등장하면서 CPU 속도는 더욱 올라갔습니다. CPU의 성능 향상 속도를 완벽하게 따라잡는 건 무리라고 해도 성능을 더 올릴 필요는 분명 존재했습니다. 


덧붙여서 ISA 버스 자체는 그리 효율이 좋은 버스가 아니었습니다. 이는 XT 버스의 기준이 된 i8088의 전송 주기 자체가 비교적 한산한 편이라 그렇습니다. 


예를 들면 PCI 등에서 고속 전송에 필수인 버스트 전송 같은 걸 ISA 버스는 전혀 지원하지 않습니다. 또 여러 장치의 Overlapped Transaction(다수의 기기가 동시에 전송함으로써 버스가 비어있는 시간을 줄여 효율을 올리는 방법)등은 물론 제대로 지원하지 않습니다.


그 결과 ISA 버스는 이론적으로 16.7MB/s지만 실제로는 5MB/s 정도만 해도 속도가 잘 나오는 편이 됐습니다. 실제 데이터 전송 속도는 2~3MB/s가 나오는 일도 허다했습니다. 또 위에서 ISA 버스의 고속화 기법으로 IRQ와 DMA을 병용하는 것이 있다고 말했는데, DMA에 따라서는 안 쓰는 게 오히려 빠른 상황도 나오게 됩니다. 


이 부분은 필자의 개인적인 경험인데, 아답텍의 AHA-1542B라는 DMA 버스 마스터 전송 SCSI 카드와 AHA-1522라는 PIO 전송 SCSI 카드로 성능을 비교하면 PIO 카드 쪽의 성능이 훨씬 높게 나옵니다. 당시의 CPU는 인텔 486DX2-66MHz나 486DX4/100MHz 정도 됐을 것입니다. 이 정도 등급의 CPU에선 PIO 전송을 빠르게 하는 게 DMA가 관리해서 버스를 차지하는 것보다 더 빠르다는 소리지요. 이는 DMA에 대한 근본적인 인식을 뒤집는 일입니다.


DMA 전송이 늦은 이유 중 하나는 인텔 8237 DMAC(DMA 컨트롤러)의 능력의 부족해서입니다. 예를 들어 버스 클럭이 8.33MHz일 경우 8237은 절반인 4.165MHz로 동작합니다. 유효 전송 속도는 통상 모드에서 2.78MB/s, Compressed Timing이라는 고속 모드에서도 4.16MB/s에 지나지 않습니다.


이렇게 느린 속도를 해결하기 위해 자체적으로 DMA 컨트롤러를 탑재한 확장 카드도 있습니다. AHA-1542B도 그 대표적인 사례지요. 허나 CPU의 성능이 높아지면서 별도의 DMA 컨트롤러를 사용하는 것보다 CPU가 돌리는 것이 더 빠르다는 현상이 나오게 되버린 것입니다. 요컨데 전체적으로 보면 ISA 버스의 성능이 떨어진 것이 가장 큰 원인입니다.

 

 

ISA의 한계를 돌파한다. EISA의 특징

 

ISA 버스의 한계를 해결하기 위해 (MicroChannel에 맞선다는 의미를 담아) 책정된 것이 EISA며 그게 이어 등장한 것이 VL 버스(베사 로컬 버스)입니다. 아래 그림에서는 VL 버스가 ISA의 조합해서 쓰는 것처럼 보이지만 VL Bus의 스펙을 보면 ISA 버스나 EISA의 컨트롤러와 조합해 동작한다고 써져 있습니다. 실제로 필자가 사용했던 미국 AMI의 Enterprise IV라는 메인보드는 EISA+VL 버스 슬롯 구성을 쓰기도 했습니다.

 

13.png

 

EISA, ISA, VL 버스의 관계

 

EISA에 대해 설명하도록 하겠습니다. EISA는 ISA 버스와 완전 호환을 유지하면서 32비트 어드레스와 32비트 데이터 버스를 확보한 규격입니다. 전기 신호적으로 이를 실현하는 건 그리 어렵지 않지만 기계적인 형태로 유지하기가 어렵습니다. 이걸 실현한 솔루션은 신호 핀을 2층으로 구성한다는 방안이었는데요. 아래 사진은 위가 EISA, 가운데가 ISA, 아래가 두 신호를 합친 것입니다. 

 

14.png

 

EISA의 신호 핀(위), ISA의 신호 핀(가운데), 두개를 합친 것(아래)

 

EISA 카드의 높이는 ISA 버스의 약 1.5배 정도이며 여기에 엇갈리도록 신호 핀을 배치했습니다. 가운데 ISA 버스의  핀 형태를 보면 알 수 있는데 ISA 버스는 신호 핀의 간격이 꽤 큽니다. 그래서 핀 사이에 EISA에서 추가한 핀 배선을 통해서 ISA 신호 핀 아래에 넣고 있습니다. 


핀 곳곳에 Access Key라 불리는 것도 있습니다. 카드 솔롯도 여기에 맞춰 잠금 장치를 넣었습니다. ISA 카드는 이 잠금 장치가 방해되기에 EISA 슬롯에 장착할 수 없지만 EISA 카드는 액세스 키와 딱 맞아 떨어져 장착할 수 있습니다.

 

15.png

 

EISA의 핀 구성

 

EISA 규격은 매우 의욕적인 것이었습니다. 우선 ISA 버스의 신호는 그대로 두면서 어드레스 버스와 데이터 버스를 모두 32비트 폭으로 확장했습니다. 또 탑재한 제품은 거의 없었으나 64비트 규격도 지원하긴 했습니다. 다만 신호 핀이 부족해서 64비트 통신의 경우 어드레스 신호가 줄어드는 형태가 됐습니다.

 

IRQ는 ISA 버스의 IRQ 2~15를 그대로 답습했지만 중요한 개량 사항으로서 다수의 확장 카드가 같은 IRQ를 공유할 수 있는 레벨 트리거를 지원한다는 점을 꼽을 수 있습니다. ISA 버스는 하나의 확장 카드가 하나의 IRQ를 점유하는 엣지 트리거라는 방법을 이용했으나 EISA는 엣지 트리거와 레벨 트리거를 모두 지원합니다.

 

DMA도 확장이 이루어졌습니다. EISA는 DMA 전송 시 버스트 전송을 이용할 수 있게 됐고 메인보드의 DMA 컨트롤러와 확장 카드의 DMA 컨트롤러를 모두 지원합니다. 이러한 확장에 따라 8.33MHz로 동작하며 32비트 폭일 경우 실제 전송 속도는 20MB/s까지 오르게 됩니다. ISA 버스에선 아무리 노력해도 5~6MB/s니까 실질적으로 3~4배로 전송 속도가 높아진 것입니다.

 

EISA의 특징으로는 또 하나 ECU(EISA Configuration Utility)라는 것이 있습니다. ISA 버스 시절에는 어떤 카드가 어떤 IRQ, I/O 포트, DMA 채널을 사용할 것인지를 확장 카드마다 결정하는 경우가 많았으며, 점퍼 핀으로 설정을 변경하는 일도 있었습니다. 그 결과 다수의 카드를 장착하면 이용하는 IRQ가 겹쳐서 작동하지 않는 문제가 자주 일어났습니다. 그 시절 PC를 조립했던 사람이라면 기억하고 있겠지요.

 

EISA의 경우 확장 카드가 이런 설정을 고정된 값으로 사용하는 것이 금지됐으며 모두 ECU을 거쳐 설정을 바꿀 수 있게 됐습니다. 그 결과 ISA버스 시절 자주 일어났던 IRQ, I/O 포트 간섭 문제는 EISA에서 많이 줄었습니다.

 

그래도 그런 문제가 완전히 없어진 건 아니었습니다. 당시 ECU는 항상 정확한 것이 아니었으며 가끔 이유 모를 리소스를 할당해 프로그램에서 디바이스가 보이지 않던 경우가 종종 있었습니다. 또 ECU에서 커버하는 건 어디까지나 EISA 디바이스이며 ISA 디바이스가 리소스를 점유하는 건 막지 못했기에 근본적인 해결책은 되지 않았습니다.

 

 

비싼데다 성능까지 떨어져 보급되지 않았던 EISA

 

이렇게 많은 장점을 갖춘 EISA가 왜 유행하지 못했을까요? 그건 가격도 비싼데다 결코 높다고 할 수 없는 성능이 원인이었습니다.

 

ISA 버스에 비해 크게 복잡해진 버스가 되면서 EISA는 오직 워크스테이션과 서버 등급의 제품에만 쓰이게 됐습니다. 간혹 PC용으로 EISA를 탑재한 메인보드가 출시되기도 했으나, 스펙을 잘 보면 EISA의 규격을 100% 충족시키지 못하는 EISA인 경우도 많아, 여기에 EISA 카드를 꽂으면 ISA로 작동하는 경우도 있었습니다.

 

판매량이 많지 않으면 가격이 비쌀 수밖에 없습니다. 가격은 끝까지 떨어지지 않았지요. 성능도 ISA와의 호환성을 유지하기 위해 버스의 클럭을 8.33MHz 이상으로 높이지 않았고 EISA 대응 디바이스도 별로 나오지 않다보니 이쯤 되니 그냥 ISA와 다를 것이 없었습니다. 대역 부족은 여전히 따라다닌 셈. 

 

EISA 대응 디바이스는 ISA에 비해 빠르다고는 해도 실제 성능이 20MB/s니 엄청나게 빠르다고 할 순 없었습니다. 이후에 등장한 베사 로컬 버스는 33MHz/32비트에서 이론적으로 132MB/s, 실제 전송 속도도 30-40MB/s 가까이 나다보니 초라한 수준이었지요. 그래서 서버용으로는 계속 쓰였으나 PC용으로는 EISA가 거의 보급되지 않았습니다.

 

 

486 시대에 보급된 VL 버스의 등장

 

대신 등장한 VL 버스, 베사 로컬 버스입니다. 구조는 아래 그림과 같습니다. ISA 버스와 별도로 어드레스/데이터 버스를 제공하는 구조입니다.

 

16.png

 

VL 버스의 핀 구성

 

VL 버스의 베이스가 되는 건 인텔 486의 CP의 신호선인데요. 인텔 486의 경우 데이터는 반드시 32비트로 출력되는 구조입니다. 만약 1바이트 분량을 출력할 경우 BE(Byte Enable)라는 신호를 사용해 32비트의 신호 중 어느 비트가 유효한 것인지를 지시합니다. 이것은 그대로 VL 버스에서 쓰이게 됩니다.

 

또 486 자신이 버스트 전송을 지원하고 있다보니 VL 버스도 버스트 전송을 지원합니다. 한편 VL 버스 그 자체는 DMA와 IRQ의 신호선을 가지지 않기에(왠지 모르겠으나 IRQ 9만 추가됨) 이들을 제어하는 데엔 ISA 버스가 EISA의 신호를 그대로 사용하게 됩니다.

 

VL 버스는 가급적 빠르게 표준화해서 제품을 출시하자는 것이 목적이라 별로 정교한 버스는 아닙니다. 단적으로 말하면 버스 조정 자체는 ISA 버스나 EISA로 하되 한번 버스 사용 권한을 쥐면 통신은 VL 버스에서 하는 것입니다. 통신이 끝나면 ISA/EISA를 거쳐 버스를 개방하는 식입니다. 이렇게 간단한 구조와 신호 속도도 빠르다보니 보급 속도가 꽤 빠른 편이었습니다.

 

 

안정성의 부족. VL 버스의 수명을 단축시키다

 

다만 이 간단한 스펙이 거꾸로 VL 버스의 치명적인 단점이 됐습니다. VL 버스의 수명을 단축시킨 건 안정성의 부족이었습니다. VL 버스는 버스 버퍼가 있긴 하지만 확장 카드가 CPU에 그대로 이어지는 형태입니다. 문제는 CPU가 다수의 디바이스를 구동할 만한 원동력이 없다는 것.

 

일단 VL 버스의 스펙을 보면 최대 3개의 VL 버스 슬롯을 쓸 수 있다고 하면서 다음과 같은 가이드라인을 권장했습니다.

 

버스 클럭 버퍼가 없을때 버퍼가 있을때
33MHz 이하 슬롯 2개/디바이스 2개 슬롯 3개/디바이스 3개
40MHz 슬롯 1개/디바이스 2개 권장하지 않음
50MHz 이상 슬롯 없이/디바이스 2개 권장하지 않음

 

50MHz 이상에서 슬롯이 없고 디바이스가 2개라는 건, VL 버스를 메인보드에 2개 탑재할 수 있으나 VL 버스 슬롯을 거치는 것이 아니라 직접 구현하라는 이야기입니다.

 

그러나 실제 제품을 보면 버퍼 없이 40MHz로 구동하면서 슬롯이 3개라던가, 50MHz로 구동하며 슬롯이 2개가 나오는 등, 권장 가이드 라인을 지키지 않는 제품이 산더미처럼 등장했습니다. 또 실제로 33MHz로 움직일 경우에도 첫번째 VL 버스 카드(대게는 그래픽카드)는 잘 작동하지만 두번째(SCSI 카드나 IDE 카드)는 장착하는 순간에 작동하지 않거나 움직임이 이상하는 경우가 흔했습니다.

 

또 앞서 언급했던대로 486에서 펜티엄으로 시장이 바뀌면서 CPU에서 64비트 폭으로 데이터가 나오게 됐습니다. 그래서 VL 버스는 도중에 칩셋을 통해서 64비트와 32비트를 변환할 필요가 생겼습니다. 이쯤 되니 CPU에 직결하던 486 시절과 비교해서 오버헤드가 늘어나 성능이 줄어들게 됐습니다.

 

이런 문제는 규격화 업체 단체인 VESA가 엄격하게 스펙을 책정하고 그걸 제품 제조사에 강제하면 바뀔 수 있습니다. 그럼 안정성이 개선되고 VL 버스의 수명이 다소 늘어났을 수 있습니다.

 

하지만 그랬을 경우 VL 버스가 보급되지 않았을 가능성도 있습니다. 이것은 EISA를 보면 알 수 있는 것인데 스펙을 엄격하게 지키다보니 보급되지 않았었지요. 그래서 일부러 스펙을 엄격하게 제시하지 않았을 가능성도 있습니다. 어쨌던 간에 EISA와 VL 버스는 결국 PCI로 대체됩니다.

 

 

인텔이 주도해서 만들어진 PCI 버스. 규격화 시기도 상품 전략에 좌우됨

 

17.png

 

PCI의 탄생부터 AGP~PCI-X까지의 버스 규격 로드맵 

 

앞서 설명했던 대로 EISA는 당초 기대했던 것만큼 보급되지 않았으며 성능도 부족했습니다. 반면 베사 로컬 버스는 어느 정도 보급되고 성능도 높았으나 안정성이 현저히 떨어져 오랬동안 사용하기 어려운 상황이었습니다. 더군다나 이렇게 될 가능성은 처음부터 어느 정도 예상됐던 것이지요.

 

인텔은 여기에 대비해서 1990년부터 ADL(Architecture Development Lab. 나중에 Intel Architecture Lab로 이름을 변경)에서 새로운 버스를 개발해 1991년에 Local Glueless Bus란 이름으로 업계에 제안했습니다. Microchannel(MCA)의 실패를 목격했던지라 인텔은 Local Glueless Bus를 특허와 라이선스로 보호하지 않고 업계 표준 규격으로서 제안했습니다.

 

PCI 규격화를 위해 1992년에 설립된 것이 PCI-SIG(Peripheral Component Interconnect Special Interest Group)입니다. 이후 표준화 작업은 PCI-SIG로 이관되어 인텔 뿐만 아니라 주요 업계가 모두 참여해 스펙 책정을 진행하게 됩니다. 

 

그 첫 성과가 1992년 6월에 책정된 PCI Local Bus Revision 1.0입니다. 흔히들 PCI 버스라고 표기하지만 정식 명칭은 최종 버전인 리비전 3.0까지 모두 PCI 로컬 버스라 씁니다.

 

PCI 1.0의 경우 발표 시점에선 아직 메인보드의 내부 버스, 즉 칩셋과 주변 회로를 연결하는 버스로만 이용할 수 있었고 확장 카드의 스펙은 전혀 정해지지 않았습니다. 이것이 정해지는 건 1993년에 나오는 리비전 2.0 부터 입니다. 그래봤자 10개월 정도 차이니 기다리면 됐을 거라고 생각할 수 있겠으나, 당시 사정은 제품 동향에 밀접한 관계가 있었습니다.

 

인텔은 1993년 3월에 PCI를 지원하는 최초의 칩셋인 Intel 430LX를 발표했습니다. 허나 만약 PCI의 책정이 1993년 4월에서야 이루어졌다면 이 칩셋의 출시는 늦어졌을 것입니다. 물론 430LX는 PCI 2.0에서 책정된 것과 비슷한 확장 슬롯을 탑재하고 있었으며, 버스 프로토콜도 일단 PCI 2.0에 꽤 가까운 것이었습니다. 그래도 430LX 자체는 리비전 1.0에 준거한 PCI 버스를 탑재한 것인지라, 실제로 1993년~1994년에 시장에 출시된 PCI 확장 카드 중에선 동작하지 않는 것도 있었습니다. 이건 어쩔 수 없지요.

 

앞서 주요 업계가 함께 책정했다고는 해도 그 중 가장 존재감이 큰 건 인텔일 수밖에 없습니다. 또 표준화 책정 작업에 대한 기여도도 가장 크니, 결과적으로 인텔 칩셋에 맞춘 표준화를 서두른 것이라 해도 무리는 아닙니다.

 

 

신호 전압은 5V와 3.3V가 공존

 

PCI 버스에 대해 간단히 복습해 봅시다. 우선 버스의 형식은 ISA나 EISA처럼 공유 버스 방식의 병렬 전송입니다. PCI 1.0의 스펙은 32비트의 버스 폭에 어드레스 스페이스도 32비트로 속도는 최고 33MHz입니다. 최저는 0이니까 33MHz 이하면 뭐든지 상관 없다는 이야기다 됩니다. 실제로 초기 제품 중에는 25MHz로 구동하는 것도 있었습니다.

 

신호 전압은 5V와 3.3V를 지원합니다. 확장 슬롯이 규정되지 않은 1.0 시점에서는 내장 디바이스 뿐이었으니 그것도 상관 없었습니다. 그러나 리비전 2.0에서 확장 슬롯이 정의되면서 혼란을 피하기 위해 신호 전압을 슬롯이나 카드 테두리의 형태로 구분할 수 있도록 만들었습니다.

 

18.png

 

PCI 슬롯의 서포트 신호에 의한 형상 차이

 

19.png

 

PCI 확장 카드의 형상 차이

 

슬롯은 위 그림대로 메인보드가 어느 신호를 지원하는지에 따라 형태가 다릅니다. 이에 대응하는 확장 카드의 테두리도 다릅니다. 당시의 확장 카드를 보면 5V 전용 카드와 두가지를 모두 지원하는 카드가 많이 뒤섞여 있습니다. 2000년까지는 5V만 지원하는 카드가 압도적으로 많았으나 시간이 지나면서 두가지를 지원하는 제품이 많이 늘었습니다.

 

20.jpg

 

PCI 그래픽카드의 예. 5V 전용인 매트록스 미스틱 220.

 

21.jpg

 

5V와 3.3V를 모두 지원하는 매트록스 G450 PCI(좌우가 반대임에 주의하세요)

 

발표 초기엔 확장 카드를 쓸 수 없었으나 1993년에 리비전 2.0이 등장하면서 확장 카드를 지원했고, 또 32비트에 더해 64비트도 추가됐습니다. 이것은 EISA 시절과 달리 물리적으로 슬롯의 길이가 길어지도록 만들었습니다(XT 버스에서 ISA 버스로의 전환과 가까움). 버스 폭이 64비트가 되면서 64비트 어드레스도 정의됐습니다.

 

이 PCI 2.0에 66MHz 전송 모드를 추가한 것이 1995년 6월에 발매된 리비전 2.1입니다. 이 리비전 2.1은 큰 인기를 거둔 인텔의 440BX 칩셋에서 구현된 것이기도 한지라 그만큼 널리 보급됐습니다. 이때부터 확장 카드는 ISA 대신 PCI을 쓰기 시작했으며 보급에도 한몫 한 리비전이기도 합니다. 이 2.1에서는 Delayed Transaction이라 불리는 전송 효율 향상의 매커니즘 외에 PCI 브릿지의 정의 등도 추가됐습니다. 

 

리비전 2.2는 1998년 12월에 발매됐는데 리비전 2.1에 비해 큰 변화는 없습니다. 주요 변경점은 ECN(Engineering Change Notification)이라 불리는 에러 수정이나 스펙 변경과 함께 MSI(Message Signaled Interrupt)라 불리는 인터럽트 통지 기능의 추가가 주요 차이점입니다.

 

리비전 2.3은 2002년 3월에 발표됐습니다. 이는 리비전 3.0으로 이행하기 위한 전 단계라 할 수 있습니다. 리비전 3.0의 주요 특징은 5V Signaling의 폐지입니다. 이로서 리비전 2.3에선 5V 확장 카드의 지원이 사라지게 됐습니다. 5V/3.3V를 모두 지원하는 카드를 쓸 수 있으며, 실제로는 5V에서 신호 교환도 가능하지만 강제로 5V 카드를 배제해 3.3V로 이행을 진행하는 것이었습니다.

 

그리고 2004년 4월에는 PCI의 최종판인 리비전 3.0이 등장해, 확장 카드 뿐만 아니라 온보드 디바이스에서도 5V의 지원을 폐지하게 됩니다.

 

 

PCI를 넘어서는 2개의 규격. AGP와 PCI-X

 

이렇게 발전해온 PCI를 확장하는 버스 규격은 2가지가 있습니다. 하나는 AGP입니다. PCI 2.1을 기준으로 2배속 전송을 지원하는 등 성능을 강화하는 것이 목적입니다. 다만 AGP는 원칙적으로 그래픽카드 한장만 접속하면 되는 것이기에 몇가지 기능이 빠져 있습니다.

 

이 AGP 1.0을 더욱 빠르게 만들기 위해 신호 전압을 1.5V로 떨어뜨리고 4배속 전송 모드를 추가한 것이 1998년 5월에 발표된 AGP 2.0입니다. 속칭 AGP 4X라 부르는 게 바로 이 AGP 2.0입니다. 2002년 9월에는 신호 전압을 0.8V로 낮추고 8배속 모드를 추가한  AGP 3.0이 출시됩니다. AGP 3.0에서는 1x(66MHz)와 2x(133MHz)의 전송 모드가 생략됐으며 4x(266MHz)및 8x(533MHz)만 지원했습니다.

 

무엇보다 AGP는 앞서 말한대로 3D 그래픽 카드가 텍스처 데이터를 메인 메모리에서 비디오 메모리로 빠르게 전송하자는 목적으로 만들어진 것입니다. 버스의 구조도 이에 맞춰 최적화됐으며 소프트웨어도 GART(Graphics Address Remapping Table) 드라이버를 사용하는 것이 전제로 깔린지라 범용으로 쓰긴 어렵습니다.

 

서버 등의 분야에서는 PCI로는 대역폭이 부족한 상황이 종종 나온지라 1999년 9월에 PCI-X가 제정됩니다. 로드맵에선 32/64비트라 표기됐지만 이는 단순히 32비트와의 호환성도 유지한다는 이야기며, 기본적으로는 64비트 폭의 버스를 전제로 하고 있습니다. 신호 전압은 3.3V만 지원하며 100MHz와 133Mhz의 신호 전송이 가능합니다.

 

하지만 그만큼 동시에 쓸 수 있는 확장 슬롯의 수는 줄어들게 됩니다. 33MHz의 PCI 버스인 경우 최대 15개의 디바이스나 확장 슬롯을 7개까지 접속 가능하며 실제로 이 한계에 도달하는 구성을 쓰는 제품도 존재합니다. 그러나 PCI-X는 슬롯 수가 그보다 줄어듭니다. PCI-X의 스펙을 보면 최대 슬롯 수를 명확하게 정의하진 않았으나 실제 칩셋의 스펙을 보면 한개의 세그먼트에서 66MHz는 4슬롯, 133Mhz는 1슬롯이 가능합니다.

 

세그먼트가 뭐냐면 일종의 버스 관리 단위입니다. 예를 들어 아래 그림에서 왼쪽은 최소 구성을 나타냅니다. 칩셋에서 PCI-X가 나와 여기에 4개의 슬롯이 연결돼 하나의 세그먼트를 구성합니다.

 

22.png

 

PCI-X에서 세그먼트의 구성

 

확장 슬롯이 풍부한 대규모 시스템을 구축할 경우엔 그림 오른족에 나온대로 칩셋에서 나온 PCI-X 슬롯 힌호에 브릿지 칩을 연결할 수 있습니다. 이 그림에선 최대 8개를 구성했는데 칩셋과 브릿지, 브릿지의 끝은 저마다 독립된 세그먼트로 관리됩니다.

 

사실 PCI-X 뿐만 아니라 PCI나 AGP도 세그먼트를 사용하여 대규모 시스템을 구축할 수 있습니다. 그러나 AGP는 여러 슬롯을 쓰는 일은 없었습니다. PCI는 기판에 PCI 브릿지를 장착하고 거기에 여러 PCI 디바이스를 탑재하는 멀티 펑션 카드로 자주 쓰였습니다.

 

23.png

 

AGP 3.0 Interface Specification의 Appendix B, Figure 5-1에서 발췌. Workstation Programming Model이란 부분에서 이런 구성의 시스템을 전제로 두고 어떻게 프로그래밍하는지를 설명하고 있습니다.

 

로드맵으로 되돌아가서 2002년 7월에는 PCI-X 2.0이 나왔습니다. PCI-X 2.0에서는 Mode 1과 Mode 2라는 2가지 동작 모드가 정의됐는데요. Mode 1은 PCI-X 1.0과 같은 동작 모드로서 Mode 2는 신호 전압을 1.5V로 낮추고 전송 속도를 2배인 266/533MHz로 더욱 빠른 전송이 가능해졌습니다. 3.3V로 266/533MHz 구동은 무리였던 듯 합니다.

 

PCI-X 2.0가 나왔을 땐 차세대 규격인 PCI Express 리비전 1.0이 이미 발표된 시기이기도 한지라, 처음부터 PCI-X 2.0은 PCI 익스프레스로 건너가기 위한 과도기적인 제품이라 할 수 있었습니다.

 

PCI-SIG에서 PCI-X 2.0 Electrical Subgroup의 의장을 지낸 드와이트 아이젠 D 라일리는 2002년에 "이미 서버 등의 분야에서 PCI-X는 널리 쓰이고 있으며 고객이 많은 투자를 하고 있습니다. 이를 바로 PCI-E로 바꾸는 건 고객의 투자 보호 차원에서 바람직하지 않습니다"고 말해 PCI-X 2.0은 처음부터 PCI-E에 브릿지를 통해 접속되는 형태를 생각했다고 설명했습니다.

 

칩셋에서 바로 PCI-X 2.0이 나온 제품도 있었습니다. 그러나 실제로 쓰인 제품은 칩셋에서 우선 PCI-E가 나오고 거기에 PCI Express/PCI-X 2.0브릿지 칩을 연결해 PCI-X 2.0 슬롯이 나오는 형태였습니다.

 

이렇게 PCI는 1992년에 스펙이 책정된 후 20년 가까이 쓰였는데요. 그 단점은 PCI-E가 나올 때쯤 두드러지게 됐습니다.

 

처음부터 공유형 버스인지라 여러 디바이스가 동시에 통신할 수 없으며(Delayed Transaction이나 PCI-X에서 탑재된 Split Transaction 같은 방법으로 효율을 높일 수 있지만, 말 그대로 동시 통신은 못합니다) 통신 자체도 송신과 수신을 동시에 할 수 없는데다, 전송 속도도 이론 최대 값이 133MB/s(32비트/33MHz의 PCI)에서 1GB/s(64비트/533MHz의 PCI-X 2.0)정도였습니다. 실제 속도는 대체로 절반 정도니 20년 전에는 몰라도 지금 보면 빠르진 않았지요.

 

또 병렬 버스라서 배선도 많았습니다. PC에서는 쓸법하지만 핸드폰에서는 배선이 차지하는 면적이 너무 컸습니다.

 

다행이도 후속작인 PCI-E는 순조롭게 보급됐습니다. 지금은 PCI 솔롯이 빠진 메인보드도 당연해졌지요. 이번에는 PCI-E에 대해 설명하도록 하겠습니다.

 

 

PCI와 마찬가지로 인텔이 만들어낸 PCI-Express

 

24.png

 

PCI-E와 관련 규격의 로드맵

 

PCI-E도 PCI와 마찬가지로 처음엔 인텔이 3GIO(3rd Generation I/O)라는 코드명으로 개발한 규격입니다. 이것으로 어느 정도 윤곽이 잡히고 나서 표준화 단체인 PCI-SIG에서 표준화 작업을 진행했습니다. 최종적으로 이 규격이 PCI Express로 명명돼 2002년 7월에 Base Specification Revision 1.0이 출시됐습니다.

 

Base Specification은 PCI Express의 기본이 되는 스펙입니다. 여기서 기본이라고 이야기하는 이유는 스펙이 여러가지 있어 그렇습니다. Base Specification 1.0과 동시에 CEM (Card Electromechanical) Specification 1.0라는 스펙이 출시됐습니다.

 

CEM은 이름 그대로 PCI Express를 사용한 확장 카드의 물리/기계적인 스펙과 거기에 흐르는 신호의 전기적인 스펙을 정한 것입니다. 반대로 말하면 Base Specification에서 전기적인 스펙은 별로 들어 있지 않았습니다(기본적인 스펙만 정해짐). 오히려 전기적 스펙의 상위에 위치해 신호층과 논리 계층/트랜젝션 층의 스펙이 주요 내용을 이루고 있습니다.

 

추가된 스펙은 또 있습니다. Cabling나 Express Card, PCI Express Mini Card 도 여기에 포함됩니다. 로드맵에선 생략됐지만 Compliance/Test에 대한 스펙도 Base Specification에는 포함되지 않았습니다. 이는 당초부터 PCI Express가 매우 넓은 범위에서 이용되는 것을 상정하고 있어 Base Specification에 다 담아 버리면 복접하게 개정이 필요해서 그렇게 한 것입니다.

 

PCI-E는 기본적으로 아래 3가지가 주요 특징이라 할 수 있습니다.

 

(1)Point to Point의 이중 통신

(2)디퍼런셜 전송

(3)Embedded Clock에 의한 시리얼 버스

 

우선 이중 통신입니다. 기존의 PCI나 PCI-X/AGP는 하나의 버스에 모든 디바이스가 연결됩니다. 반면 PCI Express에서는 Root Complex와 각각의 디바이스가 모두 독립된 배선으로 접속됩니다. 여기서 확장성이 부족할 경우엔 PCI Express 스위치를 통해 여러 디바이스를 연결하는 방식입니다.

 

25.png

 

PCI와 PCI-E의 디바이스 연결 차이

 

이 PCI Express 스위치를 사용한 유명한 사례가 ASUSTeK의 콤보 인터페이스 카드인 U3S6입니다. U3S6은 미국 PLX Technology의 PEX8613라는 PCI Express Gen2(2.x세대) 4레인×3스위치 끝에 마벨 SATA 컨트롤러와 NEC의 USB 3.0 컨트롤러를 연결했습니다. 레인 수가 적을 경우 이러한 스위치를 사용해 자유롭게 디바이스 수를 늘리기에, PCI와 비교해도 사용할 수 있는 디바이스 수에 부족함이 없다는 게 특징입니다.

 

26.png

 

ASUSTeK US36에서 PCI-E 스위치를 사용한 방법

 

디퍼런셜 전송은 일종의 고속화 기술입니다. PCI는 공유 버스라 디퍼런셜 전송은 쓰지 못하고 싱글 엔 데드 전송으로 구성됩니다. 그러나 이것은 속도를 높이기 어렵다는 단점이 있습니다.

 

한편 PCI Express는 Point to Point 접속 방식이라서 디퍼런셜 전송을 써도 문제가 없으며, 처음부터 2.5GT/s(Giga Transfer/s)까지 속도를 끌어올리는 데 성공했습니다. PCI는 표준에서 33MHz, PCI-X 2.0에서도 최고 533MHz니 단순 계산해도 5~75배 빨라진 것입니다.

 

 

PCI-E에서 도입된 임베디드 클럭은?

 

Embedded Clock에 의한 시리얼 버스야말로 가장 새로운 특징이라 할 수 있겠습니다. PCI 같은 기존의 공유 버스는 아래와 같은 구성을 씁니다. 데이터 신호와 별도로 클럭 신호가 출력되며 데이터는 이 클럭 신호에 동기화하는 형태로 출력됩니다.

 

27.png

 

PCI의 배선 구조

 

이들 신호는 같은 타이밍에 나와 같은 타이밍에 받지 않으면 안 됩니다. 그래서 필연적으로 길이가 같은 배선이 필요하며 결과적으로 DDR2-SDRAM이나 DDR3-SDRAM 같은 배선은 쓸 수 없습니다. 그래서 PCI Express에서는 Embedded Clock이라는 방식을 채용했다. 아래 그림이 그 구조입니다.

 

28.png

 

PCI-E의 기본적인 배선 구조

 

먼저 보내려는 데이터를 클럭 신호와 함께 멀티 플렉서(Multi-plexer)에 입력해 데이터와 클럭 신호를 혼합시킵니다. 혼합된 데이터는 디퍼런셜-차등 전송 방식으로 전송됩니다. 받은 쪽은 그 데이터를 Demulti-plexer에서 분해해 데이터와 클럭 신호를 분리시켜 각각 받습니다.

 

그리고 이 신호의 혼합/분리에는 8b/10b 인코딩이라 불리는 방법이 쓰입니다. 이것은 8비트 분량의 소스 데이터에 클럭 신호를 섞어 10비트 데이터를 만드는 것입니다. 앞서 PCI-E 신호 속도에 GT/s라 표기한 건 그 때문입니다.


PCI Express의 경우 Gen1(1.x세대)에서는 2.5GT/s, Gen2에서는 5GT/s의 속도로 신호가 전송되지만 이 신호와 Clock 신호를 혼합한 10비트 통계가 어느 정도의 속도로 전송되는지를 나타냅니다. 그래서 2.5GT/s의 실제 데이터 전송 속도는 다음과 같습니다.

 

2.5×(8÷10)=2Gbps=250MB/초

 

만일 2.5GT/s에서 데이터를 100% 보내면 2.5Gbps=312.5MB/s로 보낼 수 있다는 계산이 나오는데 이 차이가 Embedded Clock의 몫입니다. 덧붙여서 PCI-SIG가 전송 속도를 표기할 때 GHz와 Gbps, MB/s 등을 사용하지 않고 GT/s의 단위를 쓰는 것은 2.5GHz로 표기하면 마치 2.5Gbps=312.5MB/s의 데이터 통신을 할 수 있다고 오해 받기 쉬우므로 그것을 막기 위해서라고 합니다.

 

이러한 구조에 따라 PCI Express에서는 1레인 당 4개의 신호선(상/하행 각 2개)으로 한쪽에서 250MB/s의 대역을 확보하게 되었습니다. PCI가 신호+어드레스만 60개 이상의 신호선이 필요한 것에 비해 배선 수가 대폭 줄어들고 성능 향상이 실현된 셈입니다. 엄밀히 말하면 PCI Express의 경우 주소와 데이터, 더 다양한 제어 신호도 다 같은 2쌍의 신호선을 시간 순서대로 다중으로 보내기에 여기에 따른 오버헤드를 줄일 필요가 있습니다.

 

한편으로 PCI에서는 송/수신이 같은 버스를 공유하기에 이 정도의 오버 헤드를 감안하면 PCI Express에서는 두배 이상 대역을 이용할 수 있게 됩니다. 더구나 그래픽 카드로 쓸 때는 250MB/s의 대역도 아직 부족한 편이라, 동시에 4/8/16/32개의 신호선을 묶은 형태의 접속도 동시에 정의됐습니다. 일반적으로 이를 x4/x8/x16/x32로 표기하고 있습니다.

 

 

보급이 느렸던 PCI-E 3.0

 

로드맵으로 돌아갑시다. Revision 1.0은 2002년 7월에 발매됐지만 여기에 몇가지 치명적인 문제가 있어, 이걸 그대로 따라 하면 통신을 제대로 할 수 없게 됐습니다. 그래서 이를 수정한 것이 2003년 4월에 등장한 리비전 1.0a입니다. 여러 ECN(Engineering Change Notice기술 변경 통보)를 포함한 리비전 1.1이 등장했습니다.

 

2006년 3월에는 큰 업데이트가 있었습니다. 2.5GT/s에서 5GT/s의 전송 속도를 내는 리비전 2.0이 등장한 것입니다. 게속해서 2009년 3월에 등장한 리비전 2.1은 그래픽 카드를 GPGPU 가속기로 사용할 때 성능을 향상해줄 매커니즘을 옵션으로 추가하는 ECN을 추가하는 등 큰 폭의 스펙 확장이 이루어졌습니다. 처음에 이 스펙 확장은 나중에 이야기할 가상화처럼 별도의 스펙이 될 에정이었으나 최종적으로 Base Specification에 포함됩니다.

 

PCI Express의 최신 Base Specification은 2010년 11월에 발매된 리비전 3.0입니다. 여기에서는 드디어 신호 속도가 8GT/s까지 높아졌습니다. 그러나 리비전 3.0에선 애시당초 10GT/s를 노리고 있었습니다. 5GT/s의 2배라는 단순한 발상이었으나 실제로 10GT/s를 내리면 신호 보정이나 기판 실장에 많은 어려움이 있다(할 수는 있으나 비쌈) 고 판단됐습니다. 그래서 신호 속도를 1.6배 8GT/s로 떨어뜨린 것입니다.

 

그것만으로는 성능이 1.6배 밖에 되지 않기에 리비전 1.x~2.x에서 쓰인 8b/10b 인코딩을 포기하고 대신 128b/130b 인코딩을 채용했습니다. 이 경우 8GT/s의 실제 전송 속도는 8×(128÷130)≒ 7.88Gbps로 4Gbps가 나옵니다. 리비전 2.x의 거의 2배에 댈하는 대역을 이용할 수 있는 셈입니다.

 

다만 이 8GT/s의 PHY는 인코딩 방식을 바꾸면서 기존의 리비전 1.x/2.x와 호환성이 유지되지 않았습니다. 그래서 리비전 3.0에 준거한 디바이스는 아래 그림처럼 8GT/s에 대응하는 물리 층과 2.5, 5GT/s에 대응하는 물리층을 모두 내장해 실제 통신에 따라 바꾸는 것이 필요합니다.

 

29.png

 

리비전 3.0의 호환성 확보 구조. 8GT/s로 2.5.5GT/s를 바꿔 통신

 

이 리비전 3.0은 채용 제품의 출시가 전례 없을 정도로 느렸습니다. 리비전 1.0/2.0 때는 스펙이 책정되기 전부터 인텔이 검증용 플랫폼을 회원 기업에 제공하고 있었습니다. 또 그래픽카드 제조사도 시제품에 일찌감치 PCI-E 대응 GPU를 발표하는 등의 필드 테스트를 거치면서, 스펙 책정과 거의 같은 시기에 제품이 도입됐습니다.

 

그러나 리비전 3.0에서는 제품을 그대로 검증용으로 사용한다는 방침을 인텔이 내놓았습니다. 그 결과 아이비브릿지의 샘플이 나오기 전까진 검증용 플랫폼이 많지 않은 상황이 되버려서 보급이 그만큼 늦어지게 됐습니다.

 

재밌는 건 오히려 PCI-E 스위치를 제조하는 회사가 리비전 3.0의 보급에 열중했다는 것입니다. 그래서 이들 제품이 먼저 시장에 출시되고 있는데, 스위치가 있다 한들 호스트 측(칩셋)과 디바이스가 대응하지 않으면 의미가 없습니다. 이 호스트 및 디바이스의 대응이 따라가야 하다 보니 본격적인 보급은 2013년에나 되서야 시작됐습니다.

 

 

가상화 관련 보충 규격을 준비. 보급은 아직

 

여기까지가 Base Specification을 중심으로 한 로드맵인데 이를 보완하기 위해 2007년 3월에 Address Translation Services 1.0 specification(ATS 1.0)이 발매됐습니다. 이는 AMD라면 IOMMU, 인텔은 VT-d로 장착된 가상 환경에서 I/O 디바이스의 액세스를 빠르게 만들기 위한 기법입니다.

 

이를 한단계 진행해서 디바이스 자체를 가상화에 지원하기 위한 스펙이 2007년 11월에 등장한 Single Root I/O Virtualization and Sharing 1.0 Specification(SR-IOV 1.0)입니다. 이것은 하나의 머신에서 다수의 가상 머신이 동작할 때 I/O에 저마다 접속하는 환경을 정한 규격으로, 각각의 디바이스가 가상화를 지원하고 다수의 가상 머신과 통신하기 위한 스펙을 정한 것입니다.

 

2008년 5월에 발매된 Multi-Root I/O Virtualization and Sharing 1.0 Specification(MR-IOV)는 더욱 이를 진화시킨 규격입니다. MR-IOV는 아래 그림처럼 다수의 시스템(블레이드 서버)와 디바이스를 접속해 시스템 사이에 공용한다는 개념입니다.

 

30.png

 

MR-IOV의 개념도. 위쪽이 각 시스템, 아래쪽의 디바이스를 공유

 

ATS는 윈도우 7의 가상 PC 등에서 효과를 볼 수 있기에 개인 사용자에게도 도움이 됩니다. 허나 SR-IOV는 디바이스와 디바이스 드라이버가 가상화에 대응할 필요가 있고, MR-IOV는 PCI Express 스위치도 전용 제품이 필요합니다. 사용 용도가 완전히 하이엔드 시스템을 위한 것이다보니 보급이 많이 이루어지진 않았습니다.

 

 

카드에 케이블을 연결해 전력을 공급하는 것도 규격화

 

마지막으로 이름만 나왔던 CEM에 대해서도 짚고 넘어가겠습니다. CEM도 기본적으로는 Base Specification에 맞춰 리비전을 높였는데 현 시점에서 최종본은 CEM 2.0입니다. PCI-E에선 호환성을 중시해 전기적 특성은 PCI보다 차이가 적으며 순수하게 커넥터의 기계적 형태에 대한 수정 등이 주요 변화입니다. 그래서 8GT/s의 리비전 3.0에서도 CEM 2.0을 이용합니다.

 

이 CEM 2.0을 바탕으로 2007년 2월에는 케이블 접속을 위한 PCI Express External Cabling 1.0 Specification가 책정됐습니다. 사실 이 Cabling은 리비전 1.0의 시점부터 스펙 책정이 시작됐었습니다. 그러나 그 때 다음번에 나올 Base Specification에선 5GT/s가 된다는 점이 알려졌기에 스펙 책정부터 5GT/s를 목표로 스펙 책정이 진행됐습니다. 그 결과 CEM 2.0의 완성을 기다리고 Cabling 1.0이 책정된 셈입니다.

 

CEM의 경우 소비 전력의 확장 스펙이 있습니다. PCI Express 자신은 3.3V/3A와 12V/5.5A의 총 75W가 최대 공급 전력이 됩니다. 그러나 이건 x16의 경우이며 x1에서는 12V/0.5A니 총 10W, x4/x8에서는 12V/2.1A의 25W로 제한돼 있습니다.

 

실제로는 이 75W로는 부족한 확장 카드가 있기에 2004년 10월에 추가 책정된 것이 PCI Express x16 Graphics 150W-ATX Specification 1.0입니다. 여기에 따라 추가 6핀 커넥터를 통해 75W를 더 공급해 총 150W까지 사용할 수 있게 됐습니다. 허나 이것도 부족한지라 2008년 3월에 책정된 것이 PCI Express 225W/300W High Power Card Electromechanical Specification 1.0입니다. 여기에는 8핀 전원 커넥터도 정의됐습니다.

  • 6 핀×1 최대 150W
  • 6 핀×2 최대 225W
  • 6 핀+8 핀 최대 300W

이 스펙을 보면 6 핀×3이나 8 핀×2은 없으며 그건 제조사가 독자적으로 추진하는 스펙입니다. 그런 독자 스펙에 대해 PCI-SIG에 문의한 결과 "그런 하이엔드 제품은 매우 한정돼 있으며 일반적으로는 300W만으로초 둥분합니다. 스펙을 더 확장할 생각도 없고, 한정된 제품이 독자적으로 확장하더라도 그것이 일반적이라고는 할 수 없으니 뭐라 말할 생각도 없습니다."라 답했습니다. 그런 이유로 이쪽에서 후속 규격이 등장할 가능성은 낮습니다. 

 

소스:
http://ascii.jp/elem/000/000/612/612130/
http://ascii.jp/elem/000/000/613/613783/
http://ascii.jp/elem/000/000/615/615281/
http://ascii.jp/elem/000/000/615/615281/
http://ascii.jp/elem/000/000/618/618492/
http://ascii.jp/elem/000/000/620/620003/

기글하드웨어(http://gigglehd.com/zbxe)에 올라온 모든 뉴스와 정보 글은 다른 곳으로 퍼가실 때 작성자의 허락을 받아야 합니다. 번역한 뉴스와 정보 글을 작성자 동의 없이 무단 전재와 무단 수정하는 행위를 금지합니다.