Как выгрузить драйвер linux

Обновлено: 08.07.2024

Возможен ли в Linux перенос драйверов? (Есть ли возможность взять рабочий драйвер из другой системы?)

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Возможен ли в Linux перенос драйверов?

Несколько дней назад установил Mandriva 2009. При этом очень удивило крайне низкое качество видео (карточка - NVidia GF6200). То есть видео фактически нет, при открытии видеофайла любого формата звук идет, а картинка виснет. При запуске 3D игры (из дистрибутива) - тоже дикие тормоза, из чего сделал вывод, что виноват универсальный драйвер видеокарты. Кроме Мандривы есть live-CD ASP-linux, Knoppix, Geexbox linux - во всех трех видео отличное.
Ну и вопрос у меня в том, можно ли "вытащить" нужные модули из одного из этих дистрибутивов? В Windows такое сделать просто, может и в Линуксе возможно? (На сайте NVidia видел драйвера под Linux, но размер был чуть ли не 20 мБ - скачивать такие большие файлы нет возможности, интернет очень дохлый). У Мандривы и ASP версии ядра вроде бы одинаковые.
Ещё хорошо бы, если бы кто-нибудь обьяснил простым языком, как определять, какой модуль (драйвер) обслуживает какое-либо конкретное устройство (и обслуживает ли?).
Пытался читать рекомендованные в "шапке" статьи, но как-то все сложно, понял только что в linux драйвер устройства может входить в состав ядра, а может быть в виде отдельных подгружаемых файлов. Как это определить? Ещё хорошо бы, если бы кто-нибудь обьяснил простым языком, как определять, какой модуль (драйвер) обслуживает какое-либо конкретное устройство (и обслуживает ли?).

Да очень просто. От рута командуем lspci -v , ищем там свою видюшку и смотрим, что написано после Kernel modules: и Kernel driver in use:

Пытался читать рекомендованные в "шапке" статьи, но как-то все сложно, понял только что в linux драйвер устройства может входить в состав ядра, а может быть в виде отдельных подгружаемых файлов. Как это определить?
Касаемо нвидии - вам нужен закрытый драйвер. В ядро он входить не может. Вам надо подключить репозитории и поставить дрова оттуда. Возможно, (не знаю как там в мандривах у вас), вам придется скачать намного меньше.
Покурите раздел мандривы - Mandriva Linux, Mandrake Linux Ну а всё-таки как насчёт того, чтобы "вытащить" драйвера из другой системы? Возможно ли это в принципе?

ЗЫ: Второй способ наиболее универсален!

Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.

ЗЫ: Второй способ наиболее универсален!

Да я уже смотрел эту статью! Проблема в том, что нечего устанавливать. Меня то интересует, можно ли с Live-CD как-то взять драйвера.

Просто так взять и использовать сторонний драйвер скорее всего не позволит ядро. Тем более от другого дистрибутива.
Если уж очень дохлый дома интернет - найдите возможность скачать драйвер в другом месте.
И, кстати для этой карты нужен не самый свежий драйвер(если мне не изменяет память).

А вот такой вопрос (не хочется создавать новую тему): когда-то я использовал дистрибутив SuSE Linux 10.3 86x64 так вот в YaST была какая-то функция называлась (если память не изменяет мне с рассудком) "Использование установленного драйвера Winows", как я понял если на компьютере установленн линукс и виндовс, то можно заюзать для некой железяки дровишки из установленой винды возможно ли это или я что-то перепутал или не так понял?
Эта функция попадалсь мне на глаза, но использовать смысла небыло.

Может имеет смысл задать этот вопрос в разделе посвященном SuSE?

А вот такой вопрос (не хочется создавать новую тему): когда-то я использовал дистрибутив SuSE Linux 10.3 86x64 так вот в YaST была какая-то функция называлась (если память не изменяет мне с рассудком) "Использование установленного драйвера Winows", как я понял если на компьютере установленн линукс и виндовс, то можно заюзать для некой железяки дровишки из установленой винды возможно ли это или я что-то перепутал или не так понял?
Эта функция попадалсь мне на глаза, но использовать смысла небыло.

Может имеет смысл задать этот вопрос в разделе посвященном SuSE?



Предположу что это про ndiswrapper.
К драйверу Nvidia это точно неприменимо. Предположу что это про ndiswrapper.
К драйверу Nvidia это точно неприменимо.
Аааа, похоже на то, вспомнил: это когда я на ноут драйвер для песпроводной сети ставил видел эту приблуду, спасибо ))))))) А куда и какие файлы кладет nvidia после компиляции и установки?
В /var/lib ?

Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

Пишу драйвер мыши и дошел до стадии отладки. Для этого мне нужно выгрузить родной встроенный драйвер мыши, чтобы запустилась функция probe моего драйвера, а по окончании вставить его на место.

Как это сделать?

Добавлено через 3 минуты
Или, если вопрос некорректен, что надо сделать, чтобы при подсоединении мышки выполнилась функция probe именно моего драйвера, а не встроенного?

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Как написать драйвер мыши под Линукс
Здраствуйте. Я студент, и у меня тема курсового проекта "Написание драйвера под Линокс". В качестве.

Возможно ли как-нибудь выгрузить драйвер ?
Ребят возможно ли как-нибудь убить драйвер в системе?Точнее его выгрузить?Пробывал через программы.

Возможно ли как-нибудь выгрузить драйвер ? - Windows 10
Ребят появился драйвер вируса после установки касперского он удалил вирус а вот драйвер.

Как установить драйвер клавиатуры и мыши USB
Суть проблемы такова, на компьютере ни одного PS/2 нужно установить мышь и клавиатуру USB. Как это.

То есть чтобы сработала функция probe, мне надо выполнить команду modprobe?

Мне в нем непонятно, откуда должна запускаться функция probe и откуда должен передаваться указатель *interface для нее.

probe вызывает ядро обычно при загрузке драйвера. Но в данном случае больше похоже, что pen_probe будет вызван при подключении устройства в USB. Аргумент interface будет передан ядром. От вас требуется только загрузить драйвер через modprobe и подключить устройство с указанными vid/pid из переменной pen_table.

Plug-in the pen drive (after making sure that*usb-storage*driver is not already loaded).
То есть предварительно надо выгрузить основной драйвер мыши? Почему драйвер мыши? Сомневаюсь, что usb-storage - это драйвер мыши. больше похоже на mass storage device - всякие флешки. В любом случае, модуль с таким именем существует, а значит можно выполнить rmmod usb-storage. Humanoid, спасибо за ваш ответ. А где я могу посмотреть vid/pid, чтобы внести его в таблицу? Я ведь буду подключать свое устройство. сначала dmesg после подключения девайса - увидим что именно появилось в системе.
lsusb -v - детальная инфа по USBшкам drfaust, спасибо. На выходных попробую докончить свой драйвер.

Добрый день еще раз!

, соответствующий моей мыши, а также пока неверна запись в pen-table:

Выполняю инструкцию из примера по ссылке. Автор пишет:

Build the driver (pen_driver.ko file) by running make.
Load the driver using insmod pen_driver.ko.
Plug-in the pen drive (after making sure that usb-storage driver is not already loaded).
Check for the dynamic creation of /dev/pen0. (0 being the minor number obtained – check dmesg logs for the value on your system)
Possibly try some write/read on /dev/pen0. (Though you may mostly get connection timeout and/or broken pipe errors because of non-conformant SCSI commands)
Unplug-out the pen drive and look out for gone /dev/pen0.
Unload the driver using rmmod pen_driver.

Застреваю на третьем и четвертом пунктах. Вот вывод:

Как видите, драйвер "не ловится" и файл /dev/pen0 не появляется. Что я делаю не так? И где взять значения для pen-table? В общем, вам нужно отключить драйвер мыши, т.к. именно с ней вы хотите работать. Могу предложить только usbhid выгрузить. но если у вас и клавиатура USBшная, то она тоже перестанет работать.
И я не уверен, что ваши функции смогут работать с мышью, т.к. мышь - это HID, а HID использует Interrupt endpoint. А вы работаете с Bulk'ом. Вам проще проводить эксперименты на какой-нибудь флешке. И тогда вы сможете работать по той инструкции с usb_storage.

Спасибо, Humanoid, за ваш ответ. В оригинале используется pen, т.е. стилус. Стилус и мышь это не одного типа устройства, не hid-устройства?

Насколько я понял host id-коннектор и device id - конектор порта USB различаются по внешнему виду и поэтому все устройства уоторые подсоединяются на hid-коннектор являются hid-устройствами. Или я не прав?

Добавлено через 1 минуту
Возможно мои сведения слишком поверхтностные, я только начинаю разбираться с этой темой.

Вы уверены, что речь идёт о стилусе? У меня сложилось впечатление, что это просто название драйвера. Например,
Note that a pen drive belongs to a USB mass storage class, which expects a set of SCSI like commands to be transacted over the bulk endpoints.

К тому же, этот драйвер ничем не управляет и никаких протоколов не использует. Он просто предоставляет интерфейс для чтения/записи сырых данных в bulk-endpoint напрямую из userspace. Такой же функционал (даже более гибкий) можно получить через libusb.

Стилус и мышь это не одного типа устройства, не hid-устройства?

Мышь - это hid. А про стилус не знаю.

Насколько я понял host id-коннектор и device id - конектор порта USB различаются по внешнему виду и поэтому все устройства уоторые подсоединяются на hid-коннектор являются hid-устройствами.

Ничего не понял. HID - это просто стандартный протокол обмена данными по USB. Что бы под каждую мышь и клавиатуру не приходилось писать собственный драйвер были придуманы классы устройств. Например HID вначале передаёт хосту, информацию о том, что он из себя представляет и какие данные передаёт. Поэтому даже новые и современные мыши с клавиатурами без проблем работают даже на старых операционках.
Тоже самое с другим классом - Mass Storage Devices, у которого стандартизирована система команд. И все флешки работают по одному стандарту.
Все USB устройства электрически одинаковые. О своей принадлежности к тому или иному классу они сообщают хосту программным путём (в десткрипторах). Советую ознакомиться со спецификацией на USB2.0. без этого писать свой драйвер будет очень тяжко. Так же можно ознакомиться с описаниями разных классов. Там есть и про HID.

Кстати, хотя некоторые считают HID простым, лично я с этом не согласен. HID - один из наиболее сложных для понимания классов (в первую очередь из-за Usage Tables, которая делает его таким гибким).

Humanoid, вы советуете попробовать выгрузить usbhid, но его нет у меня в /proc/modules.
Даю вывод этого файла. Что мне именно нужно выгрузить?

По поводу сложности драйвера. Я делаю учебный проект и он относительно прост. В kernel mode должен быть простенький драйвер, распознающий движения мышки и передающий данные об этом именно в user space, а уже оттуда имитируются движения курсора на экране. Именно поэтому есть функция read и т.д.

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

Драйвер для мыши
для мыши нужен только usb драйвер верно?? или какой то еще?

драйвер мыши G300
не могу установить родной драйвер для мыши в Windows 7 64 как HID-устройство устанавливается без.

Отвалился драйвер мыши (?)
Здравствуйте, слезно прошу о помощи. Решила обновить драйвера видеокарты (Radeon 2100). Зашла на.

Драйвер клавиатуры и мыши.
Здравствуйте! Может кто-нибудь дать исходники на драйвер клавиатуры и мыши с подробным описанием.

Получилось так, что добавленный мною код в модуль упал (код в module_init). Я получил stacktrace, но модуль висит в lsmod :

Почему он висит в используемых и его нельзя удалить?




Написано ж - Used by 1. Пока модуль используется, его невозможно удалить. Вопрос в том, кем он используется.


Ну эт понятно. Так и делаю =)


Есть rmmod -f, но после Oops машину лучше перезагрузить. Альтернативно, сделать специальный ioctl для обнуления счетчика.


Добавьте module_init корректную обработку ошибки с освобождением всех ранее захваченных ресурсов.


если модуль ни кем не юзается, то это говорит об ошибке в самом модуле
и подчищать за собой лучше где-тить в module_exit();

metawishmaster ★★★★ ( 19.04.16 19:45:38 )
Последнее исправление: metawishmaster 19.04.16 19:46:12 (всего исправлений: 1)


пардон, бред написал - опять залазил в ЛОР после бессонной ночи и не прочитал нормально %)

в общем-то к постам от tailgunner и Andrey_Utkin могу только посоветовать использовать printk, чтоб локализовать ошибку %)

Ты qemu не юзаешь, что ли?



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

RiseOfDeath ★★★★ ( 20.04.16 09:44:23 )
Последнее исправление: RiseOfDeath 20.04.16 09:44:43 (всего исправлений: 1)


А чё с ней будет-то, если эта железка специально для разработки.

Да, порушенное ядро на живой железке(разработчика) это просто ужасно.


Ну, например, притянутый за уши вариант - ваш модуль параллельно порушит какой-нибудь модуль для jfss2 (например) и вы попортите содержимое нанды, или модул для ext2 и вы попортите содержимое SDкарты, с которой железка грузится - придется заново заливать всю файловую систему.

Я уже молчу, что на криво сделаной железке может возможность спалить что-нибудь программно (например если у вас есть какой-то внешний контроллер питания, которым ваш SoC управляет)

RiseOfDeath ★★★★ ( 20.04.16 10:00:53 )
Последнее исправление: RiseOfDeath 20.04.16 10:02:28 (всего исправлений: 1)


Сильное заявление. Проверять я его конечно не буду. Слышал ещё, что NAND разрушается из-за свободных ионов, которые прилетают к нам из космоса..


Я говорю не про физическую порчу нанды или SD карты, а про порчу содержимого, в случае если порушите драйвер файловой системы.

А на счет порчи железа я не шучу. Погуглите про сжигание звуковухи на некоторых асусовских ноутах, при выкручивании громкости звука больше 100%. (ну точнее там сгорала не сама звуковуха, а ОУ на выходе)



Ядро — это та часть операционной системы, работа которой полностью скрыта от пользователя, т. к. пользователь с ним не работает напрямую: пользователь работает с программами. Но, тем не менее, без ядра невозможна работа ни одной программы, т.е. они без ядра бесполезны. Этот механизм чем-то напоминает отношения официанта и клиента: работа хорошего официанта должна быть практически незаметна для клиента, но без официанта клиент не сможет передать заказ повару, и этот заказ не будет доставлен.
В Linux ядро монолитное, т.е. все его драйвера и подсистемы работают в своем адресном пространстве, отделенном от пользовательского. Сам термин «монолит» говорит о том, что в ядре сконцентрировано всё, и, по логике, ничего не может в него добавляться или удаляться. В случае с ядром Linux — это правда лишь отчасти: ядро Linux может работать в таком режиме, однако, в подавляющем большинстве сборок возможна модификация части кода ядра без его перекомпиляции, и даже без его выгрузки. Это достигается путем загрузки и выгрузки некоторых частей ядра, которые называются модулями. Чаще всего в процессе работы необходимо подключать модули драйверов устройств, поддержки криптографических алгоритмов, сетевых средств, и, чтобы уметь это правильно делать, нужно разбираться в строении ядра и уметь правильно работать с его модулями. Об этом и пойдет речь в этой статье.

В современных ядрах при подключении оборудования модули подключаются автоматически, а это событие обрабатывается демоном udev, который создает соответствующий файл устройства в каталоге "/dev". Все это выполняется в том случае, если соответствующий модуль корректно установлен в дерево модулей. В случае с файловыми системами ситуация та же: при попытке монтирования файловой системы ядро подгружает необходимый модуль автоматически, и выполняет монтирование.
Если необходимость в модуле не на столько очевидна, ядро его не загружает самостоятельно. Например, для поддержки функции шифрования на loop устройстве нужно вручную подгрузить модуль «cryptoloop», а для непосредственного шифрования — модуль алгоритма шифрования, например «blowfish».

Поиск необходимого модуля

Модули хранятся в каталоге "/lib/modules/<версия ядра>" в виде файлов с расширением «ko». Для получения списка всех модулей из дерева можно выполнить команду поиска всех файлов с расширением «ko» в каталоге с модулями текущего ядра:

find /lib/modules/`uname -r` -name ‘*.ko’

Полученный список даст некоторое представление о доступных модулях, их назначении и именах. Например, путь «kernel/drivers/net/wireless/rt2x00/rt73usb.ko» явно указывает на то, что этот модуль — драйвер устройства беспроводной связи на базе чипа rt73. Более детальную информацию о модуле можно получить при помощи команды modinfo:

Загрузка и выгрузка модулей

Загрузить модуль в ядро можно при помощи двух команд: «insmod» и «modprobe», отличающихся друг от друга возможностью просчета и удовлетворения зависимостей. Команда «insmod» загружает конкретный файл с расширением «ko», при этом, если модуль зависит от других модулей, еще не загруженных в ядро, команда выдаст ошибку, и не загрузит модуль. Команда «modprobe» работает только с деревом модулей, и возможна загрузка только оттуда по имени модуля, а не по имени файла. Отсюда следует область применения этих команд: при помощи «insmod» подгружается файл модуля из произвольного места файловой системы (например, пользователь скомпилировал модули и перед переносом в дерево ядра решил проверить его работоспособность), а «modprobe» — для подгрузки уже готовых модулей, включенных в дерево модулей текущей версии ядра. Например, для загрузки модуля ядра «rt73usb» из дерева ядра, включая все зависимости, и отключив аппаратное шифрование, нужно выполнить команду:

После загрузки модуля можно проверить его наличие в списке загруженных в ядро модулей при помощи команды «lsmod»:

Module Size Used by
rt73usb 17305 0
crc_itu_t 999 1 rt73usb
rt2x00usb 5749 1 rt73usb
rt2x00lib 19484 2 rt73usb,rt2x00usb

Из вывода команды ясно, что модуль подгружен, а так же в своей работе использует другие модули.
Чтобы его выгрузить, можно воспользоваться командой «rmmod» или той же командой «modprobe» с ключем "-r". В качестве параметра обоим командам нужно передать только имя модуля. Если модуль не используется, то он будет выгружен, а если используется — будет выдана ошибка, и придется выгружать все модули, которые от него зависят:

Для автоматической загрузки модулей в разных дистрибутивах предусмотрены разные механизмы. Я не буду вдаваться здесь в подробности, они для каждого дистрибутива свои, но один метод загрузки всегда действенен и удобен: при помощи стартовых скриптов. В тех же RedHat системах можно записать команды загрузки модуля прямо в "/etc/rc.d/rc.local" со всеми опциями.
Файлы конфигурация модулей находится в каталоге "/etc/modprobe.d/" и имеют расширение «conf». В этих файлах преимущественно перечисляются альтернативные имена модулей, их параметры, применяемые при их загрузке, а так же черные списки, запрещенные для загрузки. Например, чтобы вышеупомянутый модуль сразу загружался с опцией «nohwcrypt=1» нужно создать файл, в котором записать строку:

options rt73usb nohwcrypt=1

Черный список модулей хранится преимущественно в файле "/etc/modules.d/blacklist.conf" в формате «blacklist <имя модуля>». Используется эта функция для запрета загрузки глючных или конфликтных модулей.

Сборка модуля и добавление его в дерево

Иногда нужного драйвера в ядре нет, поэтому приходится его компилировать вручную. Это так же тот случай, если дополнительное ПО требует добавление своего модуля в ядро, типа vmware, virtualbox или пакет поддержки карт Nvidia. Сам процесс компиляции не отличается от процесса сборки программы, но определенные требования все же есть.
Во первых, нужен компилятор. Обычно установка «gcc» устанавливает все, что нужно для сборки модуля. Если чего-то не хватает — программа сборки об этом скажет, и нужно будет доустановить недостающие пакеты.
Во вторых, нужны заголовочные файлы ядра. Дело в том, что модули ядра всегда собираются вместе с ядром, используя его заголовочные файлы, т.к. любое отклонение и несоответствие версий модуля и загруженного ядра ведет к невозможности загрузить этот модуль в ядро.
Если система работает на базе ядра дистрибутива, то нужно установить пакеты с заголовочными файлами ядра. В большинстве дистрибутивов это пакеты «kernel-headers» и/или «kernel-devel». Для сборки модулей этого будет достаточно. Если ядро собиралось вручную, то эти пакеты не нужны: достаточно сделать символическую ссылку "/usr/src/linux", ссылающуюся на дерево сконфигурированных исходных кодов текущего ядра.
После компиляции модуля на выходе будет получен один или несколько файлов с расширением «ko». Можно попробовать их загрузить при помощи команды «insmod» и протестировать их работу.
Если модули загрузились и работают (или лень вручную подгружать зависимости), нужно их скопировать в дерево модулей текущего ядра, после чего обязательно обновить зависимости модулей командой «depmod». Она пройдется рекурсивно по дереву модулей и запишет все зависимости в файл «modules.dep», который, в последствие, будет анализироваться командой «modprobe». Теперь модули готовы к загрузке командой modprobe и могут загружаться по имени со всеми зависимостями.
Стоит отметить, что при обновлении ядра этот модуль работать не будет. Нужны будут новые заголовочные файлы и потребуется заново пересобрать модуль.

Ошибка «Invalid argument» может говорить о чем угодно, саму ошибку ядро на консоль написать не может, только при помощи функции «printk» записать в системный лог. Посмотрев логи можно уже узнать в чем ошибка:

В этом примере выведена только последняя строка с ошибкой, чтобы не загромаждать статью. Модуль может написать и несколько строк, поэтому лучше выводить полный лог, или хотя бы последние строк десять.
Ошибку уже легко найти: значение «2» неприемлемо для параметра «nohwcrypt». После исправления, модуль корректно загрузится в ядро.

Из всего сказанного можно сделать один вывод: ядро Linux играет по своим правилам и занимается серьезными вещами. Тем не менее — это всего лишь программа, оно, по сути, не сильно отличается от других обычных программ. Понимание того, что ядро не так уж страшно, как кажется, может стать первым шагом к пониманию внутреннего устройства системы и, как результат, поможет быстро и эффективно решать задачи, с которыми сталкивается любой администратор Linux в повседневной работе.

Читайте также: