9. 부록

9.1. 유니버설 플러그 엔드 플레이 (UPnP, Universal Plug and Play)

이것은 사실상 마이크로소프트사에 의해 개발된 네트웍 PnP 의 일종이지만 리눅스에서도 사용가능하다. UPnP 하드웨어를 네트웍에 꽂아 네트웍상의 다른 UPnP 디바이스들과 자동으로 통신이 이루어지기만 하면, 따로 별도의 설정작업이 필요없는 것이다. 여기서의 "설정" 은 넓은 의미이며 버스리소스의 할당만을 의미하는 것이 아니다. 또다른 목적은 네트웍이나 설정작업에 문외한인 사람들도 라우터, 게이트웨이, 네트웍 프린터등을 설치할 수 있게 하는데 있다. UPnP 는 무선 네트워킹에서 주로 사용될 것이다.

UPnP 에서 사용되는 것들

본 문서는 UPnP 를 다루지 않는다. 리눅스에서의 UPnP 는 인텔이 지원하고있는데, 이 회사는 이를 위한 소프트웨어를 개발해왔다. UPnP 와 같은 기능을 하는 다른 프로그램들도 있다. 이들에 대한 몇가지 비교가 다음에 나와있다.

9.2. 어드레스에 대한 세부사항

어드레스에는 세 종류가 있다: 메인 메모리 어드레스, I/O 어드레스, 설정 어드레스가 그것이다. PCI 버스상에서는 설정 어드레스가 I/O 어드레스의 경우처럼 별도의 어드레스 공간을 형성한다. ISA 설정 어드레스같은 복잡한 경우말고는, 버스상의 어떤 어드레스가 메모리 어드레스인지, I/O 어드레스인지, 설정 어드레스인지 여부는 버스상의 특정 라인의 전압에 의해 결정된다. ISA 설정 어드레스의 경우라면 자세한 사항은 9.3절 를 참고하라.

9.2.1. 어드레스 영역들

본 문서에서 "어드레스" 라는 용어는 때로는 연속된 어드레스 범위를 뜻하기도 한다. 어드레스들은 단위 바이트들로 구성되므로, 개별 어드레스 하나는 단지 어떤 바이트 하나의 위치를 뜻하지만, I/O (혹은 메인 메모리) 어드레스들이라고 말할때는 이는 복수개의 바이트들로 구성된 것이다. 따라서, 가령 8 바이트로 구성된 어드레스 범위 하나가 I/O 어드레스들로 사용되기도 하며, 디바이스에 할당되는 메인 메모리 어드레스들의 범위로 이보다 훨씬 큰 영역이 할당되기도 한다. 한개의 시리얼 포트(I/O 디바이스에 해당한다)에는 그 디바이스의 I/O 어드레스 시작번지만 배당하면 충분하다(가령 3F8). 왜냐하면 시리얼 포트에 대한 어드레스 범위는 단지 8 바이트뿐임이 잘 알려져있기 때문이다. 시작 어드레스는 "베이스 어드레스(base address)" 라고도 부른다. 때로는 "어드레스 범위(address range)" 를 그냥 "범위(range)"이라고 부르기도 한다.

9.2.2. 어드레스 공간

ISA 의 경우 동일한 어드레스 버스를 이용해 I/O 및 (메인) 메모리 어드레스 "공간(space)" 각각을 액세스한다(어드레스용으로 사용되는 회로배선들이 물리적으로 공유된다). 디바이스는 어드레스 버스상에 나타난 어드레스가 메모리 어드레스인지 I/O 어드레스인지를 어떻게 판별하는 것일까? 그 판별을 위한 정보및 기타 추가정보의 전송을 위해, 버스상에는 별도의 라인이 4 선 배선되어있다. 이 4 선중 특정한 한 선에 신호가 들어온면, 이는 CPU 가 I/O 어드레스로부터 읽기를 원한다는 것이며 따라서 메인 메모리는 그 버스상의 어드레스를 무시하게 된다. 다른 3 선들도 이런 식의 용도로 사용된다. 따라서, 메인 메모리와 I/O 어드레스 각자는 읽기용도의 라인과 쓰기 용도의 라인을 가진 것이다(그래서 배선이 총 4 개가 된다)

PCI 버스의 경우에도 위와 똑같은 아이디어를 사용하지만(역시 배선이 4 개다), 약간 다르게 되어있다. 4 선중 한 선만 이용해 상태를 나타내는게 아니라, 4 개의 배선을 다 이용해 2진법 숫자를 표현한다(16 가지의 다른 표현이 가능하다). 따라서 더 많은 정보를 전할수 있다. 이 16 가지 숫자중 4 개는 윗 문단에서 말한 I/O 와 메모리 공간용으로 사용된다. 더불어 그 다음 2 개의 숫자는 설정 어드레스 공간용으로 사용한다. 나머지 10 개의 숫자는 다른 용도를 위해 남겨져 있다.

9.2.3. 범위(range) 체크 (ISA 에서의 IO 어드레스 충돌여부를 테스트)

ISA 버스상에서는, 각 PnP 카드내에는 다른 카드들이 자기와 같은 I/O 어드레스를 사용하는지를 체크해 볼 수 있는 방법이 내장되어있다. 만일 둘 이상의 카드들이 같은 IO 어드레스를 사용한다면 대개는 어느 것도 제대로 동작하지 않을 것이다(전혀 동작하지 않을 수도 있다). 좋은 PnP 소프트웨어는 이런 충돌을 피해서 버스 리소스를 할당하겠지만, 심지어는 그런 경우에도 이번에는 어딘가에 숨어있던 legacy 카드가 같은 어드레스를 사용해 버릴지 모른다.

테스트는 카드 자체의 IO 레지스터들 속에 테스트용 번호를 넣어준 후, PnP 소프트웨어가 이를 읽게 한 다음, 제대로 그 테스트 번호를 읽어냈는지 확인함으로써 이루어진다. 제대로 읽지 못한다면 무언가 잘못된 것이다(예를 들면 다른 카드가 같은 어드레스를 사용했기 때문일 수도 있다). 다른 테스트용 번호를 택해서 같은 작업을 반복해본다. 이는 결국 카드에 할당된 IO 어드레스의 범위를 체크하는것과 마찬가지이므로, 이 방법을 "범위 체크(range check)"라 부른다. 어드레스 충돌 테스트라고 부르는게 더 타당했을것이다. 만일 어드레스 충돌이 있다면 에러메시지를 받게 될테고, 그러면 문제를 해결하면 된다.

9.2.4. 메모리를 통한 직접 통신

전통적으로 대부분의 I/O 디바이스들은 I/O 메모리만 사용해서 CPU 와 통신했었다. 예를 들어, 시리얼 포트가 그러하다. 이때 디바이스 드라이버는 CPU 상에서 실행되면서 I/O 어드레스 공간및 메인 메모리에 데이터를 읽고 쓴다. 더 빠르게 동작하고자한다면 디바이스가 직접 메인 메모리로 데이터를 보내면 될 것이다. 그런 방법의 하나로 2.7절 나 버스 마스터링을 이용하는 방법이 있다. 또다른 방법으로는 메인 메모리상의 일부 공간을 디바이스용으로 할당해버리는 것이다. 그러면 디바이스는 DMA 나 버스 마스터링 때문에 골치썩일 필요없이 직접 메인 메모리에 읽고 쓸수 있다. 또한, 디바이스는 이와함께 IO 어드레스들을 사용할 수도 있다.

9.3. ISA 버스의 설정 어드레스들 (읽기포트 등등)

이 어드레스들을 "자동 설정 포트(Auto-configuration ports)"라고도 한다. ISA 버스의 경우, 기술적으로 볼때 설정 어드레스 공간이 없으나, 특별한 방법을 이용하면 CPU 가 PnP 카드상의 PnP 설정 레지스터들을 액세스할 수 있다. 이 용도로 3 개의 I/O 어드레스들이 할당되어 있으며 각각은 겨우 한 바이트 짜리다(그러므로 어드레스 "범위" 라고 할수는 없다). 카드 하나당 3 개씩의 어드레스가 아니라, 어드레스 3 개를 모든 ISA-PnP 카드들이 공유하는 것이다.

이 세개의 어드레스들을 읽기포트(read-port), 쓰기포트(write-port), 어드레스포트(address-port)라고 부른다. 각 포트는 딱 1 바이트 크기다. 각각의 PnP 카드들상에는 설정 레지스터들이 많이 있으므로, 이 3 개의 어드레스들만으로는 단지 카드 하나의 설정 레지스터들용으로도 충분치 않다. 이 문제를 해결하기 위해서, "isolation" 이라 부르는 기법을 사용해 각 카드에 카드번호(handle)란 것을 부여한다. 자세한 사항은 9.6절 을 보라.

이제 특정 카드를 설정하기 위해서는, 쓰기포트 어드레스를 통해 해당 카드번호(handle)를 보내어 그 카드가 어드레스포트에 귀기울이게 만든다. 다른 모든 카드들은 자기 카드번호가 아님을 알고는 어드레스포트의 내용에 귀기울이지 않게 된다. 그 다음, 원하는 설정 어드레스를 어드레스포트로 보내면 해당 카드는 이를 알게 된다(다른 모든 카드들도 이를 전달받기는 하나 무시해버리며, 단지 해당 카드만이 이를 받아들이는 것이다). 이제, 읽기포트에서 읽거나 쓰기포트에 씀으로써 그 카드상의 설정 레지스터와 데이터 통신을 할수 있는 것이다.

쓰기포트는 언제나 A79 이고 어드레스포트는 언제나 279 이다(16진수). 읽기포트는 고정되어있지 않으나, 다른 ISA 카드와 충돌하지 않는 한, 설정 소프트웨어를 써서 203-3FF 범위내의 어떤 어드레스로 지정할 수 있다. 만일 충돌이 있는 경우에는 설정 소프트웨어는 다른 어드레스로 바꿀 것이다. 모든 PnP 카드들은 이 어드레스로 "프로그램" 된다. 따라서, 가령 isapnp 를 사용해서 설정 데이터를 지정하거나 체크하려면, 이 읽기포트 어드레스를 반드시 정해주야만 한다.

9.4. 인터럽트에 대한 자세한 사항

인터럽트를 이용해서도 다량의 정보를 전송할 수 있으나 이는 오직 간접적인 방법일 뿐이다. 인터럽트 요청 신호(특정 라인에 전압을 가하는 것이다)는 그저 인터럽트 컨트롤러라는 어떤 칩에게 현재 특정 디바이스가 뭔가를 요청하고 있음을 알릴 뿐이다. 인터럽트 요청을 받은 인터럽트 컨트롤러는 CPU 에게 신호를 보낸다. 그러면 CPU 는 현재 하고있는 작업을 중단하고 해당 디바이스용의 드라이버를 찾아 그안의 "인터럽트 서비스 루틴"(인터럽트 핸들러라고도 한다) 부분을 실행시킨다. 이 "루틴"은 무슨 일이 일어났는지 파악한 후 문제를 처리한다. 예를 들면, 디바이스로 바이트 열을 보내거나 반대로 받아와야할 경우일수도 있다. 이 프로그램(루틴)은 무슨 일이 일어났는지를 쉽게 발견해낼 수 있다. 왜냐하면 그 디바이스의 레지스터들이 어느 어드레스에 있는지를 드라이버 소프트웨어가 이미 알고있기 때문이다(물론 디바이스의 IRQ 번호와 I/O 어드레스가 제대로 세팅되어있어야 한다). 이 레지스터들은 그 디바이스에 대한 상태 정보를 담고있다. 소프트웨어는 이 레지스터들의 내용을 읽어 살펴본 후, 무슨 일이 일어났는지를 파악해서 적절한 조치를 취하게된다.

따라서 디바이스 드라이버들은 각자 어떤 인터럽트 번호(IRQ)에 귀기울여야할 지를 알고 있어야만 한다. PCI 버스에서는(그리고 ISA 버스에서도 일부 특별한 경우에는) 둘 이상의 디바이스들이 같은 IRQ 번호를 공유하는 것이 가능하다. 이러한 공유 인터럽트가 발생하면 CPU 는 그 인터럽트를 사용하는 모든 디바이스들의 인터럽트 서비스 루틴들을 전부 동작시킨다. 최초 실행된 서비스 루틴이 제일 먼저 하는 일은 그 디바이스 레지스터들을 체크해서 정말 자신의 디바이스를 위해 그 인터럽트가 발생한 것인지를 확인하는 것이다. 확인 결과 자신의 디바이스가 인터럽트를 발생시킨게 아닌 것으로 판단되면 그 루틴은 그대로 종료하고, 같은 인터럽트를 공유하는 두번째 디바이스의 서비스 루틴이 시작된다. 인터럽트를 발생시킨 디바이스를 발견할 때까지 이런식으로 계속 진행된다.

IRQ 라인에 전압을 가하는 것은 단지 CPU 로 하여금 하던 일을 멈추고 디바이스 드라이버를 실행시킬 것을 요구하는 것이다. 거의 대부분의 경우, CPU 는 요청대로 멈추게 될것이다. 하지만 때로는 일시적으로 인터럽트를 요청할 수 없다거나 인터럽트들이 우선순위순으로 처리되는 수가 있으며, 따라서 아주 드문 경우지만 인터럽트가 발생되지 않거나 지연되는 수가 있다. 그러므로 위에서 "인터럽트" 라고 한것은 더 정확히 말하면 인터럽트 요청이라고 말해야 맞을 것이다. IRQ 가 Interrupt Request 의 약자인 것은 이런 이유 때문이다.

9.5. PCI 인터럽트

최근 PCI 인터럽트에서는 두가지가 새로이 개발되었으며 이는 여기서 다루지 않는다. 이 개발된 사항들은 특히 둘이상의 CPU 를 사용하는 컴퓨터에서 중요하다. 하나는 Advanced Programmable Interrupt Controller(APIC) 라는 것이다. 다른 하나는 Message Signalled Interrupts(MSI) 라는 것으로, (인터럽트 라인이 필요없이) 직접 메인 컴퓨터 버스상의 특별한 어드레스로 보내진 어떤 메시지 자체가 바로 인터럽트가 되는 것이다. 하지만 그런 메시지를 보내는 디바이스는 반드시 먼저 메인버스의 제어권을 획득해야 인터럽트 메시지를 보낼수 있다. 이런 메시지에는 "나 인터럽트 보내고 있어요" 라는 것 이상의 정보가 포함된다.

원래 PCI 인터럽트들은 ISA 인터럽트들과는 다르지만, 보통은 ISA 인터럽트처럼도 동작할 수도 있도록 IRQ 번호들로 매핑되어있다. 한가지 주요한 차이점은 BIOS 가 이 매핑을 담당한다는 점이다. CMOS 메뉴가 허용하지 않는한 리눅스에서 이 매핑을 변경하는 것은 불가능한 듯 하다 ??. 또다른 주요한 차이점은 PCI 인터럽트들은 공유될수 있다는 것이다. 예를 들면 IRQ5 를 두 PCI 디바이스가 공유하는 경우이다. 이러한 공유능력은 하드웨어에 내장되어 있으며, 모든 디바이스 드라이버들은 이 기능을 지원하기로 되어있다. 주의할 것은 PCI 와 ISA 버스간에는 같은 인터럽트를 공유할 수 없다는 것이다. 하지만 충돌상태에 있는 디바이스들이라도 같은 순간에 사용중이지만 않으면, 이러한 불법적인 공유도 제대로 동작할 것이다. 여기서 "사용중" 이라는 뜻은, 실행중인 어떤 프로그램이 그 C 프로그래밍 코드내에서 디바이스를 "개방(open)" 했다라는 의미이다.

여기서는 PCI 인터럽트 시스템에 대한 세부사항을 조금 언급한다. 각 PCI 카드(그리고 마더보드상에 탑재된 디바이스)는 4 개의 가능한 인트럽트들을 가진다; INTA#, INTB#, INTC#, INTD#. 지금부터는 그냥 A, B, C, D 라 부르겠다. 각각마다 카드의 커넥터 부분의 핀들중 하나씩을 차지한다. 따라서 7 개의 슬롯을 가진 시스템이라면 카드들 용으로 7 x 4 = 28 개의 서로 다른 인터럽트 라인들이 가능할것이다. 하지만 사양상의 제약으로 인해 이 인터럽트 라인들 중 몇개만 허용되며, 많은 PCI 버스들은 단지 4개의 인터럽트 라인들만을 가지도록 제작되는 듯 하다. 하지만 인터럽트들은 공유될수 있으므로 4 개라도 지나치게 적은 것은 아니다. 이 라인(회로 배선)들을 W, X, Y, Z 이라고 부르자. 슬롯 3 으로부터의 B 인터럽트를 인터럽트 3B 라는 식으로 표시하기로 하자.

이 라인들을 인터럽트와 결합시키는 간단한 방식은 모든 A 인터럽트들(INTA#)은 라인 W 에 연결, 모든 B 인터럽트들은 라인 X 에 연결, ... 이런 방식일 것이다. 실제로 수년 전에는 이 방식이 사용되기도 했지만, 이는 좋은 해결책이 아니다. 이유는 다음과 같다. 위와 같은 방식이라면, 만약 어떤 카드가 인터럽트 한개만 필요로 할 경우 A 를 사용할 것이다. 만일 두개의 인터럽트를 필요로 한다면 A 와 B 를 사용해야만 할 것이다. 이런 식이라면 결국 INTA# 는 INTD# 보다 훨씬 자주 사용되게된다. 따라서 첫번째 라인을 공유하는 인터럽트들의 수가 너무 과도해지는 문제가 생긴다(모든 INTA# 들은 W 에 연결되어 있다). 이 문제를 극복하려면 보다 복잡한 방식을 택해 네개의 인터럽트 라인들(W, X, Y, Z)이 다들 대략 같은 수만큼의 인터럽트들을 공유케 하면 된다.

그 한가지 방법은 W 라인이 인터럽트 1A, 2B, 3C, 4D, 5A, 6B, 7C 들을 공유하게 하는 것이다. 이는 라인 W 를 물리적으로 1A, 2B, ... 들과 연결시키면 된다. 같은 식으로 라인 X 는 1B, 2C, 3D, 4A, 5B, 6C, 7C 들과 연결시킨다. 나머지도 같은 식이다. 이렇게 해두면 시스템 시작시에 BIOS 가 X, W, Y, Z 을 IRQ 들에 매핑시킨다. 그다음, BIOS 는 디바이스들이 사용할 IRQ 값들을 각각의 디바이스상의 하드웨어 설정 레지스터에 써넣는다. 여기까지 완료되었다면 이제 어떤 레지스터를 조사한 프로그램은 그 디바이스가 무슨 IRQ 를 사용하는지 알아낼 수 있게된다.

슬롯에 꽂힌 하나의 카드는 그 카드상에 디바이스를 8 개까지 가질수 있다. 하지만 그 카드가 쓸수있는 인터럽트는 단지 4 개 뿐이다(A, B, C, D). 인터럽트는 공유될 수 있으므로 8 개의 디바이스들(만약 8 개 까지 탑재되어 있다면) 각각이 인터럽트를 하나씩 가지는 것도 가능하다. 한 디바이스의 PCI 인터럽트 문자는 보통 고정되어 있으며 그 디바이스에 하드웨어적으로 배선되어있다. 인터럽트들을 할당하는 것은 앞서 언급한 바와 같이 BIOS 가 ISA 인터럽트들을 PCI 인터럽트들에 매핑시킴으로써 이루어진다. 만일 위의 예에서처럼 단지 4 개의 라인(W, X, Y, Z)만 있다면 PCI BIOS 가 선택의 폭은 그 수에 제한된다. 어떤 마더보드들은 더 많은 라인들을 사용할 수도 있으며, 따라서 이경우 선택도 더 다양해진다. BIOS 는 어떻게 결선되어 있는지에 대해 알고있다.

BIOS 는 자신이 ISA 버스용으로 파악하고 있는 IRQ 들과 충돌하지 않도록하면서 PCI 버스상의 IRQ 들을 할당해 나간다. 때로는 CMOS BIOS 메뉴를 통해 사용자가 PCI 카드들에게 IRQ 를 할당해줄 수도 있다. 또한, PnP 운영체제(가령 MS 윈도우즈)라면 우선 BIOS 가 해놓은 작업을 파악한 후 IRQ 들을 할당하려고 시도할 수도 있다. 이러한 할당내역을 "라우팅 테이블" 이라고 부른다. MS 윈도우즈가 IRQ 할당작업을 동적으로 해내는 경우(가령 도킹 이벤트), 이를 "IRQ 스티어링(steering)" 이라고 부른다. BIOS 는 BIOS 자체의 IRQ 스티어링 기능을 가지고 있을수도 있다(리눅스가 이를 활용할 수도 있다). 만일 윈도우즈로 부팅한 후 PC 를 끄지 않은 채 그 상태에서 리눅스를 시작시킨다면, 그 IRQ 들은 BIOS 가 셋팅시킨 것과 다를 수도 있는 것이다.

PCI 가 ISA 버스상의 IRQ 들을 사용할 경우, 당신은 ISA 버스의 속도는 느리니까 시스템이 느려질거라고 생각할 수도 있겠다. 실제로는 그렇지 않다. ISA 인터럽트 컨트롤러 칩(들)은 CPU 로 향하는 직접적인 인터럽트 배선을 가지기때문에 CPU 는 즉각 신호를 알아챌 수 있다. ISA 어드레스상의 신호나 데이터 버스들상의 신호라면 CPU 에의 도달 시간이 느릴 수도 있지만, IRQ 인터럽트 신호들만큼은 거의 즉각적으로 CPU 에 도달한다.

9.6. ISA Isolation

이것은 ISA 버스에만 해당되는 내용이다. Isolation 이란 일시적인 핸들(id 번호, 즉, 카드 선택번호(CSN, Card Select Number))을 ISA 버스상의 PnP 디바이스들 각각에 할당시키는 복잡한 방법을 말한다. 일부 사람들은 이를 위해 더 효율적인(그러나 더 복잡한) 방법을 사용할 수 있으므로 isolation 는 간단한 방법이라고 주장하기도 한다. 모든 PnP 디바이스들에 대한 PnP 쓰기용으로 오직 하나의 쓰기 어드레스만이 사용되므로, 이 어드레스에 무언가를 쓰면 모든 PnP 디바이스들이 이에 귀기울이게 된다. 이 쓰기 어드레스는 각 PnP 디바이스들에게 그 디바이스 고유의 유일무이한 핸들을 보내는데(즉, 할당하는데) 사용된다. 이 핸들을 할당하려면, 핸들이 모든 디바이스들에 공유되고있는 그 쓰기 어드레스로 보내질 때(즉, 쓰여질 때) 오로지 하나의 디바이스만이 이에 귀기울이고 있을것이 요구된다. 모든 PnP 디바이스들은 isolation 과정에서 사용될 고유의 유일무이한 시리얼 넘버를 가지고 있다. isolation 을 행하는 것은 일종의 게임과 비슷하다. PnP 디바이스들 전부가 공유하고있는 단 하나의 버스라인을 isolation 프로그램과 결부시키는 게임이다.

"게임" 의 제 1 회전에서는 모든 PnP 디바이스들이 이 라인에 귀기울이고 있는 상태이며, 또한 각 디바이스들은 동시에 이 라인으로 비트열을 보내게 된다. 허용되는 비트들은 1 (양전압) 이거나 전압이 걸리지 않은 상태인 "open 0" 전압(회로가 개방되었거나 tri-state 상태)이다. 이를 위해 각 PnP 디바이스는 자신의 시리얼 넘버를 이 라인상으로 높은 비트부터 비트단위로 순서대로 전송한다. 만약 어떤 디바이스가 1 을 보내면 다른 모든 디바이스들은 그 라인상에서 1 이 왔음을 듣게될 것이다. 만일 모든 디바이스들이 "open 0" 를 보낸다면 라인에서는 아무것도 들리지 않는 것이다. 목적은 (일회전이 끝났을 때) 가장 높은 시리얼 넘버의 디바이스만 남기고 나머지는 전부 제거시키는 것이다. "제거" 는 게임의 이번 회전에서 탈락하는 것을 말하며, 따라서 일시적으로 더이상 쓰기 라인에 귀기울이는 것을 중단하게 된다. (모든 시리얼 넘버들은 같은 길이임에 주목하라.) 만일 단 하나의 디바이스가 남아서 아직도 귀기울이고 있다면, 그 디바이스는 핸들(카드 번호)을 받게된다.

먼저 시리얼 넘버의 가장 최상위 비트만 고려하자. 아직 핸들을 받지 못한 상태인 모든 디바이스들이 각자의 최상위 비트들을 이 라인으로 처음 보내오면, 이들은 중첩되어 하나의 비트가 된다. 만일 어떤 PnP 디바이스가 0(open 0) 을 보내고서 1 을 듣게 된다면, 이는 어떤 다른 PnP 디바이스가 더 높은 시리얼 넘버를 가지고 있다는 뜻이고, 따라서 이 디바이스는 일시적으로 이번 라운드에서 탈락한다. 이제 게임에서 살아남은(이번 회전에서만임) 디바이스들은 모두 같은 숫자(가령 1)의 앞자리 숫자를 가진 것이며, 따라서 우리는 이제 이 숫자를 떼버린 후 남는 "한 비트 벗겨낸 시리얼 넘버"를 가지고 이번 회전에 계속 참가하게 된다. 그다음 본 문단의 첫단계를 다시 반복하고, 이런 식으로 각 디바이스에 대한 모든 시리얼 넘버가 시험될때까지 반복하는 것이다(다음 문단의 모두 0 인 경우를 보라).

따라서 이번 라운드에서는 낮은 시리얼 넘버를 가진 카드들은 모두 탈락될 것이 분명하다. 하지만 만약 게임에 참가한 모든 디바이스들이 모두 자신의 최상위 비트로서 0 을 내보내온 경우는 어떻게 될까? 이 경우 "open 0" 가 라인상으로 보내지게 되므로 모든 참가자들이 다 게임에 남게된다. 이들 모두가 최상위 비트로 0 을 가지고 있으므로 이는 비긴 것이며, 따라서 위의 문단에서 1 이 벗겨졌었던 것과 마찬가지로 최상위 비트인 0 은 벗겨내지게 된다. 이제 게임은 시리얼 넘버의 그다음 숫자가 보내지면서 계속 진행된다.

이번 회전의 마지막 단계(즉, 시리얼 넘버의 최하위 비트가 보내진 다음)에서는 가장 높은 시리얼 넘버를 가진 PnP 디바이스 하나만이 게임에서 살아남게 된다. 그러면 이 디바이스는 핸들을 할당받고 게임에서 영구히 빠지게 된다. 그다음, 이전 회전에서의 모든 탈락자들이(아직 핸들을 못받고 있다) 다시 게임에 참가하고, 이제는 참가자 하나가 줄어든 상태에서 새로운 회전이 시작된다. 결국 모든 PnP 디바이스들은 핸들을 할당받게 된다. 이 알고리즘이 제대로 동작한다는 것은 쉽게 증명할 수 있다. 실제의 알고리즘은 이보다 다소 복잡하다. 왜냐하면 신뢰성을 보장하기 위해 각 단계를 두번씩 반복시키며 그 반복도 다소 달라지기 때문이다(하지만 기본적으로 같은 아이디어이다).

일단 모든 핸들들이 할당되면, 이 핸들들은 각 PnP 디바이스가 설정 데이터를 읽고 쓰는데 사용할 어드레스를 할당하는데 사용된다. 이 핸들들은 오직 PnP 설정용으로만 사용될 뿐, PnP 디바이스와의 통상의 통신용으로는 사용되지 않음에 유의하라. 컴퓨터가 PnP BIOS 를 시작할 때는 보통 이런 isolation 이 수행된 후에 PnP 설정이 수행된다. 여기까지 완료되면 모든 핸들들은 "폐기" 되며, 따라서 만일 사용자가 다시 설정을 바꾸려면(혹은 조사하려면), isolation 이 또다시 수행되어야만 한다.