2010-06-19 1 views
0

저는 PCI와 인터페이스되는 두 개의 장치가 있습니다. 또한 일반 소켓 코드를 사용하는 두 장치 용 코드가 있습니다. 장치는 원래 MII/이더넷으로 연결되었습니다.소켓 코드와 Linux PCI 드라이버 인터페이스

이제 두 장치간에 패킷을 전송하기 위해 PCI 장치 드라이버를 작성해야합니다.

소켓 코드로 열린 파일 설명자에 어떻게 액세스합니까? 문자 장치 파일에 액세스하는 것과 동일합니까?

PCI 드라이버는 어떻게 든 코드에서 read() 및 write() 패킷을 캡처해야합니다.

감사합니다.

답변

0

귀하의 질문에 대한 답변은 다음과 같습니다. (1) 귀하는 아니며 (2) 아니오.

파일 설명자는 사용자 공간 개념이며 커널 드라이버는 사용자 공간 개념과 상호 작용하지 않습니다. (예, 그들은 커널에 의해 구현되지만, 다른 장치 드라이버는 직접적으로 그들과 놀지 않아도 간접적으로 그들과 놀아서는 안됩니다.)

당신이하는 일은 데이터를받을 방법을 구현하는 것입니다 커널 액세스 가능 메모리 공간에 버퍼링 된 데이터를 하드웨어로 전송 한 다음 하드웨어에서 데이터를 수신하고 요청시 커널 액세스 가능 메모리의 버퍼에 데이터를 기록합니다.

문자 디바이스 드라이버 API와 PCI 디바이스 드라이버 API를 구현 한 다음 드라이버를 PCI 디바이스로 등록한 다음 문자 디바이스로 등록하면됩니다. 이 방법 중 일부는 파일 구조를 나타낼 수 있지만, 사용자가 알고 사랑하는 사용자 구조는 아닙니다.

이더넷 프로토콜을 구현하는 장치의 경우 Net Device Interface (네트워크 장치 인터페이스)를 대신 구현하므로 수명이 더 쉽습니다. 이렇게하면 하드웨어와 데이터를주고받는 데 필요한 부분 만 작성하면됩니다.

디바이스 하드웨어 사양, PCI 레지스터 및 영역을 사용하여 하드웨어를 제어하는 ​​방법이 필요합니다.

좋은 소식은 커널 개발자 커뮤니티가 있고 Linux 커널을 개발할 때 좋은 책이 많이 있다는 것입니다 (아래 참조).

참조

+0

빠른 응답 주셔서 감사합니다! 필자가 작성한 내용을 이해하는지 보도록하겠습니다. 대상 장치 용 PCI 드라이버를 작성해야합니다. 드라이버는 또한 모든 TX/RX 기능을 갖춘 이더넷 인터페이스를 할당합니다. 이제 소켓을 열어 혼란 스럽습니다. 생성 된 소켓을 특정 이더넷 PCI 장치에 "연결"또는 "바인딩"하는 것에 대한 정보가 있습니까? 데이터를 전송하고 싶지 않은 다른 PCI 이더넷 장치가 있습니다. – StuffedB

+0

장치가 가능한 네트워크 인터페이스로 나타나려면 드라이버를 메모리에로드해야합니다. 드라이버는 장치와 일치하는 PCI ID를 등록합니다.그런 다음 네트워크 주소로 드라이버를 구성해야합니다 (IP 주소를 eth0에 매핑하는 것과 유사). 그 시점에서 그것은 모든 의도와 목적을 위해 네트워크 카드이며, OS에 의해 그러한 것으로 취급됩니다. –