Как общаться с++ приложению с модулями или с хидерам ядра

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
1r0pb
Активист
Сообщения: 10
Зарегистрирован: 13 окт 2014, 10:56
Контактная информация:

Как общаться с++ приложению с модулями или с хидерам ядра

Непрочитанное сообщение 1r0pb » 13 окт 2014, 10:58

Пишу gui приложение на qt, изучать начал linux недавно поэтому вопрос про саму концепцию написания программ.
У меня задача на данный момент - установить прерывание и обработать. Уже нашел все что для этого нужно, но проблема в том, что все эти заголовочные файлы в сорсах ядра в /usr/src и написаны они на с. Плюс работать они должны только из под ядра. Для этого я нашел вариант - создать модуль, где все эти функции определены и описаны, загрузить в ядро.
Но как мне из функции обработки прерывания в модуле передать сигнал в приложение что мол пришло что-то и надо считывать?
И если есть другой вариант без модулей, то буду благодарен, если объясните)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как общаться с++ приложению с модулями или с хидерам ядра

Непрочитанное сообщение Olej » 13 окт 2014, 17:16

1r0pb писал(а):Пишу gui приложение на qt, изучать начал linux недавно поэтому вопрос про саму концепцию написания программ.
У меня задача на данный момент - установить прерывание и обработать. Уже нашел все что для этого нужно, но проблема в том, что все эти заголовочные файлы в сорсах ядра в /usr/src и написаны они на с. Плюс работать они должны только из под ядра. Для этого я нашел вариант - создать модуль, где все эти функции определены и описаны, загрузить в ядро.
Но как мне из функции обработки прерывания в модуле передать сигнал в приложение что мол пришло что-то и надо считывать?
И если есть другой вариант без модулей, то буду благодарен, если объясните)
1. обработать прерывание "по-честному" вы можете только из кода ядра, т.е. из модуля.
в модуле вы можете писать данные после полученного прерывания ... куда-то в файл /proc/... или /sys/...
уведомлять из модуля своё приложение что "произошло прерывание пора прочитать данные" - можете посылкой сигнала UNIX, или как делает udev - посылкой широковещательного сообщения через сокет netlink

2. а ещё проще - сделать модуль как драйвер нового (символьного?) устройства /dev/xxx - приложение чиатет его по open() - read() - блокируется ... а разблокируется по поступлению данных от модуля после прерывания.

3. вопрос: от кого получается прерывание? если это какое-то USB устройство, то для этого есть такой промежуточный слой (не пространства ядра!) как libusb (libusbx).

P.S. в принципе, все эти техники более-менее описаны здесь на форуме...
Или вот здесь: Драйверы и модули ядра Linux (цикл обновлений).

P.P.S. на хедеры ядра в /usr/src не засматривайтесь - они к вашему программированию не относятся, только к модулям ядра - никакого доступа к этим API вы не получите.

Аватара пользователя
1r0pb
Активист
Сообщения: 10
Зарегистрирован: 13 окт 2014, 10:56
Контактная информация:

Re: Как общаться с++ приложению с модулями или с хидерам ядра

Непрочитанное сообщение 1r0pb » 13 окт 2014, 19:44

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 вы не получите.
Спасибо что показали направление для создания канала связи приложения с модулем. Я в этой статье http://www.opennet.ru/base/dev/linux_driver.txt.html изучаю как раз про драйвер так что буду потом смотреть про линуксовые функции чтения записи.
Но вопрос такой появился при компиляции make файла: не подскажите как указать там путь к папке с хидерами, а то выдает ошибку что не находит, хотя в той же папке все, и есть подозрение что надо либо полный путь указывать, либо в makefile добавить какую-то строку дополнительную?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как общаться с++ приложению с модулями или с хидерам ядра

Непрочитанное сообщение Olej » 13 окт 2014, 21:02

1r0pb писал(а): Спасибо что показали направление для создания канала связи приложения с модулем. Я в этой статье http://www.opennet.ru/base/dev/linux_driver.txt.html изучаю как раз про драйвер так что буду потом смотреть про линуксовые функции чтения записи.
По ссылке этой - это безнадёжно устаревший мусор (10-ти летней давности!), по сборке для ядра 2.4, с тех пор всё поменялось: и сборка, и макросы ... всё.
Забудьте! :lol:
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 (цикл обновлений) - там всё описано!

Аватара пользователя
1r0pb
Активист
Сообщения: 10
Зарегистрирован: 13 окт 2014, 10:56
Контактная информация:

Re: Как общаться с++ приложению с модулями или с хидерам ядра

Непрочитанное сообщение 1r0pb » 14 окт 2014, 00:04

Olej писал(а): По ссылке этой - это безнадёжно устаревший мусор (10-ти летней давности!), по сборке для ядра 2.4, с тех пор всё поменялось: и сборка, и макросы ... всё.
Забудьте! :lol:
Ну не совсем по ней. Я открыл make файл сгенерированный qt при создании проекта и исправил синтаксис по его аналогии. Но да, я не указал пути.
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
...
А, да я как раз нашел его на 1 странице, спасибо.
Olej писал(а): Но я так думаю, что у вас просто не установлены все пакеты из репозитария вашего дистрибутива (а какой дистрибутив?), нужные для сборки модулей.
Возьмите тот текст, что я указывал: Драйверы и модули ядра Linux (цикл обновлений) - там всё описано!
Не не, установил точно все, у меня все на дисках поставляемых и там все было, а дистрибутив Astra Linux 3.2.0 и gcc 4.7.1
Сегодня утром попробую у себя все)

Аватара пользователя
1r0pb
Активист
Сообщения: 10
Зарегистрирован: 13 окт 2014, 10:56
Контактная информация:

Re: Как общаться с++ приложению с модулями или с хидерам ядра

Непрочитанное сообщение 1r0pb » 15 окт 2014, 08:41

Пытался скомпилировать ядро с моим make файлом, но выдает ошибку: Нет правила для сборки цели `arch/x86/tools/relocs.c', требуемой для `arch/x86/tools/relocs'.
Посмотрел в нете и похоже эта ошибка распространена у новичков именно при первой сборке, как я понял я что-то не подключил, но никак не пойму что, ведь хидеры установлены. Кстати файла relocs.c нет. Не сталкивался с такой проблемой?

установил все что тут сказано, но не помогло http://forum.ubuntu.ru/index.php?topic=200537.0

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как общаться с++ приложению с модулями или с хидерам ядра

Непрочитанное сообщение Olej » 15 окт 2014, 16:35

1r0pb писал(а):Пытался скомпилировать ядро с моим make файлом, но выдает ошибку: Нет правила для сборки цели `arch/x86/tools/relocs.c', требуемой для `arch/x86/tools/relocs'.
Посмотрел в нете и похоже эта ошибка распространена у новичков именно при первой сборке, как я понял я что-то не подключил, но никак не пойму что, ведь хидеры установлены. Кстати файла relocs.c нет. Не сталкивался с такой проблемой?

установил все что тут сказано, но не помогло http://forum.ubuntu.ru/index.php?topic=200537.0
А не нужно то что "тут" :lol: сказано.
И нен нужно начинать собирать со своего самописанного 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: Как общаться с++ приложению с модулями или с хидерам ядра

Непрочитанное сообщение Olej » 15 окт 2014, 16:47

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: Как общаться с++ приложению с модулями или с хидерам ядра

Непрочитанное сообщение Olej » 15 окт 2014, 16:50

1r0pb писал(а):Не не, установил точно все, у меня все на дисках поставляемых и там все было, а дистрибутив Astra Linux 3.2.0 и gcc 4.7.1
Сегодня утром попробую у себя все)
Это что такое за чудо Astra Linux?
Какая там пакетная система: .rpm или .deb?

Вот как-раз "на дисках поставляемых" не нужно сильно рассчитывать. ;-)

Аватара пользователя
1r0pb
Активист
Сообщения: 10
Зарегистрирован: 13 окт 2014, 10:56
Контактная информация:

Re: Как общаться с++ приложению с модулями или с хидерам ядра

Непрочитанное сообщение 1r0pb » 16 окт 2014, 11:03

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
Olej писал(а):Какая там пакетная система: .rpm или .deb?
deb
http://www.astra-linux.com/
Последний раз редактировалось 1r0pb 16 окт 2014, 12:21, всего редактировалось 2 раза.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей