다음 이전 차례

2. PnP 의 할일: "Bus-Resources" 의 배정

2.1 플러그&플레이(PnP)란 무엇인가?

매우 간단하게 설명하면, 플러그&플레이는 모뎀과 네트워크 카드, 사운드 카드등의 각종 하드웨어(장치)를 찾아낸 장소를 자동적으로, 소프트웨어에 알려준다. 플러그&플레이의 일은, 물리적 장치와 이것을 조작하는 소프트웨어(디바이스 드라이버)와 일치시키고, 디바이스와 드라이버 사이에 통신「채널」을 만드는 것이다. 이것을 실현하기 위해서, PnP는 아래의 "bus-resources" 을 드라이버와 하드웨어의 양쪽에 할당한다: I/O 어드레스, IRQ, (ISA 패스만)DMA 채널, 메모리 영역이다. 이것들 4 개의 bus-resources가 어떤 것인지 모르면, 뒤에 기술한 I/O 어드레스, IRQ, DMA 채널, 메모리 영역의 절을 읽어 주세요. 또 이것들의 bus-resources 중 3 개에 관한 Linux Gazette 의 기사가 Introduction to IRQs, DMAs and Base Addresses 에 있다. 한 번 이것들의 bus-resources를 분배시키면 (그리고 옳바른 드라이버가 인스톨되면), /dev 디렉토 리에 있는 디바이스의 파일을 사용할 수 있게 된다.

이러한 bus-resources PnP 배분을 「설정(configuring)」라고 불리우는 것도 있지만, 이것은 저레벨의 종류 설정에 지나지 않는다. 즉, PnP 를 최대한 이용한 경우라도 디바이스 설정의 대부분은 PnP 이외에서 행해진다. 예를 들면 모뎀의 설정이라면, 「초기화문자열」이 I/O 어드레스의 "channel" 을 사용해 모뎀에 보내진다. 모뎀에 문자열을 보내기 위해서 사용되는 "channel"은 PnP를 할당한 것입니다만, 「초기화문자렬」그것 은 PnP와는 무관하다. 시리얼 포트의 속도( 및 다른 파라미터의 다수 )의 설정은, 사용자가 실행된(부팅시에 자동적으로 실행되는 것도 꽤 있다.) 프로그램으로부터 디바이스 드라이버로 메세지를 보내는 것에 의해 실행된다. 이 설정도 역시 PnP과는 관계 없다. 이와 같이, PnP의 화제 에 있어서는 「설정」은 특정 종류의 설정에 지나지 않는다. 다른 문서 (MS Windows 용의 문서등)에서는 bus-resources을 「resources 」라고 읽고 있는 것도 있지만, 이 문서에서는 다른곳에도 많이 있는 resources 자원과 구별하기 위해서, "bus-resources" 라는 용어를 사용하는 것이다.

2.2 컴퓨터에 의한 디바이스의 찾는 법(또는 그 반대로)

컴퓨터는 계산을 하는 CPU 와 데이터를 저장하는 메모리로 구성되고 있다. 이것에 더해, 각종 디스크 드라이버와 비디오 카드, 키보드, 네트웍 카드, 모뎀 카드, 사운드 카드, 시리얼 포트, 패러렐 포토등이 있다. 또, 전력을 공급하는 전원 유니트, 디바이스를 CPU 에 접속하는 마더보드상의 버스, 그리고 이것들 모두를 장착하는 케이스가 있다.

옛날 거의 모든 디바이스에는 전용 plug-in card(프린트된 회로기판) 가 있었다. 최근 많은 「디바이스」는, plug-in card로서뿐만이 아닌 , 「마더보드」에 붙여진 작은 칩 으로도 제공되고 있다. 마더보드에 plug-in card는 1 개이상의 디바이스가 들어가 있는 것도 있다. 메모리칩을 디바이스로서 생각하는 것도 있지만 , 본 HOWTO 에 있어서의 의미에서의 plug- and-play가 아니다.

컴퓨터 시스템을 바르게 동작시키기 위해서는, 각각의 디바이스는 「디바이스 드라이버」의 제어밑에 있어야만 한다. 디바이스 드라이버는 운영 시스템의 일부로(모듈로서 로드되는 것도 있다 ), CPU 상에서 동작하는 소프트웨어이다. 디바이스 드라이버는 /dev 디렉토리에 있는 「특수 파일」에 관련되어져 있다 . 이 파일 은 실제의 파일이 아니다. 이 파일의 이름은 hda1(하드디스 크 a 의 최초의 파티션), ttyS0(최초의 시리얼 포토), eth1 (2번째 의 이더넷 카드) 같게 되어 있다 . 복잡한 이야기로 되지만 , 선택되는 디바이스 드라이버(예를 들면 eth1라고 합시다)는 사용하고 있는 이더넷 카드의 종류에 의해 결정된다. 즉, 모든 이더넷 드라이 버가 eth1 를 할당되는 것은 아니다. 단 이더넷 의 기종에 대응한다, 어떤 특정 드라이버가 할당되지 않는다. 디바이스를 제어하기 위해서, (디바이스 드라이버를 제어하고 있다)CPU 는 각 종 디바이스에 커멘드 ( 및 데이터)를 보내거나, 정보를 읽기 내거나 한다. 이러한 통신을 하기 때문에, 각 바이스 드라이버는 제어하는 디바이스 유 일의 어드레스값을 알고 있지 않으면 안 된. 이러한 어드레스값을 알수있는 것은 (통신 채널을 설정한다)인 것이다. 이 「채널」이 실제로는 PC 내부의 데이터 버스이고, 다른 모든 것에 공유되어 있는 경우라도 같다. 실제의 통신 채널은 여기서의 설명보다 조금 복잡하다. 「주소값」은 실제로는 폭을 가진 어드레스 이고, 채널에 는( plug-and-play로 알려져 있다.)역방향 분배가 있고, 디바이스는 이것을사용해서 긴급의 「헬프」요구를 디바이스 드라이버에 보낼 수 있다.

2.3 I/O 어드레스등

PC 에는 3 개의 어드레스 공간(I/O, 메인 메모리, (PCI 버스 한정)설정) 이 있다. 이들 3 종류의 어드레스는, PC 내부에서는 같은 버스를 공유하고 있다 . 그러나, 어떤 어드레스가 어느 공간(I/O, 메인 메모리, 설정)의 것인지 는, PC 의 버스상에 있는 전용의 배선의 전압을 사용해 전해진다. 자세한것은 ``어드레스'' 절 참조해 주세요. 최초의 디바이스는 I/O 어드레스 공간 에 배치되고 있었지만, 현재는 메인 메모리내의 공간을 사용하는 것도 있다 . I/O 어드레스는 단순히 "I/O", "IO", "i/o", "io" 라고 불리우는 것도 있다 . 또 「I/O 포트」라고 말하는 것도 사용된다. I/O 어드레스 (또는 인터럽트 등의 다른 패스 자원)은 이하의 2 개의 주요한 스텝에 의해 나누어진다.

  1. I/O 어드레스등을 카드(레지스터의 1 개)에 설정한다.
  2. 이 I/O 어드레스등을 디바이스 드라이버에 알린다.
위의 2개 스텝 처리는, 길에서 누군가의 집의 번지를 찾아내는 문제를 2 개 로 나눈 것과 닮아 있다. 당신은 번지를 찾아내지 않으면(그리고 write down)않되고, 이 집의 소유자는, 찾아낼 수 있도록 집 앞 에 번지를 표시하지 않으면 안된다. 컴퓨터의 경우에, 디바이스 드라이버는 어드레스를 취득하지 않으면 안 되고, 디바이스 하드웨어는 같은 어드레스를 특정 레지스터에 설정하지 않으면 안된다. 이 작업은 양쪽 모두 하지 않으면 안 되기 때문에, 한쪽만 설정하는 실수를 사용자가 할 수 있다. 이러한 경우에, 컴퓨터는 디바이스를 검출 할 수 없어 곤란해 진다. 예를 들면, 시리얼 포토에 어드레스를 할당할 목적으로 "setserial" 를 사용해도, "setserial" 는 드라이버에만 어드레스를 알려주지 않는다. setserial 는 시리얼 포트 자체의 어드레스는 설정 하지 않는다. 실제로 시리얼 포트가 어드레스와 차이가 나면(혹은 완전히 설 정되어 있지 않으면), 잘못된 어드레스를 드라이버에 설정하고 있는 것에 , 문제가 일어난다.

이 외에도 분명이 필요한 것으로서, 어떤 어드레스를 디바이스 드라이버가 사용하기 전에는, 그 어드레스가 카드에 설정되고 있지 않으면 안된다. 디바이스 드라이버는 컴퓨터가 시작된 직후에 동 작을 시작하는 것이 많기 때문에, PnP 설정 프로그램이 카드 어드레스 설정을 행하기 전에 디바이스 드라이버가(카드가 있을지 어떨지를 조사하는 등을 위해서)카드 에 억세스하려고 하는 것도 때로는 있다.이러한 경우에는, 비록 카드가 있어도(그러나, 아직 어드레스를 가지고 있지 않은), 카드가 발견되지 않는다라는 에러-메세지가 표시된다.

이전의 2 개의 단락의 I/O 어드레스에 관한 설명은, 다른 자원( ``IRQ --개요'', ``DMA 채널'', ``메모리 영역'' )에 대해서도 같게 의의할 수 있다. 이것들에 대해서는 이하의 3 번째 장에서 설명 합니다 .

2.4 IRQ --개요

이 설명을 읽은 뒤에 좀 더 자세한 것을 알고 싶은 경우에는 ``인터럽트 --상세''를 읽어 주세요. 여기서는 설명을 매우 간단하게 한다: 어드레 스 외에도, 취급하지 않으면 안 되는 인터럽트 번호(IRQ 5 등)라는 것도 있다. 이것은 IRQ(Interrupt ReQuest, 인터럽트 요구)번호라고 불리운다. 디바이스 드라이버가 통신을 하기 위해서는 카드의 어드레스를 알고 있을 필요가 있는 것은 이미 기술했다. 그러나, 역방향의 통신에 대해서는 어떨까? 또, 디바이스가 디바이스 드라이버에 즉시 전하지 않으는 안 되는 것이 있다면? 예를 들면 디바이스는, 메인 메모리에 보내지 않으면 안 되는 대량의 바이트열을 받았을지도 모른다. 이러한 경우에, 디바이스는 즉시 이 바이트를 가져오기 위하영 그것의 드라이버를 호출하고, 주기억 장치에 디바이스에서 가까운 전체 버퍼로부터 그들을 옮기는 것이 필요하다.

디바이스는 어떻게 해서 도움을 요청하여야만 하는가? 메인 데이타버스는 이미 사용되고 있는 것이므로, 이것을 사용하는 것은 할 수 없다. 그 대신에, 디바이스는 전용이 인터럽트 선(버스의 일부이다)에 전압을 설정한다. 이 선은 많은 경우, 그 디바이스를 위해서만 예약 되어 진다. 이 신호는 인터럽트라고 불리운다. 인터럽트 선에는 등가인 선이 16 개있어, 이것 들은 각자 (간접적으로)특정 디바이스 드라이버에 연결되어 있다. 각자 의 선에는 고유의 IRQ (Interrupt ReQuest)번호가 붙어 있다 . 디바이스는 인터럽트를 정확한 선으로 보내지 않으면 안 되고, 디바이스 드라이버는 정확한 선에서 인터럽트를 기다리지 않으면 안 된다. 어느 선에서 인터럽트가 일어나는지는 디바이스에 저장되고 있는 IRQ 번호에 의해 결정된다. 감시하는 IRQ 가 디바이스 드라이브에게 알려주는 것과같이, 디바이스 드라이버에는 이것과 같은 IRQ 번호를 설정하지 않으면 안된다.

디바이스 드라이버가 인터럽트(도움 요구)를 받으면, 디바이스 드라이버는 인터럽트가 발생된 이유를 조사하고, 인터럽트를 처리하는 적절한 동작을 하지 않으면 않된다. ISA 버스의 경우에는, 각각 디바이스에 고유의 IRQ 번 호가 필요하다. PCI 버스와, (ISA 에서도)특별한 경우에는 IRQ 를 공유하는 것도 할 수 있다.

2.5 DMA 채널

DMA 채널을 사용하는 것은 ISA 버스뿐이다. DMA 는 「Direct Memory Access(직접 메모리 억세스)」라는 의미이다. 이것은 디바이스가 CPU 로부터 컴퓨터 메인 버스를 계승하고, 바이트열을 메인 메모리에 직접 전송을 하는 것이 허가되고 있는 장소이다. 보통의 CPU 는 이러한 전송을 2 스 텝으로 처리로 한다:

  1. 디바이스의 I/O 메모리 공간으로부터 읽은 바이트열을 CPU 그것에송신한다.
  2. 이 바이트열을 CPU 로부터 메인 메모리에 보낸다.
DMA 를 사용하면 이 처리는, 디바이스로부터 메모리로 직접 바이트열을 보내는 1 개의 스텝이 된다. 그러나, 디바이스의 하드웨어에 이 기 능이 넣어저 있지 않으면 안 되기 때문에, 반드시 모든 디바이스에서 DMA 를 사용할 수 있는 것은 아니다. 또 메인 버스가 DMA 전송에 사요되고 있기 때문에, DMA가 동작하고 있을 때에는 CPU의 동작이 제한된다.

실제로 PCI 버스에는 DMA가 없지만, 그 대신에 DMA 보다도 좀 더 좋은 기능이 있다. 그것은 bus mastering이다. bus mastering의 동작은 DMA 와 닮아서, DMA 라고 불리우는 것도 있다 (예를 들면, "UltraDMA" 로 불리우는 하드 디스크 드라이브). 이 기능을 사용하면, 디바이스는 일시적으로 버스 의 소유자(bus master)가 되고, bus master가 CPU에 있는것 같이 바이트열 을 전송할 수 있다. bus mastering은 채널 번호를 전부 사용하지는 않는다. 왜냐하면 PCI 버스의 구조에서, PCI의 하드웨어는 현재의 bus master와 bus master가 되려하는 요구를 하고 있는 디바이스를 알수 있기 때문이다. 따라서, PCI 버스에 대한 DMA 채널 할당 은 없다.

ISA 버스상의 디바이스가 DMA 를 하려고 할 때, 이 디바이스는 인터럽트 요구처럼 많은 DMA 요구를 전용 요구선을 사용해 발생한다. 실제로 DMA 는 인터럽트를 이용해 처리하는 것도 할 수 있지만, 그러나 지연되기 때문에, DMA 요구라고 불리우는 특별한 타입의 인터럽트를 사용하는 편이 빠르다. 인터럽트와 같이, DMA 요구에는 번호가 붙여져 있고, 요구를 한 디바이스를 식별할 수 있다. 이 번호는 DMA 채널이라고 불리운다. DMA 채널은 메인 버스를 모두 사용(또 동시에 1 개밖에 동작할 수 없다. )하기 때문에, 실제로는 이것들모두가 같은 채널을 사용하는 의미이지만, 「DMA 채널」번호를 사용하면 「채널」을 사용하고 있는 디바이스를 식별 할 수 있다. 각「채널」의 현재 상태를 저장하고 있는 하드웨어 레지스터가 마더보드상에 있다. 이와 같이, DMA 요구를 하기 위해서는, 디바이스는 물리 디바이스의 레지스터에 저장되고 있는 DMA 채널 번호를 알고 있지 않으면 안 된다.

2.6 메모리 영역

일부의 디바이스에는 메인 메모리내의 어드레스 공간이 할당해져 있다. 이것은 많은 경우「공유 메모리(shared memory)」또는 「메모리맵 I/O(memory mapped I/O)」이다. 디바이스상의 ROM에 있는 것도 있다. bus-resources를 론을 할 때에는, 이것은 단순히 「메모리」라고 불리운다. 이 같은 디바이스도 I/O 어드레스 공간을 사용 한다

이러한 카드를 꽂았을 때는, 실제로는 (I/O 메모리가 아닌)메인 메모리에 대한 메모리 모듈을 꽂는 것이 된다. 이것은 ROM(Read Only Memory)과 공유 메모리의 어느 쪽에서도 상관하지 않는다. 이 메모리는 디바이스와 메인 메모리간의 직접 데이터「전송」의 수단으로서 사용된다. 그러나, 이것은 실제로는 전송이 아니다. 이것은, 디바이스는 자신 자신의 메모리에 데이 타를 쓰고, 그것이 메인 메모리에도 쓰여지게 하고있는것뿐이기 때문이다. 카드와 디바이스 드라이버의 어느것도, 이 영역이 어디에 있을지를 의식할 필요는 없다. 메모리 어드레스는 아마 매우 높은 위치에 놓여져 , 낮은 위치에 있는 컴퓨터의 메모리칩 어드레스와 겹쳐질 일은 없다.

ROM의 취급은 다르다. 이것은 프로그램(아마 디바이스 드라이버)으로 있는것이 많아, 디바이스와 함께 사용된다. 아마 이것은 Windows 상뿐만 아니라 Linux 상에서도 동작한다(??). 이것은 shadowed화할 필요가 있을지도 모른다. shadowed화라는 것은, 고속 동작을 하게 하기 위해서 ROM의 내용을 메인 메모리에 복사하는 것이다. 일단 shadowed화를 하면, 이 영역은 이제 「읽기전용」에서는 없어진다.

2.7 디바이스와 드라이버의 양쪽에 있어서의 "resources"

이와 같이, 디바이스 드라이버는 자신이 제어하는 하드웨어에 대해 어떠한 방법으로 「할당」되지 않으면 안된다. 이것은 bus resourse (I/O, 메모리, IRQ, DMA)를 물리적인 디바이스와 디바이스 드라이버의 소프트웨어 양쪽 에 고급하는 것에 의해 행해진다. 예를 들면, 시리얼 포토는(4 개 중)2 개 의 자원, 즉 IRQ 와 I/O 어드레스만을 사용한다. 이 값은 양쪽 모두의 디바이스 드라이버와 물리적 디바이스에 공급하지 않으면 안 된다. 드라이버(와 그 디바이스)는 /dev 디렉토리내에도 이름을 공급한다(ttyS1 등). 어드레스와 IRQ 번호는 물리적 디바이스 카드 레지스터 내(또는 마더보 -드상의 칩내)에 저장된다. 점퍼의 경우에, 이 정보는 반드시 디바이스 의 하드웨어(카드등)에 저장된다. 그러나 PnP 의 경우에는 보통 PC 의 전원을 끄면 레지스터의 데이터는 없어지게 되므로, resource data는 PC 의 전원을 넣을 때마다 매회, 각디바이스에 대해 새롭게 공급하여야 한다.

2.8 문제

PC 의 구조에서는 IRQ, DMA 채널, I/O 어드레스, 메모리 영역 의 수에 제한이 있다. 만일 디바이스의 수가 적고, 이들 모두가 표준화되어있는 bus resourse(고유의 I/O 어드레스와 IRQ 번호)를 가지고 있다면, 디바이스 드라이버를 디바이스에 할당할 때, 문제는 일어나지 않을 것이다. PC 상의 각디바이스는 다른 디바이스와 충돌하지 않는 고정 resourse를 가질 수 있기 때문이다. 다른 디바이스가 같은 I/O 어드레스와 IRQ를 갖는것도 없을 것이다. 그렇기 때문에, 각 디바이스 드라이버의 프로그램 중에 I/O 어드레스 와 IRQ 를 hard-coded하면 용이하므로. 매우 이야기가 간단하게 된다.

그러나, 현실은 그렇지 않다. 최근에는 다른 디바이스가 많이 있으므로 충돌은 비번하지는 않지만, 같은 타입의 디바이스를 복수로 사용해야만 하는 경우도 있다. 예를 들면, 복수가 다른 디스크 드라이버와 복수의 시리얼 포트를 사용하고 싶은 경우등이다. 이러한 이유 때문에, 디바이스에는 충돌을 회피할 수 있는, IRQ 와 어드레스를 설정할 수 있는 자유도가 필요하게 된다. 그러나, 클럭과 키보드 같은 일부의 IRQ 와 어드레스는 표준 치를 사용한다. 이러한 디바이스에는 이같은 자유도는 필요 없다.

bus resourse 할당에서 충돌 문제는 그외에, 디바이스 드라이버의 버스리소 스설정을 잘못해서 생기는 문제가 있다. 예를 들면, 사실은 디바이스에 IRQ 5 가 설정되고 있는데 설정 파일에는 IRQ 4 를 쓰고 있는 것 같은 경우이다. 이것은 다른 형식의 버스 자원 배정 에러이다.

버스자원 배정을 바르게 하면, 물리적 디바이스와 여기에 대응하는 디바이스 드라이버사이에 통신 채널이 확립된다. 예를 들면, 어떤 범위의 I/O 어드레스(자원)가 디바이스 드라이버와 하드웨어에 할당되어진 경우, 양자간에 일방통행의 통신 채널이 확립된 것으로 된다. 드라이 버는 명령어와 정보를 디바이스에 보내는것이 가능하다. 드라이버는 레지스터를 읽는 것에 의해 디바이스로부터 정보를 얻을 수 있으므로, 실제로 단순히 일방통행이라는 것이 아니다. 그러나, 이 방법으로는 디바이스 측에서 통신을 시작하는 것을 할 수 없다. 쌍방향 통신 채널을 만들기 위해서, 디바이스 IRQ 를 필요로 한다. 쌍방향 통신 채널이란, 디바이스 드라이버 에서도 디바이스에서도 통신을 시작할 수 있는 것이다.

2.9 시리얼 포토에 꽂은 디바이스를 PnP에 의해 검출

시리얼 포트에 cable로 접속한 외부 디바이스(외부부착 모뎀등)도 Plug-and-Play 라고 불리운다. 버스자원(IRQ 와 I/O 포토)를 필요로 하는 것은 시리얼 포토 자신뿐이므로, 이러한 접속 디바이스 자체에 버스 자원 을 배당하지 않는다. 그렇기 때문에, 실제로는 이들 디바이스에 PnP는 필요 하지 않다. 설령 그렇더라도, 이러한 외부 시리얼 디바이스에 대해서 PnP의 사양이 정해져 있다 .

PnP OS는 이러한 외부 디바이스를 검출하고, 그 디바이스의 모델 번호등을 읽는다. 이것에 의해, 그 디바이스용 디바이스 드라이버를 찾아내는 것이 가능해게 되므로, 특정 디바이스(예를 들면 /dev/ttyS1)를 사용하고 있는 것을 응용 프로그램에 대해 지시할 필요가 없게 된다. 디바이스가 접속되고 있는 시리얼 포트를(설정 파일등을 사용해)수동으로 지정하는 것도 가능하므로, (디바이스의 모델 번호를 지정하는 것이 있을지도 모른다) 어쨌든, PnP 의 「시리얼 포트」기능이 필요하다는 것은 아니다.


다음 이전 차례