2013-11-21 4 views
2

저는 PCIe 하드웨어 장치를 PCI Express를 통해 다른 시스템으로 내보내는 관리 시스템을 가지고있는 프로젝트에서 작업하고 있습니다. 나는 작동중인 관리 커널 모듈을 가지고 있지만 수출하는 장치에 관리 시스템에 이미로드 된 드라이버가 없는지 확인하는 방법을 찾아야합니다. 그렇지 않으면 동일한 드라이버가 2 개의 다른 시스템에서 액세스 할 것이기 때문에 장치가 충돌로 끝납니다. & 분명히 문제가 발생합니다.특정 장치 (다른 커널 모듈의 코드)에서 커널 모듈을 언로드하십시오.

예를 들어 Manager에 이중 포트 Intel 100MBps NIC 장치가 설치되어 있고 시스템에 2 개의 PCIe 끝점이 표시되어 있다고 가정합니다 (예 : Fn 0 & 1). 인텔 모듈 e1000이 두 장치 모두에로드됩니다. 해당 장치의 포트 2를 다른 시스템으로 내보내려면 e1000 모듈에서 "분리"하고 싶습니다.

커널을 해킹하거나 e1000 드라이버의 프로브 기능을 조정하지 않고도이 작업을 수행 할 수있는 확실한 방법을 알고 있습니까? 두 개의 NIC 장치 모두에 모듈을 함께 제거하기 때문에 단순히 rmmod를 수행 할 수는 없습니다. NIC를 아직 관리 시스템에서 작동 상태로 유지하고 싶지는 않지만 e1000 드라이버가 아직로드되지 않았 으면합니다.

기본적으로 rmmod는이 작업을 수행하지만 드라이버가 소유 한 &에 대해 검사 된 모든 장치의 드라이버를 제거합니다. 리눅스에게 "이 특정 장치에 대해서만 모듈을 언로드"하라는 어떤 식 으로든? Windows의 경우 장치 관리자에서 장치를 마우스 오른쪽 단추로 클릭하는 것과 같습니다. & "사용 안함"을 선택하십시오.

답변

2

Linux 드라이버 모델에서 장치/드라이버 페어링을 담당하는 메커니즘을 "버스"(일반적으로/sys/bus의 항목을 통해 제어 됨)라고합니다. 문제는 디바이스가 부착 된 특정 버스 드라이버가 이러한 종류의 동작을 지원해야한다는 것입니다 (일반적인 경우이 기능을 지원하는 것은 결코 쉬운 일이 아닙니다).

특히 PCI의 경우 "pci hotplug"가 활성화 된 경우/sys/bus/pci의 해당 "hotplug"항목에 숫자를 쓰면 pci 버스에서 장치를 시작할 수 있습니다 (또한 다시 연결할 수 있음). 다시 버스 재검색을 트리거하여 다시 그들을). 문제는 나중에 리눅스 장치 하위 시스템이 문제의 장치 ID에 이미 등록 된 드라이버보다 드라이버를 선호하도록 설득해야하기 때문에 나중에 시작됩니다.

일반적으로 등록 된 드라이버는 일종의 목록에 추가 된 다음 하나씩 시도하여 둘 중 하나가 "* _device_id"테이블에 새 장치 또는 다시 사용할 수있는 장치를 나열하는지 확인합니다. PCI 하위 시스템이 "처음 등록한 첫 번째 시도"순서로 드라이버를 사용하려는 경우 목표를 달성하기 위해 해킹해야합니다.

0

장치에서 PCI 드라이버를 바인드 해제하려면 sysfs에서 드라이버의 unbind 파일을 사용하십시오. Documentation/ABI/testing/sysfs-bus-pci에서

:

 
/sys/bus/pci/drivers/.../unbind 
Description: 
     Writing a device location to this file will cause the 
     driver to attempt to unbind from the device found at 
     this location. This may be useful when overriding default 
     bindings. The format for the location is: DDDD:BB:DD.F. 
     That is Domain:Bus:Device.Function and is the same as 
     found in /sys/bus/pci/devices/. For example: 
     # echo 0000:00:19.0 > /sys/bus/pci/drivers/foo/unbind 
0

는 해당 장치에 대한 값을 가능하게

예를 재설정하여 특정 PCI 장치를 해제 할 수 있습니다

echo 0 > /sys/bus/pci/devices/0000:00:1a.2/enable 
4

당신하여 장치 드라이버를 비활성화 할 수 있습니다 쓰기 방법 :

  • sudo -i 또는 명령 쓰기 sudo을 사용하여 루트 사용자로 작동하십시오.그리고 아래 절차를 따르십시오 :
  • 고토 /sys/bus/pci/<driver_name>/ 폴더.
  • 명령을 내립니다. echo -n 0000:03:00.1 > unbind
  • 여기서 0000:03:00.1은 드라이버를 검색하려는 장치입니다.
  • sysfs에 대한 아이디어를 얻으려면 this 링크를 읽으십시오.
관련 문제