7. 나의 현재의 설정상태는 무엇인가?

여기서의 "설정" 은 PnP 버스 리소스들(어드레스, IRQ, DMA)을 할당하는 것을 의미한다. 각 디바이스마다 이 질문에 대한 답은 두 부분으로 구성된다. 이 두 부분은 반드시 서로 일치해야만 한다.

  1. 그 디바이스 드라이버 소프트웨어의 설정상태는 무엇인가? 즉, 드라이버는 하드웨어의 설정상태를 무엇이라고 생각하고 있는가?

  2. 디바이스 하드웨어상의 설정상태(만일 설정되어있다면)는 무엇인가?

당연한 말이지만 디바이스 하드웨어의 설정내용과 그 드라이버의 내용은 일치해야만 한다(또 보통은 일치한다). 만일 뭔가 제대로 동작하지 않는다면, 그 원인은 두 내용이 일치하지 않기 때문일 수도 있다. 이는 드라이버가 디바이스의 실제의 하드웨어 설정내용과는 다른 잘못된 정보를 가지고 있음을 뜻한다. 이런 상황은 문제를 야기한다. 당신이 사용하는 소프트웨어가 어디가 잘못된 것인지에 대한 적절한 답을 제시해주지 못한다면(혹은 자동으로 설정을 바로잡아주지 못한다면), 당신이 직접 하드웨어 디바이스의 설정상태와 드라이버의 설정상태를 조사하여야 한다. 리눅스 디바이스 드라이버들은 몇몇 경우 자신의 모든 내용을 알려주지만, 그에 반해 손수 하드웨어에 세팅된 내용들을 알아내는 것은 쉬운 일이 아니다.

또다른 문제는, 화면에 설정상태에 대한 메시지들이 나타날 경우 그것이 디바이스 드라이버의 설정상태를 의미하는 것인지, 아니면 디바이스 하드웨어의 상태를 뜻하는 것이지, 아니면 양자 모두인지가 분명치 않을수 있다는 점이다. 디바이스 드라이버가 하드웨어의 설정을 담당했거나 아니면 하드웨어의 설정을 체크해본 후라면 드라이버는 올바른 정보를 가지고 있을 것이다.

하지만 때로는 드라이버가 스크립트로부터 잘못된 리소스 정보를 제공받거나, 잘못된 리소스 파라메터들이 모듈에 전달되거나, 아예 리소스 정보를 전달받지 못해서 잘못된 디폴트 리소스 상태를 사용해버리는 경우가 있다. 예를 들어, "setserial" 사용시 드라이버에게 잘못된 리소스 설정 정보를 전해준다면 드라이버는 아무 의심없이 그 정보를 받아들일 것이다.

7.1. 부트시의 메시지

설정내용에 관한 어떤 정보들은 컴퓨터 시작시 BIOS 나 리눅스가 화면에 출력시키는 메시지를 통해 얻을 수도 있다. 이 메시지들은 번개처럼 지나가버려 읽기가 힘들지만 일단 스크롤이 멈추면 Shift-PageUP 키를 눌러서 뒤로 돌려볼수 있다. 앞쪽으로 스크롤 시키려면 Shift-PageDown 키를 누른다. 쉘 상태에서 언제든 "dmesg" 라고 입력하면 리눅스 커널이 출력시켰던 메시지를 볼수 있지만, 이때는 아주 중요한 몇가지 내용들과 BIOS 가 출력한 내용들은 볼수 없다. 리눅스가 출력시킨 메시지들은, 때로는 단지 디바이스 드라이버가 생각하고 있는, 즉 잘못된 설정파일을 참조해 알아낸 설정내용일 수도 있다.

BIOS 메시지는 부팅 당시의 실제의 하드웨어 설정내용을 보여주지만, 나중에 isapnp 나 pci 유틸리티들이나 디바이스드라이버가 이 설정을 바꿔버릴 수가 있다. BIOS 메시지는 리눅스가 출력하는 정보보다도 앞서 출력된다. Shift-PageUp 을 사용해서 메시지를 읽는 대신, "Pause" 키를 눌러서 동작의 진행을 멈추게 해버리는 방법도 있다. 아무 키나 누르면 진행이 재개된다. 하지만 일단 리눅스가 메시지를 출력하기 시작하면 더이상 "Pause" 키는 먹지 않는다. 리눅스의 메시지 출력은 중간에 멈출수가 없기 때문이다.

7.2. 나의 디바이스 드라이버들의 설정상태는?

명령행 상태에서 실행시켜 디바이스 드라이버를 설정시키는 프로그램들이 있다(가령 시리얼 포트에 대한 "setserial" 명령). /proc 디렉토리의 내용이 도움이 될 것이다. 이 디렉토리 밑의 많은 화일들은 버스 리소스 정보를 담고 있다. 그중 몇가지만 여기서 언급할 것이다. /proc/ioports 는 그 드라이버가 사용하는(혹은 사용하는 것으로 잘못 알고 있는) I/O 어드레스를 보여줄 것이다. 하드웨어가 반드시 이 정보대로 세팅되어있지 않을수도 있다.

/proc/interrupts 는 단지 현재 사용중인 인터럽트들만을 보여준다. 따라서 드라이버들에 할당되기는 했으나 현재 사용중은 아닌 많은 인터럽트들은 나타나있지 않을 것이다. 예를 들어, 당신의 플로피 드라이브에 플로피 디스크가 들어있고 또한 사용가능한 상태라 해도, 실제 사용중인 상태가 아니라면 그에 해당하는 인터럽트는 나타나있지 않을것이다. 또한, 앞서도 설명했듯이 여기에 인터럽트 번호가 나와있다고 해서, 하드웨어에도 그 정보 그대로 셋팅됐음을 의미하는 것은 아니다. 하드웨어가 이 정보대로 셋팅되어있지 않았음을 알수있는 한가지 실마리는, 이 인터럽트에 의해 생성된 인터럽트 번호가 0 인 경우이다. 더구나 어떤 인터럽트들이 발해졌다해서 그것이 거기에 적힌 특정 디바이스에 의해 발생한 것이라고 보증할 수도 없다. 현재 사용중이 아닌 다른 디바이스가 예전에 발생시켰던 인터럽트일수도 있기 때문이다. (커널이) 현재 사용중이지 않은 디바이스라도 여러가지 원인으로 인해 계속 인터럽트를 발생시키는 수가 있다.

7.3. 나의 하드웨어 디바이스들의 설정상태는?

PCI 버스상의 디바이스들에 어떤 버스 리소스들이 할당되었는지는 "lspci" 나 "scanpci" 명령을 사용하면 쉽게 알아낼 수 있다. 커널 2.2 의 경우라면 /proc/pci 을 보고, 그 이후의 커널이라면 /proc/bus/pci 를 보라. /proc/pci 에 나타나는 IRQ 들은 16 진수로 표현된다. /proc/bus/pci/devices 을 해독하느라 고생할 필요는 없다. "lspci" 가 알아서 해독해주기 때문이다.

PCI 에 대해서는 대부분의 경우 그 하드웨어가 어떻게 설정되었는지만 볼수 있을 뿐 어떤 리소스를 필요로하고 있는지는 볼수 없을 것이다. 어떤 경우에는 단지 베이스 어드레스(어드레스 영역의 최초번지)만을 볼수 있을 뿐 그 끝번지는 볼수 없을수도 있다. 영역 전체를 볼수있는 경우라면 얼마나 많은 바이트의 어드레스 리소스가 필요한지를 알 수 있을 것이다. 따라서 어떤 경우에는 요구되는 리소스양을 계산해서 필요하다면 다른 어드레스 영역에 그만큼을 셋팅(setpci -- 사용법이 어렵다)시켜줘야 할수도 있다. 디바이스는 스스로 어드레스 영역의 크기를 알고 있으므로 당신은 그저 그 디바이스에게 새로운 베이스 어드레스가 뭔지만 가르쳐주면 된다.

ISA 버스의 경우에는 pnpdump --dumpregs 명령을 시도해 볼수는 있지만 이것은 확실한 수단은 아니다. 그 출력도 암호문처럼 난해하긴 하지만 해독해볼수는 있다. pnpdump 가 "시도한" (그래서 거기있는 어떤 디바이스로부터 알아낸) read-port 어드레스와, 그 발견된 디바이스가 가진 I/O 어드레스를 혼동해서는 안된다. 이 둘은 같지않다. ISA 버스상의 실종된 하드웨어(PnP 및 legacy)를 찾으려면 "scanport" 라는 프로그램을 사용해보라. 하지만 이 프로그램은 PC 를 먹통으로 만들수도 있음에 유의하라. 이 프로그램은 IRQ 를 알려주지도 않을 것이고 발견된 하드웨어가 뭔지 친절히 확인해주지도 않을 것이다.

부팅시에 BIOS 가 출력하는 메시지는 그 순간의 하드웨어 설정상태를 알려줄것이다. 만일 BIOS 만이 설정을 담당한다면 이 설정상태는 계속 유지될 것이다. 리눅스가 출력하는 메시지내용중 일부는 드라이버들이 커널의 PnP 함수를 사용해 버스 리소스값들을 조사및 설정했음을 알리는 것일수도 있다. 이 값들은 올바른 값이어야 한다. 다만, 디바이스가 보내온 메시지의 내용은 어떤 설정화일내의 값(즉, 드라이버가 생각하고 있는 값)을 그대로 출력한 것일 뿐임에 주의하라. 물론 디바이스가 제대로 동작한다면 디바이스의 설정상태와 드라이버의 설정상태는 동일하게 될 것이다.

어떤 사람들은 윈도우즈를 써서 버스 리소스가 어떻게 설정되어있는지 알아보기도 한다. 불운하게도, 전원을 끄면 하드웨어는 자신의 버스 리소스 설정을 잊어버리기 때문에 그 설정내용은 리눅스때의 것과는 다를수 있다. 때로는 똑같은 값일 수도 있는데, 이는 BIOS 가 설정한 값을 윈도우즈도 리눅스도 그대로 인정하고 받아들이는 수가 많기 때문이다. 하지만 윈도우즈나 리눅스가 설정을 담당하는 경우에는 두 운영체제는 서로 다른 값으로 설정시킬 수도 있다. 따라서 디바이스들이 양 운영체제에서 똑같은 값으로 설정되리라 기대해서는 안된다.