- Драйверы устройств в Linux
- Часть 2: Пишем в классе наш первый драйвер для Linux
- Динамическая загрузка драйверов
- Наш первый драйвер для Linux
- Сборка нашего первого драйвера
- Подведем итог
- как скомпилировать драйвер?
- unixforum.org
- Сборка драйвера
- Сборка драйвера
- Русские Блоги
- Скомпилируйте загруженный драйвер в ядро ядра (linux)
- Первый, основной способ компиляции драйвера в ядро
- Один, статическая компиляция
- Выберите опцию справки, чтобы просмотреть информацию описания:
- Два, динамическая компиляция
- Интеллектуальная рекомендация
- Используйте Maven для создания собственного архетипа скелета проекта (4)
- Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
- Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
- Учебный дневник — перелистывание страниц
- Нулевое основание для отдыха-клиента
- Вам также может понравиться
- Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
- Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
- Шаблон алгоритма конной повозки
- 35 Line Code, чтобы получить метод исследования событий (ON)
- Образ докера: gitlab
Драйверы устройств в Linux
Часть 2: Пишем в классе наш первый драйвер для Linux
Оригинал: «Device Drivers, Part 2: Writing Your First Linux Driver in the Classroom»
Автор: Anil Kumar Pugalia
Дата публикации: December 1, 2010
Перевод: Н.Ромоданов
Дата перевода: июнь 2012 г.
В этой статье, которая является частью серии статей о драйверах устройств в Linux, речь идет о концепции динамической загрузки драйверов — сначала мы перед тем, как собирать драйвер, напишем драйвер для Linux, а затем, после сборки, загрузим его.
Светлана и Пагс добрались в свой класс с опозданием и увидели, что их профессор уже начал читать лекцию. Светлана робко попросила разрешения войти. Раздраженный профессор Гопи ответил: «Входите! Вы, друзья, опять сегодня опоздали, и по какой причине»?
Пагс поспешно ответил, что они обсуждали именно ту тему, которую сегодня изучают в классе — драйверы устройств в Linux. Пагс был более, чем счастлив, когда профессор сказал: «Хорошо! Тогда что-нибудь скажите о динамической загрузке в Linux. Если вы справитесь, то я прощу вас обоих!». Пагс знал, что один из способов сделать профессора счастливым, это — покритиковать Windows.
Он объяснил: «Как известно, при обычной установке драйверов в Windows для того, чтобы их активировать, необходимо перезагрузить систему. А если это, предположим, действительно неприемлемо в случае, если это нужно делать на сервере? Вот где выигрывает Linux. В Linux можно загружать и выгружать драйверы на лету, и это активно используется сразу после загрузки системы. Кроме того, драйвер мгновенно отключается после его выгрузки. Это называется динамической загрузкой и выгрузкой драйверов в Linux «.
Это впечатлило профессора. «Хорошо! Идите на свои места, но больше не опаздывайте». Профессор продолжил лекцию: «Теперь, когда вы уже знаете, что такое динамическая загрузка и выгрузка драйверов, я, прежде, чем мы перейдем к написанию нашего первого драйверов, покажу вам, как загружать и выгружать драйвера».
Динамическая загрузка драйверов
Эти динамически загружаемые драйвера чаще всего называют модулями, которые собираются в виде отдельных модулей с расширением .ko (объект ядра). В каждой системе Linux в корне файловой системы (/) есть стандартное место для всех предварительно собранных модулей. Они организованы аналогично древовидной структуре исходных кодов ядра и находятся в директории /lib/modules/ /kernel , где результат вывода системной команды uname -r (см.рис.1).
Рис.1: Предварительно собранные модули Linux
Чтобы динамически загружать и выгружать драйверы, воспользуйтесь следующими командами, которые находятся в директории /sbin и должны выполняться с привилегиями пользователя root:
- lsmod — список модулей, загруженных в текущий момент
- insmod — добавление / загрузка указанного файла модуля
- modprobe — добавление / загрузка модуля вместе со всеми его зависимостями
- rmmod — удаление / выгрузка модуля
Давайте в качестве примера рассмотрим соответствующие драйвера файловой системы FAT. На рис.2 показан весь процесс нашего эксперимента. Файлы с модулями будут fat.ko , vfat.ko и т.д., находящиеся в директории fat (в vfat для старых версий ядра) в /lib/modules/`uname -r`/kernel/fs . Если они представлены в сжатом формате .gz , вам нужно будет распаковать их с помощью команды gunzip , прежде чем вы сможете выполнить операцию insmod .
Рис.2: Операции с модулями Linux
Модуль vfat зависит от модуля fat , так что первым должен быть загружен модуль fat.ko . Чтобы автоматически выполнить распаковку и загрузку зависимостей, воспользуйтесь командой modprobe . Обратите внимание, что когда вы пользуетесь командой modprobe , вы не должны в имени модуля указывать расширение .ko . Команда rmmod используется для выгрузки модулей.
Наш первый драйвер для Linux
Перед тем, как написать наш первый драйвер, давайте рассмотрим некоторые понятия. Драйвер никогда не работает сам по себе. Он похож на библиотеку, загружаемую из-за функций, которые будут вызваны из работающего приложения. Он написан на языке C, но в нем отсутствует функция main() . Кроме того, он будет загружаться / компоноваться с ядром, поэтому он должен компилироваться аналогично тому, как было откомпилировано ядро, и вы можете в качестве заголовочных файлов использовать только те, что есть в исходном коде ядра, а не из стандартного директория /usr/include .
Интересный факт, касающийся ядра, это то, что оно, как мы видим даже на примере нашего первого драйвера, представляет собой объектно-ориентированную реализацию на языке C. В любом драйвере есть конструктор и деструктор. Когда модуль успешно загружается в ядро, то вызывается конструктор модуля, а дескруктор модуля вызывается, когда команде rmmod удается успешно выгрузить модуль. Это в драйвере две обычные функции, разве что они называются init и exit, соответственно, и вызываются с помощью макросов module_init() и module_exit() , которые определены в заголовков ядра module.h .
С учетом вышесказанного это полный код нашего первого драйвера; назовем его ofd.c. Обратите внимание, что отсутствует заголовок stdio.h (заголовок пользовательского пространства), вместо него мы используем аналог kernel.h (заголовок пространства ядра). Функция printk() эквивалентна функции printf() . Кроме того, для обеспечения совместимости версии модуля с ядром, в которое будет загружен модуль, добавлен заголовок version.h . С помощью макроса MODULE_* заполняется информация, относящаяся к модулю, которая будет использована как «подпись» модуля.
Сборка нашего первого драйвера
Т.к. у нас есть код на языке C, настало время его скомпилировать и создать файл модуля ofd.ko . Для этого мы используем систему сборки ядра. В приведенном ниже файле Makefile происходит обращение к системе сборки ядра из исходных кодов, а файл Makefile ядра, в свою очередь, обращается к файлу Makefile нашего нового драйвера с тем, чтобы собрать драйвер.
Чтобы собрать драйвер для Linux, у вас в системе должен быть исходный код ядра (или, по крайней мере, заголовки ядра). Предполагается, что исходный код ядра будет находиться в директории /usr/src/linux . Если в вашей системе он находится в каком-нибудь другом месте, то укажите это место в переменной KERNEL_SOURCE в файле Makefile .
Когда есть код на языке C ( ofd.c ) и готов файл Makefile , то все, что нам нужно сделать для сборки нашего первого драйвера ( ofd.ko ), это вызвать команду make .
Подведем итог
Как только у нас будет файл ofd.ko , мы в роли пользователя root или с помощью команды sudo выполним обычные действия.
Команда lsmod должна вам сообщить о том, что драйвер ofd загружен.
Пока студенты экспериментировали со своим первым модулем, прозвенел звонок, сообщивший об окончании урока. Профессор Гопи подвел итог: «В настоящий момент мы не увидели ничего, кроме того, что модуль lsmod сообщил о загрузке драйвера. Куда выводит информацию команда printk ? Найдите это самостоятельно на лабораторных занятиях и познакомьте меня с своими выводами. Также учтите, что наш первый драйвер будет шаблоном для любого драйвера, который можно написать для Linux. Написание специализированных драйверов это всего лишь вопрос о том, чем будет заполнен конструктор и деструктор драйвера. Поэтому дальнейшее изучение будет представлять собой расширение данного драйвера с целью получить драйвер с конкретными функциональными возможностями».
Источник
как скомпилировать драйвер?
здравствуйте! есть платка с at91rm9200, на ней крутится линукс, по i2c подключен l3g4200 и надо чтоб в ядре был его драйвер. сам драйвер написан, ссылка вот http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/SW_DRIVER/l3g4. а как его внедрить в ядро? верней его надо скомпилировать, а потом через menuconfig подключить видимо и скомпилировать ядро(это я научился).
Перемещено JB из Development
make modules && make modules_install ??
стоп. во-первых, должна быть какая то папка в исходниках ядра, где собираются все модули. так? во-вторых, откуда мне взять мейкфайл для того чтобы скомпилировать исходник?
Это обрезок какой-то, а не драйвера.
попробуйте сделать как /usr/src/kernels/linux-3.0/drivers/sfi
/ataman/kernel/drivers/l3g4200d$ make make -C
/ataman/kernel `uname -r`/build M=`pwd` make[1]: Вход в каталог `/home/brainiac/ataman/kernel’ make[1]: *** Нет правила для сборки цели `3.0.0-12-generic/build’. Останов. make[1]: Выход из каталога `/home/brainiac/ataman/kernel’ make: *** [default] Ошибка 2 [/code]
или я опять что то не понял?
http://pastebin.com/EdyeucmR
вот это сохрани как Makefile и напиши в консоли make без аргументов, всё
/ataman/kernel/drivers/l3g4200d$ make make -C /home/ataman/kernel/`uname -r`/build M=`pwd` make: *** /home/ataman/kernel/3.0.0-12-generic/build: Нет такого файла или каталога. Останов. make: *** [default] Ошибка 2 brainiac@brainiac-laptop:
вообще я не понял. ядро у меня 2.6.30 стоит на проце, это на компьютере стоит 3.0.0-12. может это поможет, как изменить то?
кроме linux device drivers есть какие нибудь книги по данной тематике. или еще надо читать документацию на ядро?
тогда вместо `uname -r` вбей каталог который у тебя
все равно не работает. вообщем в топку, буду читать linux device drivers и писать с нуля
Тоже машинка на этом проце и та же ИС гироскопа. Собрать драйвер удалось, делалось примерно таким же Makefile’ом, но с make указывались переменные ARCH=arm CROSS_COMPILE=arm-unknown-linux-uclibcgnueabi- (поскольку кросс-компиляция).
Скопировал на целевую систему, в домашнюю папку, делаю:
%insmod l3g4200d.ko
%lsmod
Module Size Used by
l3g4200d 6456 0
%ls /sys/bus/i2c/drivers
ev_driver dummy l3g4200d rtc-ds1672
%ls /sys/bus/i2c/devices/
0-0068
Таким образом мы видим, что драйвер включился в ядро, появился в каталоге /sys/bus/i2c/drivers, но в каталоге /sys/bus/i2c/devices/, где он тоже по логике должен был быть, его нету (0-0068 это часы реального времени rtc-ds1672, драйвер был встроен в ядро).
Что значит вся эта картина? ИС либо драйвер работают некорректно? Или я что-то недонастраивал и эту ситуацию можно как-то поправить? Спасибо.
Источник
unixforum.org
Форум для пользователей UNIX-подобных систем
- Темы без ответов
- Активные темы
- Поиск
- Статус форума
Сборка драйвера
Модератор: Bizdelnick
Сборка драйвера
Сообщение camphene » 01.04.2011 00:58
Пожалуйста, помогите!
Мне нужно скомпилировать драйвер устройства под Linux.
В документации написано
В комплекте поставки драйвера идут скомпилированные модули для
ядер 2.4.7, 2.4.36.9, 2.6.16 (64 бита). Для использования с другими версиями
ядра может потребоваться скомпилировать модуль драйвера. Для этого в
директории source/tmk1553busb/ надо запустить соответствующую команду:
make24 для ядра 2.4 или make26 для ядра 2.6. Для того, чтобы модуль драйвера
мог скомпилироваться, необходимо, чтобы были установлены исходники ядра Linux
(Linux kernel sources).
Исходники ядра Linux должны быть расположены в папке /usr/src/linux
для успешной компиляции драйвера. Если такой папки нет, и исходники ядра
расположены в другой папке (например, /usr/src/linux-2.4), то необходимо
обеспечить существование папки /usr/src/linux с исходниками ядра Linux. Для
этого обычно достаточно выполнить команду подобную этой:
ln -s /usr/src/linux-2.4 /usr/src/linux
Эта команда записана в прилагаемом файле linkkern24.
В ядре 2.6 для компиляции драйвера может потребоваться предварительно
выполнить следующие команды:
cd /usr/src/linux
make mrproper
make cloneconfig
make modules_prepare
Источник
Русские Блоги
Скомпилируйте загруженный драйвер в ядро ядра (linux)
Первый, основной способ компиляции драйвера в ядро
Есть два способа скомпилировать драйвер в ядро под linux:
1) Статическая компиляция
2) Динамическая компиляция
Статическая компиляция заключается в интеграции исходного кода загруженного драйвера в исходный код ядра ядра, а затем в настройке соответствующих параметров через графический интерфейс.После настройки параметров сохраните и выйдите, затем скомпилируйте и, наконец, скомпилированный, интегрированный и используемый для записи Записанный файл здесь будет называться uImage.
Динамическая компиляция заключается в компиляции загруженного исходного кода в файл .ko и, наконец, загрузке файла ko на плату с помощью команды insmod.
Выберете ли вы статическую компиляцию или динамическую компиляцию, зависит от ваших потребностей.
Один, статическая компиляция
Я только подробно объясняю, как добавить соответствующие параметры модуля в графический интерфейс. Шаги, предшествующие графическому интерфейсу (make menuconfig), были опущены. Перед этим я просмотрел множество руководств, поэтому я не буду повторять их здесь.
1. О скачанных драйверах
1) Место хранения исходного кода драйвера в исходном коде ядра
В какой каталог должен быть помещен исходный код драйвера в исходный код ядра, это обычно зависит от типа драйвера. Например, если вы загружаете драйвер модуля Wi-Fi, то обычно мы помещаем драйвер модуля Wi-Fi. Поместите исходный код в . /linux-3.10.y/drivers/net/wireless
по этому пути; например, если вы загружаете драйвер символьного типа, он обычно будет помещен в . /linux-3.10.y/drivers/char По этому пути; если вы действительно не знаете, куда его положить, положите . /linux-3.10.y/drivers , Пока вы можете найти его в графическом интерфейсе в конце.
2) Модификация связанных файлов исходного кода драйвера
В исходном коде драйвера нужно изменить только 2 файла:
Kconfig
Файл Kconfig используется для описания информации о связанных параметрах графического интерфейса, например о том, какому типу атрибутов выбора соответствует этот параметр (<> (Д / Н / М), [] [Д / Н ]…), Например, описание информации, относящейся к этой опции и т. Д., Если Kconfig отсутствует, вы должны создать его самостоятельно. Возьмите модуль Wi-Fi в качестве примера. После создания добавьте контент, который вы хотите добавить, следующим образом (если Kconfig уже существует, не изменяйте его):
RTL8821CU Этот макрос можно назвать произвольно, и «Realtek 8821C USB WiFi» Это название этой опции, tristate Средство для установки атрибута выбора этой опции в три состояния, а именно Y / N / M, depends on Чтобы объяснить зависимость, если вы не знаете, что писать, оставьте это depends on , Не нужно добавлять информацию, последняя help Это описание информации о выборе, это необязательно.
Kconfig предназначен для описания параметров, а Makefile — для добавления взаимосвязей между параметрами. Сделайте то же самое, создайте, если нет, то измените следующим образом:
2. Модификации исходного кода ядра.
Как и драйвер, в исходном коде ядра есть только два файла, которые нужно изменить: Kconfig и Makefile. Эти два файла расположены в верхнем каталоге драйвера. Например, путь к исходному коду драйвера drivers/net/wirless/wifi , Вы хотите изменить drivers/net/wirless Kconfig и Makefile по этому пути.
Kconfig
Добавьте следующий код в последнюю строку Kconfig:
Makefile изменяется следующим образом:
После изменения вышеуказанных файлов, когда вы введете команду make menuconfig в терминале telminal и снова войдете в графический интерфейс, вы увидите, что появились соответствующие параметры (как показано ниже). Расположение параметра связано с путем к исходному коду вашего драйвера.Чем глубже путь к драйверу в исходном коде ядра, тем глубже соответствующий путь к параметру в графическом интерфейсе.
Выберите опцию справки, чтобы просмотреть информацию описания:
Два, динамическая компиляция
Вот все же в качестве примера возьмем модуль Wi-Fi. После загрузки соответствующего исходного кода драйвера вам нужно только изменить Makefile. Основные изменения заключаются в следующем:
ARCH Скомпилированная платформа, CROSS_COMPILE Путь, по которому находится цепочка компиляции, обычно передается в ubuntu echo $PATH Команда может видеть путь в цепочке компиляции, KSRC — это путь к исходному коду ядра. После изменения Makefile введите команду make в терминале, чтобы завершить компиляцию, и вы получите файл ko в текущем каталоге, а затем вам нужно только поместить файл ko в конец платы insmod для завершения.
Интеллектуальная рекомендация
Используйте Maven для создания собственного архетипа скелета проекта (4)
Один, базовое введение в Maven Во-вторых, скачайте и настройте Maven Три, настроить домашнее зеркало на Али В-четвертых, создайте содержимое скелета архетипа В-пятых, создайте проект через архетип 6. .
Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
Автор | Сюй Линь Ответственный редактор | Ху Вэйвэй Предисловие Недавно Цай Сюкунь отправил письмо юриста на станцию B. Содержание письма юриста показало, что «на станции B имеется большое кол.
Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
Название Описание Во взвешенном ориентированном графе G для исходной точки v задача о кратчайшем пути от v до оставшихся вершин в G называется задачей кратчайшего пути с одной исходной точкой. Среди ш.
Учебный дневник — перелистывание страниц
Используйте плагин Layui.
Нулевое основание для отдыха-клиента
Предисловие: статья, обобщенная, когда я только что связался с тестом API, в дополнение к остальному клиенту этот инструмент сам, некоторые из мелких пониманий API, я надеюсь помочь тому же белую белу.
Вам также может понравиться
Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
Шаг 1. Откройте для себя инъекцию Со мной все было нормально, когда я был свободен, я случайно нажал на чужой блог и обнаружил, что ссылка заканчивается на id, поэтому я проверил его вручную. Результа.
Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
В предыдущем разделе мы ввели основное использование AXIOS, по сравнению с нативным Ajax, который при условии, что способ является более простым и, а сетевые данные теперь в состоянии получить его ров.
Шаблон алгоритма конной повозки
Блог гангстеров Тележки, запряженные лошадьми, используются для решения проблемы самой длинной подстроки палиндрома. Основное внимание уделяется подстрокам, а не подпоследовательностям. Если вы хотите.
35 Line Code, чтобы получить метод исследования событий (ON)
Об авторе: Чжу Сяою,Личный публичный номер: языковой класс большой кошки Эта проблема научит вас этой большой классе Cat.Как написать наиболее эффективное метод исследования событий с 35 Line R Code C.
Образ докера: gitlab
GitLab Docker images Both GitLab CE and EE are in Docker Hub: GitLab CE Docker image GitLab EE Docker image The GitLab Docker images are monolithic images of GitLab running all the necessary services .
Источник