Как общаться с++ приложению с модулями или с хидерам ядра
Модератор: Olej
Как общаться с++ приложению с модулями или с хидерам ядра
Пишу gui приложение на qt, изучать начал linux недавно поэтому вопрос про саму концепцию написания программ.
У меня задача на данный момент - установить прерывание и обработать. Уже нашел все что для этого нужно, но проблема в том, что все эти заголовочные файлы в сорсах ядра в /usr/src и написаны они на с. Плюс работать они должны только из под ядра. Для этого я нашел вариант - создать модуль, где все эти функции определены и описаны, загрузить в ядро.
Но как мне из функции обработки прерывания в модуле передать сигнал в приложение что мол пришло что-то и надо считывать?
И если есть другой вариант без модулей, то буду благодарен, если объясните)
У меня задача на данный момент - установить прерывание и обработать. Уже нашел все что для этого нужно, но проблема в том, что все эти заголовочные файлы в сорсах ядра в /usr/src и написаны они на с. Плюс работать они должны только из под ядра. Для этого я нашел вариант - создать модуль, где все эти функции определены и описаны, загрузить в ядро.
Но как мне из функции обработки прерывания в модуле передать сигнал в приложение что мол пришло что-то и надо считывать?
И если есть другой вариант без модулей, то буду благодарен, если объясните)
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как общаться с++ приложению с модулями или с хидерам ядра
1. обработать прерывание "по-честному" вы можете только из кода ядра, т.е. из модуля.1r0pb писал(а):Пишу gui приложение на qt, изучать начал linux недавно поэтому вопрос про саму концепцию написания программ.
У меня задача на данный момент - установить прерывание и обработать. Уже нашел все что для этого нужно, но проблема в том, что все эти заголовочные файлы в сорсах ядра в /usr/src и написаны они на с. Плюс работать они должны только из под ядра. Для этого я нашел вариант - создать модуль, где все эти функции определены и описаны, загрузить в ядро.
Но как мне из функции обработки прерывания в модуле передать сигнал в приложение что мол пришло что-то и надо считывать?
И если есть другой вариант без модулей, то буду благодарен, если объясните)
в модуле вы можете писать данные после полученного прерывания ... куда-то в файл /proc/... или /sys/...
уведомлять из модуля своё приложение что "произошло прерывание пора прочитать данные" - можете посылкой сигнала UNIX, или как делает udev - посылкой широковещательного сообщения через сокет netlink
2. а ещё проще - сделать модуль как драйвер нового (символьного?) устройства /dev/xxx - приложение чиатет его по open() - read() - блокируется ... а разблокируется по поступлению данных от модуля после прерывания.
3. вопрос: от кого получается прерывание? если это какое-то USB устройство, то для этого есть такой промежуточный слой (не пространства ядра!) как libusb (libusbx).
P.S. в принципе, все эти техники более-менее описаны здесь на форуме...
Или вот здесь: Драйверы и модули ядра Linux (цикл обновлений).
P.P.S. на хедеры ядра в /usr/src не засматривайтесь - они к вашему программированию не относятся, только к модулям ядра - никакого доступа к этим API вы не получите.
Re: Как общаться с++ приложению с модулями или с хидерам ядра
Спасибо что показали направление для создания канала связи приложения с модулем. Я в этой статье http://www.opennet.ru/base/dev/linux_driver.txt.html изучаю как раз про драйвер так что буду потом смотреть про линуксовые функции чтения записи.Olej писал(а):1. обработать прерывание "по-честному" вы можете только из кода ядра, т.е. из модуля.
в модуле вы можете писать данные после полученного прерывания ... куда-то в файл /proc/... или /sys/...
уведомлять из модуля своё приложение что "произошло прерывание пора прочитать данные" - можете посылкой сигнала UNIX, или как делает udev - посылкой широковещательного сообщения через сокет netlink
2. а ещё проще - сделать модуль как драйвер нового (символьного?) устройства /dev/xxx - приложение читает его по open() - read() - блокируется ... а разблокируется по поступлению данных от модуля после прерывания.
3. вопрос: от кого получается прерывание? если это какое-то USB устройство, то для этого есть такой промежуточный слой (не пространства ядра!) как libusb (libusbx).
P.S. в принципе, все эти техники более-менее описаны здесь на форуме...
Или вот здесь: Драйверы и модули ядра Linux (цикл обновлений).
P.P.S. на хедеры ядра в /usr/src не засматривайтесь - они к вашему программированию не относятся, только к модулям ядра - никакого доступа к этим API вы не получите.
Но вопрос такой появился при компиляции make файла: не подскажите как указать там путь к папке с хидерами, а то выдает ошибку что не находит, хотя в той же папке все, и есть подозрение что надо либо полный путь указывать, либо в makefile добавить какую-то строку дополнительную?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как общаться с++ приложению с модулями или с хидерам ядра
По ссылке этой - это безнадёжно устаревший мусор (10-ти летней давности!), по сборке для ядра 2.4, с тех пор всё поменялось: и сборка, и макросы ... всё.1r0pb писал(а): Спасибо что показали направление для создания канала связи приложения с модулем. Я в этой статье http://www.opennet.ru/base/dev/linux_driver.txt.html изучаю как раз про драйвер так что буду потом смотреть про линуксовые функции чтения записи.
Забудьте!
Это из работающего примера сборка:1r0pb писал(а): Но вопрос такой появился при компиляции make файла: не подскажите как указать там путь к папке с хидерами, а то выдает ошибку что не находит, хотя в той же папке все, и есть подозрение что надо либо полный путь указывать, либо в makefile добавить какую-то строку дополнительную?
Код: Выделить всё
CURRENT = $(shell uname -r)
KDIR = /lib/modules/$(CURRENT)/build
PWD = $(shell pwd)
DEST = /lib/modules/$(CURRENT)/misc
TARGET = hello_printk
obj-m := $(TARGET).o
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
...
Возьмите тот текст, что я указывал: Драйверы и модули ядра Linux (цикл обновлений) - там всё описано!
Re: Как общаться с++ приложению с модулями или с хидерам ядра
Ну не совсем по ней. Я открыл make файл сгенерированный qt при создании проекта и исправил синтаксис по его аналогии. Но да, я не указал пути.Olej писал(а): По ссылке этой - это безнадёжно устаревший мусор (10-ти летней давности!), по сборке для ядра 2.4, с тех пор всё поменялось: и сборка, и макросы ... всё.
Забудьте!
А, да я как раз нашел его на 1 странице, спасибо.Olej писал(а): Это из работающего примера сборка:Код: Выделить всё
CURRENT = $(shell uname -r) KDIR = /lib/modules/$(CURRENT)/build PWD = $(shell pwd) DEST = /lib/modules/$(CURRENT)/misc TARGET = hello_printk obj-m := $(TARGET).o all: $(MAKE) -C $(KDIR) M=$(PWD) modules ...
Не не, установил точно все, у меня все на дисках поставляемых и там все было, а дистрибутив Astra Linux 3.2.0 и gcc 4.7.1Olej писал(а): Но я так думаю, что у вас просто не установлены все пакеты из репозитария вашего дистрибутива (а какой дистрибутив?), нужные для сборки модулей.
Возьмите тот текст, что я указывал: Драйверы и модули ядра Linux (цикл обновлений) - там всё описано!
Сегодня утром попробую у себя все)
Re: Как общаться с++ приложению с модулями или с хидерам ядра
Пытался скомпилировать ядро с моим make файлом, но выдает ошибку: Нет правила для сборки цели `arch/x86/tools/relocs.c', требуемой для `arch/x86/tools/relocs'.
Посмотрел в нете и похоже эта ошибка распространена у новичков именно при первой сборке, как я понял я что-то не подключил, но никак не пойму что, ведь хидеры установлены. Кстати файла relocs.c нет. Не сталкивался с такой проблемой?
установил все что тут сказано, но не помогло http://forum.ubuntu.ru/index.php?topic=200537.0
Посмотрел в нете и похоже эта ошибка распространена у новичков именно при первой сборке, как я понял я что-то не подключил, но никак не пойму что, ведь хидеры установлены. Кстати файла relocs.c нет. Не сталкивался с такой проблемой?
установил все что тут сказано, но не помогло http://forum.ubuntu.ru/index.php?topic=200537.0
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как общаться с++ приложению с модулями или с хидерам ядра
А не нужно то что "тут" сказано.1r0pb писал(а):Пытался скомпилировать ядро с моим make файлом, но выдает ошибку: Нет правила для сборки цели `arch/x86/tools/relocs.c', требуемой для `arch/x86/tools/relocs'.
Посмотрел в нете и похоже эта ошибка распространена у новичков именно при первой сборке, как я понял я что-то не подключил, но никак не пойму что, ведь хидеры установлены. Кстати файла relocs.c нет. Не сталкивался с такой проблемой?
установил все что тут сказано, но не помогло http://forum.ubuntu.ru/index.php?topic=200537.0
И нен нужно начинать собирать со своего самописанного Makefile.
Вместо этого:
- взять любой 1-й попавшийся пример из ссылки, что я давал + запустить его сборку...
- если у вас не собирается - значит что-то из пакетов для сборки не установлено.
И показывайте выводы команд, с ошибками ... а не "на пальцах" рассказы.
Покажите что у вас показывает
Код: Выделить всё
[Olej@modules ~]$ ls /lib/modules/`uname -r`/build
arch crypto firmware include ipc kernel Makefile Module.symvers samples security System.map usr vmlinux.id
block drivers fs init Kconfig lib mm net scripts sound tools virt
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как общаться с++ приложению с модулями или с хидерам ядра
То, что у вас какие-то хедеры каким-то образом установлены - ровным счётом ничего не значит!1r0pb писал(а): Посмотрел в нете и похоже эта ошибка распространена у новичков именно при первой сборке, как я понял я что-то не подключил, но никак не пойму что, ведь хидеры установлены.
Вы делали? (для своего ядра, естественно):
Код: Выделить всё
$ sudo aptitude install linux-headers-3.2.0-4-486
...
Код: Выделить всё
$ aptitude show linux-headers
...
Код: Выделить всё
[Olej@modules ~]$ ls /lib/modules/`uname -r`
build modules.alias modules.builtin modules.dep.bin modules.modesetting modules.softdep source
extra modules.alias.bin modules.builtin.bin modules.devname modules.networking modules.symbols updates
kernel modules.block modules.dep modules.drm modules.order modules.symbols.bin vdso
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как общаться с++ приложению с модулями или с хидерам ядра
Это что такое за чудо Astra Linux?1r0pb писал(а):Не не, установил точно все, у меня все на дисках поставляемых и там все было, а дистрибутив Astra Linux 3.2.0 и gcc 4.7.1
Сегодня утром попробую у себя все)
Какая там пакетная система: .rpm или .deb?
Вот как-раз "на дисках поставляемых" не нужно сильно рассчитывать.
Re: Как общаться с++ приложению с модулями или с хидерам ядра
Действительно модули из примеров нормально создались и запустились, проверил сообщения в логах - все нормOlej писал(а): Вместо этого:
- взять любой 1-й попавшийся пример из ссылки, что я давал + запустить его сборку...
- если у вас не собирается - значит что-то из пакетов для сборки не установлено.
И показывайте выводы команд, с ошибками ... а не "на пальцах" рассказы.
Покажите что у вас показываетКод: Выделить всё
[Olej@modules ~]$ ls /lib/modules/`uname -r`/build arch crypto firmware include ipc kernel Makefile Module.symvers samples security System.map usr vmlinux.id block drivers fs init Kconfig lib mm net scripts sound tools virt
сейчас попробую разобраться в чем разница была
вот инфа
Код: Выделить всё
root@astra:/# ls /lib/modules/`uname -r`/build
arch drivers init kernel Module.symvers security ubuntu
block
firmware ipc lib net sound usr
crypto fs
Kbuild Makefile samples source virt
Documentation include Kconfig
mm scripts
tools
root@astra:/# aptitude show linux-headers
Нет в наличии или подходящей версии для linux-headers
Пакет: linux-headers
Состояние: не реальный пакет
Предоставляется: linux-headers-3.2.0-27, linux-headers-3.2.0-27-generic
root@astra:/# ls /lib/modules/`uname -r`
build
modules.alias modules.dep modules.softdep
initrd modules.alias.bin
modules.dep.bin modules.symbols
kernel modules.builtin modules.devname
modules.symbols.bin
misc modules.builtin.bin modules.order
Linux astra 3.2.0-27-generic #43astra9 SMP Fri Nov 2 01:34:28 MSK 2012 x86_64 GNU/Linux
debOlej писал(а):Какая там пакетная система: .rpm или .deb?
http://www.astra-linux.com/
Последний раз редактировалось 1r0pb 16 окт 2014, 12:21, всего редактировалось 2 раза.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей