LINUX.ORG.RU

Ответ на: комментарий от Harald

Не понял ( У меня есть устройство, использующее драйвер N я делаю rmmod N драйвер выгружается, далее я делаю modprobe НовыйДрайвер Драйвер подгрузился, а как устройство поймёт, что нужно использовать именно этот НовыйДрайвер ?

labuten
() автор топика
Ответ на: комментарий от labuten
  1. Устройство ничего не понимает, оно тупое, у него нет сознания

  2. Драйвер при загрузке обычно делает ресет устройства

  3. Это драйвер использует устройство, а не устройство драйвер

Harald ★★★★★
()

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

labuten
() автор топика
Ответ на: комментарий от labuten

Обычно драйвер сам находит все подходящие ему устройства. Иногда могут быть соответствующие настройки в параметрах командной строки, передаваемые вместе с insmod,modprobe или командной строке ядра

Harald ★★★★★
()

Есть нюансы. Если «старый» в ядре а не модулем, то нужно пересобрать ведро исключив его. Если модулем, то самое простое кроме как писали выше rmmod, не забыть удалить старый модуль. Но при обновлениях ведра вы все равно получите возврат модуля. Так что к таким вещам нужно подходить осторожно.

anc ★★★★★
()

Я так и не понял, как указать используемый драйвер для устройства. Допустим у меня есть сетевое устройство eth0 (виртуальное, в virtualbox) где находятся его настройки? (я хочу попробовать, указать этому устройству, использовать новый драйвер)

labuten
() автор топика
Ответ на: комментарий от anonymous

уважаемый аноним. Что я должен был понять из этой ссылки? rmmod insmod? Каким образом загруженный мной драйвер будет использовать виртуальное устройство virtualbox ? Чтото так не работает. Если знаете что следует сделать, отпишите хотябы 2 строки с объяснением.

labuten
() автор топика

Драйвера в линуксе могут быть встроены в ядро или поставляться модулями. Если у вас драйвера модульные, то важно понимать, что есть модуль - это файл с точками входа и выхода для ядра (ну ещё параметры встроены в модуль). Вам уже указали, что нужно использовать rmmod для выгрузки модуля ядра со старой версией драйвера и загрузить новый, но т.к. вы не указали деталей, что и как у вас устроено, отписавшиеся предположили, что новый модуль у вас лежит в новом месте. Тут следует упомянуть понятие загрузки модуля ядра, есть две команды, insmod которая загружает конкретно файл по указанному пути и modprobe которая ищет модуль в стандартных директориях (обычно, /lib/modules/*kernel-name*/) и потом его загружает.

Опишите, пожалуйста всю проблему и ситуацию, что вы хотите получить. Телепатов совсем не много, война почти всех выкосила.

PS. Устройство не загружает драйвера, драйвера загружаются ядром ОС, устройство только предоставляет свои идентификаторы, по которым уже ядро находит нужный драйвер (да, в модулях встраивают эти идентификаторы для идентификации).

nickleiten ★★★
()
Ответ на: комментарий от nickleiten

Спасибо за внятное сообщение.

Описываю, свою ситуацию и что я хочу получить. У меня есть virtualbox и я на ней провожу тесты. В данном случае мне нужно разобраться, как работает драйвер сетевого устройства (устройства которого у меня нету). Я предположил, что можно перенаправить данные из виртуального устройства (которое использует драйвер e1000 ) на обработку в драйвер (в работе которого мне следует разобраться). Будет «криво» но у меня задача минимум, хотябы данные в «новый драйвер» перенаправить. Вот я и предположил, что гдето в системе, есть конфигурационный файл, где можно принудительно указать виртуальному устройству, использовать новый драйвер.

labuten
() автор топика
Ответ на: комментарий от labuten

Исходники e1000 доступны, его можно почитать и узнать, что и как делается. В идеале, нужно прочитать linux device drivers development, она доступна в сети. Там все нюансы описаны.

Если вам нужно перехватывать данные, то придётся или писать свой драйвер с теми же идентификаторами сетевой карты и этим новым драйвером подменять существующий (либо в runtime без перезагрузок, с помощью rmmod и insmod команд, либо в файловой системе гостевой ОС, чтоб при загрузке уже загружался ваш новый модуль) или редактировать существующий, добавить в нужных точках перехват данных.

Если задача стоит именно в перехвате данных, то есть более простые механизмы без привязки к драйверу устройства. Например, подсистема netfilter в ядре позволяет редактировать пакеты до попадания в физический интерфейс.

По поводу конфигурационного файла ОС для загрузки нужных модулей, при установке новых модулей в /lib/modules/… там же для каждой версии ядра создаются файлы modules.* в которых записана нужная информация для быстрого поиска нужных модулей и их зависимостей (да, модуль может загружать другие модули автоматически). Но эти файлы редактировать руками не рекомендуется, лучше положить новый модуль и выполнить команду depmod, которая сама их перепишет.

nickleiten ★★★
()
Ответ на: комментарий от labuten

Если устройство висит на шине, поддерживающей перечисление, USB или PCI, то драйвер шины последовательно дёргает все драйверы на предмет, не твоё ли это устройство. Для embedded систем название модуля драйвера явным образом указывается в device tree.

Если модуль драйвера вкомпилен в ядро, то он будет инициализироваться всегда, просто остальные куски кода при отсутствии устройства не будут выполняться.

Harald ★★★★★
()
Ответ на: комментарий от labuten

Это булшит, а не ответ. Драйвер шины ничего не дёргает. Он перечисляет устройства на шине и создаёт эти устройства. При создании устройства ядро создаёт его представление в sysfs и генерирует uevent. Демон udev ловит этот uevent, получает из sysfs атрибут устройства modalias, вызывает modprobe с значением этого атрибута в качестве аргумента. Modprobe лезет в файл /lib/modules/kver/kernel/modules.alias ищет в нем пару этот алиас и имя модуля, загружает этот модуль в ядро. Модуль регистрирует драйвер, драйвер находит существующие устройства, которые ещё никаким драйвером не обслуживаются, подходящие этому драйверу, и привязывается к этим устройствам. В принципе любой драйвер, неважно вкомпилированный в образ ядра или в модуль, можно отвязать от устройства вручную.

Так что правильный способ указать модуль, содержащий драйвер устройства, это modules.alias.

iliyap ★★★★★
()
Последнее исправление: iliyap (всего исправлений: 1)
Ответ на: комментарий от labuten

Указать какой драйвер не нужно загружать.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.