어떤 커널 구성 옵션이 내 드라이버를 활성화하는지 어떻게 알 수 있나요?

어떤 커널 구성 옵션이 내 드라이버를 활성화하는지 어떻게 알 수 있나요?

핵심요약:
USB DAQ 장치용 드라이버를 컴파일하려고 할 때 커널을 재구성했습니다. 드라이버는 기본 배포판의 커널에서 컴파일하는 것을 거부했지만 모든 것이 내가 조정한 커널에서 작동했습니다.

드라이버는 2개의 커널 모듈로 구성됩니다. 어떤 옵션을 변경했는지 알고 있지만 어떤 특정 구성 옵션이 내 드라이버를 활성화했는지 알고 싶습니다. 가능한 모든 옵션 조합을 시도(커널 구성 및 컴파일)하지 않고 이 문제를 해결할 수 있는 방법이 있습니까?

더 긴 이야기:
openSUSE 11.4와 같은 다양한 배포용 드라이버와 함께 제공되는 Advantech USB-4702 DAQ 장치가 있습니다. 소스에서 컴파일해야 하며 지원되는 배포판에서 제대로 컴파일되어야 합니다(커널 2.6.37.6-24-desktop에서 openSUSE 11.4 32비트를 사용해 보았습니다).

SLES 11 SP 3(64비트, 커널 3.0.76-0.11-기본값)에서 작동시키려고 하면 컴파일 오류가 발생합니다. 그 중 하나는 소스 코드의 다음 코드로 인해 발생합니다.

#ifndef CONFIG_USB
#  error "This driver needs to have USB support."
#endif

그래서 실행 중인 커널(/proc/config.gz에서)의 구성 옵션을 살펴본 결과 CONFIG_USB가 활성화되어 있음을 발견했습니다(비활성화하면 USB 키보드와 마우스를 사용할 수 없게 될 것 같습니다). 그런 다음 커널 구성을 사용하기 시작했고 그 중 일부(일부는 모듈로)를 활성화했습니다. 커널을 컴파일하고 설치하고 재부팅했습니다. 그러면 드라이버가 오류나 경고 없이 컴파일되었으며 이제 장치를 사용할 수 있습니다.

문제는,드라이버 컴파일을 "활성화"하는 특정 옵션이 무엇인지 어떻게 알 수 있습니까?어떤 옵션이 변경되었는지 알고 있지만 드라이버에 필요하지 않은 것은 활성화하고 싶지 않습니다. 나는 가능한 모든 옵션 조합으로 커널을 구성하고 컴파일하고 싶지 않습니다.

답변1

나는 문제의 드라이버가 모듈로 컴파일되었다고 가정합니다. 필수 구성 요소도 모듈로 빌드하면 쉽게 찾을 수 있습니다. 모든 모듈과 해당 옵션은 커널 makefile에 문서화되어 있습니다. 따라서 grep을 사용하여 모듈 이름을 찾을 수 있습니다.

하지만 먼저 드라이버가 어떤 모듈에 의존하는지 알아내야 합니다. 따라서 a를 발행 lsmod하고 특히 Column에서 드라이버를 검색하십시오 Used by. 드라이버를 예로 들어보겠습니다 rt2800usb.

$ lsmod | grep rt2800usb
rt2800usb  15392   0  
rt2x00usb  8306    1  rt2800usb
rt2800lib  59262   1  rt2800usb
rt2x00lib  34431   3  rt2x00usb,rt2800lib,rt2800usb
usbcore    146570  7  rt2x00usb,rt2800usb

rt2x00usb이는 내 드라이버에 모듈 및 rt2800lib가 필요하다는 것을 알려줍니다 rt2x00lib. usbcore이제 Makefile에서 검색합니다. .o검색 문자열의 앞뒤 공백 에 주의하세요.

$ fgrep -r --include=Makefile ' usbcore.o'
drivers/usb/core/Makefile:obj-$(CONFIG_USB) += usbcore.o

$ grep -Pr --include=Makefile ' rt2(x|8)00(usb|lib)\.o'
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2X00_LIB) += rt2x00lib.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2X00_LIB_USB) += rt2x00usb.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2800_LIB) += rt2800lib.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2800USB) += rt2800usb.o

여기에는 이러한 모듈을 빌드하는 데 필요한 구성 옵션이 있습니다. 범인을 즉시 찾을 수 없다면 종속성의 종속성을 좀 더 자세히 검색해 보십시오. 이름을 추측할 수 있다면 내장 객체(모듈과 반대)에도 도움이 될 수 있습니다.

(이 기사의 모든 명령줄 출력은 가독성을 위해 가볍게 압축되고 형식이 다시 지정되었습니다.)

답변2

추가 실험을 통해 주석 중 하나에서 내가 주장한 내용을 확인할 수 있습니다. CONFIG_USB옵션에는 값이 있어야 합니다 Y. m충분하지 않습니다. 그런데 openSUSE 11.4의 커널에는 Y기본적으로 이 옵션이 있고 SLES11SP3의 커널에는 m.

불행히도 오류 메시지는 명확하지 않습니다.

설정하는 쉬운 방법은 옵션을 make menuonfig선택하는 것 입니다.Y호스트 측 USB 지원아래에장치 드라이버->USB 지원.

답변3

make config(or or)을 사용할 때 make menuconfig나타나는 메시지와 질문은 make xconfig다음에서 비롯됩니다.커널 구성소스 트리의 파일. 그것들이 많이 있습니다. find . -name Kconfig나무 꼭대기에서 그것들을 살펴보세요.

다음은 3.10.1/drivers/misc/Kconfig의 예입니다:

config AD525X_DPOT_I2C
        tristate "support I2C bus connection"
        depends on AD525X_DPOT && I2C
        help
          Say Y here if you have a digital potentiometers hooked to an I2C bus.

          To compile this driver as a module, choose M here: the
          module will be called ad525x_dpot-i2c.

분야에 대한 논의가 있습니다.여기, 그러나 충분히 사용하면 무슨 일이 일어나고 있는지 확인하는 것이 어렵지 않습니다 menuconfig. 일반적으로 도움말에 제공되는 버전이 있으며 검색 기능을 사용하면(누르기 /) 반환된 클릭도 이를 보고합니다. 예를 들어 make menuconfig"AD525"를 검색하면 다음과 같습니다.

│ Symbol: AD525X_DPOT_I2C [=n]                                                                                                                                         │  
│ Type  : tristate                                                                                                                                                     │  
│ Prompt: support I2C bus connection                                                                                                                                   │  
│   Location:                                                                                                                                                          │  
│     -> Device Drivers                                                                                                                                                │  
│       -> Misc devices                                                                                                                                                │  
│ (1)     -> Analog Devices Digital Potentiometers (AD525X_DPOT [=n])                                                                                                  │  
│   Defined at drivers/misc/Kconfig:34                                                                                                                                 │  
│   Depends on: AD525X_DPOT [=n] && I2C [=y]   

"Tristate"는 옵션이 yes/no/module이고 "bool" 및 "int" 유형이 있음을 의미합니다. 여기서 "종속 대상"(Kconfig 파일의 소스에 해당)에는 올바른 종속성을 선택했는지 여부를 나타내는 표시기가 포함되어 있습니다( [=n] [=y]). 이것은 매우 유용한 정보입니다.선택사항으로 나타나지도 않습니다올바른 전제 조건을 선택할 때까지.

이상적으로는 모듈을 작성하는 사람이 다음을 포함해야 합니다.커널 구성데이터를 소스 트리에 원활하게 삽입하고 일반적인 수단을 통해 구성할 수 있도록 합니다. 이를 살펴보면 종속성을 추적할 수 있어야 합니다.

관련 정보