2010-06-19 8 views
0

У меня есть два устройства, которые сопряжены с PCI. У меня также есть код для обоих устройств, которые используют общий код сокета. (Устройства первоначально были подключены MII/Ethernet.)Код сопряжения сокетов с драйвером PCI Linux

Теперь мне нужно написать драйвер устройства PCI для переноса пакетов между двумя устройствами.

Как получить доступ к дескрипторам файлов, открытым кодом сокета? Это то же самое, что доступ к файлу символьного устройства?

Драйвер PCI должен каким-то образом захватить пакеты из read() и write() в коде.

Спасибо!

ответ

0

Ответы на ваши вопросы: (1) У вас нет, и (2) нет.

Файловые дескрипторы представляют собой концепцию пространства пользователя, а драйверы ядра не взаимодействуют с концепциями пространства пользователя. (Да, они реализованы ядром, но другие драйверы устройств не могут напрямую играть с ними и не должны играть с ними даже косвенно.)

Что вы делаете, это реализовать методы, которые будут получать данные который буферизуется в доступном для ядра пространстве памяти и передает его на ваше оборудование, а затем получает данные с вашего оборудования и записывает (когда его спрашивают) в буфер в доступной для ядра памяти.

Вы сделаете это, внедрив API-интерфейсы драйвера персонального устройства, а также API-интерфейсы драйвера PCI, а затем зарегистрировав свой драйвер в качестве устройства PCI, а затем персональное устройство. Хотя некоторые из этих методов могут относиться к структурам файлов, они не будут структурами пользовательских земель, которые вы знаете и любите.

Для устройств, реализующих протоколы Ethernet, жизнь проще, потому что вместо этого вы реализуете интерфейс Net Device. Таким образом, все, что вам нужно написать, это части, необходимые для получения данных на вашем оборудовании и с вашего устройства.

Что вам нужно - это спецификации оборудования устройства, как вы управляете оборудованием с помощью регистров и регионов PCI.

Хорошей новостью является то, что вам не нужно делать это в одиночку - есть большое сообщество разработчиков ядра и несколько хороших (и текущих) книг по разработке для ядра Linux (см. Ниже).

Ссылки

+0

спасибо за быстрый ответ! Посмотрим, понимаю ли я то, что вы написали. Мне нужно написать драйвер PCI для целевого устройства. Драйвер также выделит интерфейс Ethernet со всеми функциями TX/RX. Теперь я открываю сокет, и здесь я смущен. У вас есть информация о «привязке»/«привязке» созданного сокета к конкретному Ethernet-устройству Ethernet? Есть еще одно устройство Ethernet ethernet, с которым я не хочу передавать данные. – StuffedB

+0

Чтобы ваше устройство отображалось как возможный сетевой интерфейс, вам придется загрузить драйвер в память. Драйвер зарегистрирует идентификаторы PCI, соответствующие вашему устройству.После этого вам нужно будет настроить драйвер с сетевым адресом (аналогично сопоставлению IP-адреса с eth0). В этот момент она, по сути, является сетевой карточкой и рассматривается как таковая ОС. –

 Смежные вопросы

  • Нет связанных вопросов^_^