다음 이전 차례

3. 플러그&플레이(PnP)의 해결 방법

3.1 PnP의 도입

플러그&플레이라는 단어에는 여러가지 의미가 있다. 넓은 의미에서는, 디바이 스를 연결하면 그 설정이 행해지는 단순한 자동 설정을 가리킨다. 본 HOWTO 에서의 의미로는, 설정이라는 것은 PnP 버스자원 설정과, 디바이스 드라이버에 그 설정 내용을 알리는 것만을 가리킨다. 좀 더 좁은 의미에서는, 하드웨어 디바이스의 버스 자원을 설정하는 것만을 가리킨다. 이것은 PnP 의 사양을 가리키는 것도 있다. 이 사양은(다른 것도 쓰여지고 있지만 특히) ISA 버스상의 디바이스(많은 경우 카드이다)에 대해 PnP 자원 데이 타를 읽고 쓰기 하는 방법의 사양을 정한다 . 표준 PCI(PnP 에는 없다 )의 사양은, 같은 것을 PCI 버스로 할 수 있도록 만들어져 있다 .

PnP 는 디바이스와 디바이스 드라이버의 설정을 일치시키고, 양쪽의 통신 채널 을 지정 한다. 플러그&플레이가 사용되기 전의 ISA 버스의 경우에는, 점퍼 를 사용해 하드웨어 디바이스의 버스 자원을 설정하고 있었다. 소프트 웨어 드라이버로의 버스 자원 배당은, 설정 파일(등)또는 디바이스 가 존재한다고 생각되는 어드레스를 조사하는 것에 의해 행해졌다. PCI 버스는 만들어졌을 때로부터 PnP와 유사 했으므로, PCI 버스용으로 PnP 를 실현하는 것은 매우 간단했다. PCI버스의 사양에서는 PnP 라는 용어 가 사용되고 있지 않기 때문에, PCI 버스를 PnP 라고 불러도 좋을가는 분명히 하고 있지 않다(그렇지만, PCI 버스는, 현재 PnP 라고 불리우고 있는 것을 하드웨어 적으로 지원하고 있다).

3.2 PnP 의 동작 (간단한 설명)

PnP 동작의 개요를 매우 간단하게 설명 합다. PnP 설정 프로그램(아마 BIOS 안에 있는 프로그램이다)은 모든 PnP 디바이스를 검출하고, 각 디바이스가 필요 로 하는 버스 자원을 요구한다. 다음으로, 이 설정 프로그램은 알려주어야만하는 버스 자원(IRQ 등)을 체크 한다. 당연하지만 non-PnP (legacy) 디바이스가 사용하고 있는 예약제 버스 자원이 있다면(설정 프로그램 이 알고 있으면), 이러한 예약제 자원은 PnP 디바이스에 알려주지 않는다. 다음으로, 설정 프로그램은(PnP 사양에서는 정해지고 있지 않은)어떠한 기준 을 이용해, 충돌이 일어나지 않게, 또한 모든 디바이스에 필요한 버스 자원을(가능 하다면)할당한다. 그래서, 설정 프로그램은 할당된 버스 자원 을 각 물리 디바이스에 설정하고, 디바이스는 할당되어진 버스 자원을 사용하는 것과 같이 자신 자신의 설정을 한다. 그리고 디바이스 드라이버는 제어하는 디바이스 가 사용하는 버스 자원을 어떠한 방법으로 검출하고, 이것에 의해 디바이스를 효율적으로 통신이 할 수 있게 된다.

예를 들면, 인터럽트(IRQ 번호) 1 개와 공유 메모리 1MB를 필요로 하는 카드가 있다고 하자. PnP 프로그램은 이 요구를 카드로부터 받는다. PnP 프로그램은 IRQ5와, 어드레스 0xe9000000 로부터 시작되는 1MB 의 어드레스 공간을 할당한다. 언제나 이와 같이 간단하게 설정할 수 있는것은 아니다. 이러한, (ISA 의 경우는)특정 IRQ 번호밖에 사용할 수 없는 것과, 1MB 의 메모리 영역이 특정 범위 어드레스에 들어 있지 않으면 안 되는 것을 카드가 지정되어 오는 경우가 있기 때문이다. 상세한 부분은 PCI 버스와 ISA 버스에서 다르지만, ISA 버스 쪽이 문제가 좀더 복잡하다.

PnP 설정 프로그램에서 사용할 수 있는 단축키 설정 방법이 몇개 있다. 그 하나는 마지막 설정시(컴퓨터를 마지막으로 사용했을 때)의 버스 자원 할당을 보존하여, 이것을 재이용하는 것이다. Windows9x 와 PnP BIOS 의 조합 은 이 동작을 하지만, 표준의 Linux 에서는 이것을 하지 않는다. Windows9x는 이 정보를 하드 디스크상의 「레지스터리」에 보존 하고, PnP BIOS는 이 정보를 PC의 불휘발 메모리(이것은 ESCD로 알려져 있다.) ``BIOS 의 ESCD 데이타베이스'' 를 참조하시오) 에 보존한다.

Linux에 있어서, 이 처리는 각각의 디바이스가 자력으로하며, 자원의 할당을 집중 관리하는 불휘발성의 레지스터리는 없다. 디바이스 드라이 버에 의해서는, 마지막에 이용한 설정을 저장하고, 다음에 전원을 켰을 때 그 설정을 사용하는 것도 있다. 이러한 디바이스는, 나머지 하드웨어가 버스자원을 필요로 하지 않는 것을 암묵적으로 가정하고 있다.

디바이스 하드웨어가 전의 설정을 기억하고 있으면, 다음 기동시에는 대부분 아무것도 설정하지 않아도 되지만, 디바이스는 전원을 끊으면 설정을 잊어 버린다. 디폴트 설정을 가지고 있는 디바이스도 있다 (그렇지만, 이것은 반드시 마지막으로 사용한 설정이라고 한정하지 않는다). 따라서, PnP 설정 프로그램 은 PC 를 기동할 때마다 매회 실행할 필요가 있다. 또, 새로운 디바이스 를 추가하면, 디바이스 설정을 할 필요가 있다. 이 새로운 디바이스에 버스 자원을 할당할 때에는, 이미 존재하는 디바이스부터 일부의 버스 자원 을 제거하고, 대신에 사용할 수 있는 다른 버스 자원을 그 디바이스에 할당하는 것일 지도 모른다.

3.3 PC 의 기동

컴퓨터의 전원을 처음 켰을때, BIOS 칩은 컴퓨터를 시작 시키기 위해서 BIOS 프로그램을 실행한다(최초의 스텝은 하드웨어의 체크이다). operating system이 하드 디스크에 저장되어 있는 경우(보통은 그렇다), BIOS는 하드 디스크의 정보를 취해야만 한다. 하드 디스크가 PnP 이면, BIOS 는 이것을 찾아내기 위해 PnP 를 사용할 수 있다. 또, 컴퓨터 시작시에 사용자가 BIOS 의 CMOS 를 수동으로 설정할 수 있도록 하거나, 에러-메세지를 보낼 수 있도록 하기 위해서는, 스크린(비디오 카드)와 키보드가 필요가 된다. 이들 디바이스가 있다면 BIOS 는 PnP 설정을 해야만 한다.

한 번 BIOS가 하드 디스크, 비디오 카드, 키보드를 인식하면, BIOS 에 의한 부팅(하드 디스크로부터 메모리로 operating system를 로 드하는 것)개시 준비는 완료된다. PnP 대응 오퍼레이팅 시스템 (PnP OS)를 사용하고 있는 것을 BIOS에서 지정하고 있는 경우에는, BIOS는 전에 말한 것처럼 PC의 부트를 개시하고, operating system에 PnP 설정 을 해야만한다. 그렇지 않을 경우는, (부팅 전에)PnP BIOS 자신이 나머지 디바이스 PnP 설정을 한다.(그러나, 드라이버의 설정은 하지 않는다).

3.4 버스

ISA은 오래된 IBM-PC 버스이고, PCI는 인텔이 제안한 새롭운 고속의 버스이다. PCI버스는, 현재 PnP 라는 기능을 실현할 수 있도록 설계되고 있다. PCI 버스에서는, PnP 버스 자원이 하드웨어 디바이스의 어느것에 할당되는지의 조사가(ISA 버스와 비교해)간단하다. 어떤 설정이 되어 있는지를 알기 위해서는 lspci 커멘드를 사용하거나, /proc/pci 또는 /proc/bus/pci 파일을 보면 좋다. 시작시에 화면에 표시되는 메세지(전의 표시를 보기위해서는 Shift-PageUp을 사용한다)도 유용하다. ``Boot-time Messages''를 참조하시오.

ISA 버스의 경우에는, PnP의 실현에 관한 어려운 문제가 있다. 이 이유는 ISA 버스 설계 당시에는 누구도 PnP를 고려하지 않았던 것과, 설정 정보 를 물리 디바이스에 보내기 위해서 PnP가 사용할 수 있는 I/O 어드레스가 거의 없다는 것이다. 결국, ISA 버스상에서 PnP를 하는 방법은 매우 복잡하게 되었다. 이것에 관한 책이 몇권 쓰여져있다 . ``PnP Book'' 를 보시오. 특히, 각각의 PnP 디바이스에 PnP 프로그램용의 일시적인 「핸들 (handle)」를 할당하고, 프로그램이 PnP 설정을 할 때에 디바이스를 특정할 수 있도록 하는 것이 필요하다. 이 「핸들」을 할당하는 것을 「Isolation (isolation)」이라고 말한다. 상세한 것에 대해서는 부록 ``Isolation''을 참조하시오.

ISA 버스는 언젠가는 없어지게 된다. 그렇게 되면, PnP는 BIOS가 어떻게 하드웨어를 구성했는지를 간단히 알수있기 때문에 좀 더 간단해 질 것이다. 그런데도, 디바이스 드라이버를 디바이스와 어울리게 구성할 필요가 있고, PC의 시작·실행시에는 추가된 디바이스를 설정할 필요도 있다. 이러한 필요성은, Linux가 PnP operating system이였다면 만족될수 있는 것이다.

3.5 Linux 에서 PnP를 더 잘해야할 필요성

PnP 규격(ISA 버스용)은 Compaq, Intel, Phoenix 가 만들었다. Microsoft 는 선두에서 PnP의 보급을 진행시켰다. PnP가 「발명」되지 않았다면 , Linux는 좀 더 좋았을것이다. 언젠가 ISA 버스는 쓸모없게 되고, PnP 에 닮은 기능을 가진 PCI 버스가 보급되면, 실현이 용이한 PnP를 실제로 사용할 수 있을 것이다. 그러나, 그것을 좋아하거나 그렇지 않거나, 최근의 새로운 ISA 하드웨어는 거의 모든 것이 PnP 이므로, Linux는 PnP와 잘 맞도록하는 이외의 길은 없다. 그러나, 표준 Linux (1999 년 초기의 시점)에서 는, PnP 취급이(특히 ISA버스의 경우에는)복잡하게 되어 있다 . PnP 원래의 목적은 설정을 간단하게 하는 것이었지만 ….

어떤 의미로, Linux는 PCI 버스에 대해서는 이미 어느정도 PnP 기능을 가지고 있다고도 말할 수 있다. PC를 부팅했을 때, 스크린에 표시되는 메세지 로부터 일부의 디바이스 드라이버가 자신이 제어하는 하드웨어 디바이스( 및 BIOS가 이것들에 할당한 버스 자원)을 검출하는 한 것을 독자 여러분 도 기억할지 모른다. 그러나, PnP operating system이라면 좀 더 능숙하게 처리할 수 있는 상황이 몇개쯤 있다 :

Linux 사용자는, 사용하고 싶은 ISA PnP 디바이스의 설정을 하기 위해서 PnP, 그것에 대해서 자세하게 조사할 필요는 없을 것이다. 해결 방법의 하나는, 표준화된 버젼의 Linux가 ISA 버스와 PCI 버스, 그 외의 버스에 있어서 프 래그&플레이를 지원하는 것이다. 커넬에 패치가 쓰여져 있지만, 대부분의 드라이버는 이 패치에 대응하고 있지 않다. 이 패치는 표준 Linux의 부분이 아니다. ``Patch Kernel''.를 참조 하시오.
다음 이전 차례