LINUX.ORG.RU

Как ядро определяет какой модуль загружать?


0

0

Есть сетевая карта на National'овском контроллере. Соответсвенно обслуживается эта карта модулем natsemi.ko. Я немножечко подправил исходник, добавил для начала пару вызовов printk и собрал модуль my_natsemi.ko. Как мне заставить ядро грузить именно мой модуль при старте ситемы, а не дефолтный?

Дистры Fedora 5 и Debian Etch.

anonymous

>Как мне заставить ядро грузить именно мой модуль при старте ситемы, а не дефолтный?

Особо не погружался в проблему. Может быть, занести дефолтный драйвер в черный список? /etc/modprobe.d/blacklist

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

И что с того? Даже если так сделать, сетевой карты просто не будет видно, т.к. стандартный модуль не загружен. Нужно не запрещать загрузку, а изменить название модуля, который обслуживает устройство. Конечно, можно просто переименовать новый модуль в natsemi.ko, но это плохое решение, т.к. потом будет трудно отлечить патченый модуль от оригинального.

anonymous
()

А еще посмотри в сторону udev. То есть идея такая: написать правило, которое для твоего устройства грузит нужный драйвер. Я с такой ситуацией на сталкивался, но, быть может, решить ее получится именно так. То есть что-то вроде:

<правило отбора> RUN+="/sbin/modprobe my_driver"

В правиле отбора можно посмотреть vendor_id и device_id или название устройства. Но вот сейчас я тебе квалифицированнее вряд ли отвечу. Сам я с такими случаями не сталкивался. Может кто сейчас еще поможет.

Zubok ★★★★★
()

Насколько я помню, модули сетевых устройств автоматически ядром не загружаются. Их загрузку производят скрипты при старте системы (подъеме интерфейса). Попробуй поискать в /etc/ файлы, содержащие "natsemi"

grep -r -F natsemi /etc/

и поправить эти файлы...

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

Кроме того, надо обратить внимание на initrd.

sdio ★★★★★
()

Кстати, вот еще как можешь сделать (что-то из головы вылетело): natsemi загнать в blacklist, как я тебе и сказал, а my_natsemi добавить в /etc/modules. Стартовый скрипт то, что /etc/modules загружает, а то, что в blacklist -- не загружает.

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

С проблемой в итоге справился именно запретом запуска модуля natsemi с помощью blacklist. Похоже, за неимением лучшего решения, системе пришлось использовать мой модуль. :)

Команда grep -r -F natsemi /etc нашла упоминания в файлах /etc/sysconfig/hwconf и /etc/modprobe.conf
Первый, как я понимаю, написал kudzu(и что с того?).
Во вотором просто проставлялся псеводним:
> alias eth1 natsemi

Больше ничего не нашлось. Загружать модуль с помощью udev'a наверное возможно, но ни в Федоре ни в Дебайне я не заметил, чтобы так делалось. Короче, как грузятся модули - для пока меня загадка.

Если кому будет интересно, неплохое руководство по написанию правил для udev лежит тут: http://www.reactivated.net/writing_udev_rules.html

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

Debian

$ cat /etc/udev/rules.d/z25_persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, probably run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.

# PCI device 0x8086:0x1229 (e100)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:d0:b7:70:2c:8e", NAME="eth0"

# PCI device 0x8086:0x1229 (e100)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:02:b3:21:f7:9f", NAME="eth1"

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

>Короче, как грузятся модули - для пока меня загадка.

Ну а где загадка? Модули грузятся просто. Читается Vendor_id:Device_id из PCI-контроллера устройства. Потом находится соответсвующий драйвер. Список соответсвий пары Vendor_id:Device_id с драйвером можно обнаружить в /lib/modules/<версия_ядра>/modules.pcimap, который генерится depmod. Этот драйвер и загружается.

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

В Debian можешь посмотреть в файл /etc/udev/hotplug.rules

# check if the device has already been claimed by a driver
ENV{DRIVER}=="?*", SUBSYSTEM!="input", GOTO="hotplug_driver_loaded"

# this driver is broken and should not be loaded automatically (see #398962)
SUBSYSTEM=="platform", ENV{MODALIAS}=="i82365", GOTO="hotplug_driver_loaded"

# load the drivers
ENV{MODALIAS}=="?*",    RUN+="/sbin/modprobe --use-blacklist $env{MODALIAS}"
SUBSYSTEM=="ide",       ENV{MODALIAS}!="?*",    RUN+="ide.agent"

SUBSYSTEM=="pnp",       ENV{MODALIAS}!="?*",    RUN+="/bin/sh -c 'while read id; do /sbin/modprobe --use-blacklis
t pnp:d$$id; done < /sys$devpath/id'"

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