anonymous@RULINUX.NET~# Last login: 2024-03-29 02:15:55
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

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

Здравствуйте! Очень нужен совет программистов-ядерщиков и всех кто имел дела с написанием/модификацией драйверов/модулей. Есть драйвер, который нужно малость допилить. В общем нужно в этом драйвере как-то считывать значения определенных регистров и передавать их в юзерспейс, причем значения эти быстроменяются (счетный регистр таймера). Сами функции считывания написаны, остается только придумать каким способом отслеживать эти значения из пользовательского пространства. В процессе поиска выяснилось, что можно использовать procfs, sysfs, Netlink, ioctl и наверняка много чего еще. В принципе из драйвера проброшены атрибуты в sysfs, так что можно сделать аналогичным образом, но я не знаю насколько быстро будет происходить обновление значения атрибута (файла в sysfs). Плюс мне не совсем до конца понятна вся концепция модели устройств. Если у кого есть хорошая-годная литература по этому всему, то я обязательно RTFM.

anonymous(*) (2016-01-28 20:12:11)

Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0

[Ответить на это сообщение]
avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

По-yahoo-й на тему "создание драйверов linux" - там и хабровские хелловорлды найдутся и книжки соответствующие. Но в целом проблему твою наверняка надо решать аппаратно.

anonymous(*)(2016-01-28 20:32:04)

avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

> проблему твою наверняка надо решать аппаратно.
Ардуину на ком-порт?

anonymous(*)(2016-01-28 20:36:07)

avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

Типа того. Если речь о быстроменяющихся счётчиках, то наверняка контроллер нужен а не многозадачная система с непредсказуемыми задержками.

anonymous(*)(2016-01-28 20:58:01)

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/538.1 (KHTML, like Gecko) QupZilla/1.8.9 Safari/538.1
avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

Спасибо за совет! А приоритетами задержки будет не побороть? Или скажем RT патчем?
Еще очень хочу скомпилить ядро с кое-какими параметрами для целей отладки (а именно CONFIG_PROC_KCORE и CONFIG_KGDB_SERIAL_CONSOLE), но что-то не могу их найти в menuconfig'е... Не подскажите, плз, где их искать?

anonymous(*)(2016-02-01 19:29:44)

Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0
avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

Ну, традиционно самый быстрый способ — это через отображение памяти. Системные вызовы, связанные со временем, делаются именно так.

Т.е. твой драйвер создает страницу памяти, которую шарит внутрь виртуального адресного пространства твоего userspace процесса. Ну и дальше перегоняет данные из устройства в эту страницу, а userspace процесс — читает из нее (например, в цикле).

А если доступ к устройству — простой memory-mapped, API устройства простое, и устройство отдает данные быстро, то можно смаппить прямо адресное пространство устройства внутрь userspace процесса.

Ну или вообще, реализовать код userspace процесса in-kernel.

Вообще, тебя какая модель общения интересует? Чтобы userspace процесс on-demand дергал какую-то функцию, и она отдавала с минимальным latency текущее значение из устройства? Или тебе нужно последовательность значений из устройства вытаскивать (не потеряв промежуточные значения)?

anonymous(*)(2016-04-08 21:30:31)

Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0
avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

Как-то так:

1. Драйвер при инициализации выделяет страницу памяти (kmalloc). Запоминает ее адрес.

2. Драйвер постоянно перегоняет данные из устройства в эту страницу

3. Драйвер реализует ioctl, результат которого — физический адрес этой странички

4. Процесс при инициализации дергает этот ioctl, тем самым знает, откуда эти данные забирать

5. Процесс отображает эту страницу в свое виртуальное пространство (mmap на /dev/mem по полученному выше адресу).

6. Теперь процесс может считывать в цикле данные из отображенной страницы

Замечание #1. Использование /dev/mem требует соответствующих прав и, вообще говоря, несколько криво. Наверняка, есть более красивый способ.

Замечание #2. Если данные не влезают в машинное слово, то можно огрести проблем с атомарностью. Например, считывание 128-битного значения на 64-битной архитектуре требует два 64-битных mov, тем самым ты можешь получить левую часть от считывания N_i, а правую — от считывания N_j.

Традиционная книжка по драйверам: http://www.makelinux.net/ldd3/

anonymous(*)(2016-04-08 21:32:21)

Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0
avatar
  • матерные выражения
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

Ты больной на всю голову. Прикинь, тебе нужно сообщить 64 бита в юзерспейс. При чём о состоянии регистра, значение которого меняется чаще чем исполняются машинные команды. Ты делаешь драйвер, который тратит 100% CPU на копирование этого регистра в какую-то там память, с потерями. Потом юзерский процесс пытается достучаться до этих восьми байт - обращается к 4196-байтной странице памяти, <прошу прощения, прерывание по неотложным причинам> в которую драйвер записал данные хуй знает когда. Едро вместо этого сначала <прошу прощения, прерывание по неотложным причинам> подгружает локальную и глобальную таблицы дескрипторов чтобы удостовериться, что твой сраный юзерспейс <прошу прощения, прерывание по неотложным причинам> имеет право читать эти <прошу прощения, прерывание по неотложным причинам> данные, когда ядро убедилось что <прошу прощения, прерывание по неотложным причинам> твой процесс имеет право доступа к <прошу прощения, прерывание по неотложным причинам> данной области памяти, оно начинает долго и томи<прошу прощения, прерывание по неотложным причинам>тельно тянуть эти четыре килоба<прошу прощения, прерывание по неотложным причинам>йта из RAM потому, что друг<прошу прощения, прерывание по неотложным причинам>ие процессы уже вытеснили страницу из кеш-лайна.

Вот что тут можно гарантировать для рил-тайма кроме 100% потребления одного ядра CPU?

anonymous(*)(2016-04-08 23:14:01)

Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

Очень интересно, ну а что ты <прошу прощения> предлагаешь? lol

ТС, посмотри как реализуется вывод от сенсоров материнской платы, возможно тебе этого хватит.

anonymous(*)(2016-04-09 00:18:43)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

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

anonymous(*)(2016-04-09 00:42:48)

Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

А накуй ему тогда линукс?

anonymous(*)(2016-04-09 00:47:04)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

Я вот тоже не понял.

anonymous(*)(2016-04-09 00:56:36)

Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
avatar
Скрыть

Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство

Вышеуказанное решение я написал из расчета, что данные уже в ядре, и тебе осталось только сделать "Вывод быстроменяющихся данных из ядра в пользовательское пространство". Про busyloop в ядре я ничего не писал, только в userspace. :)

Как происходит забирание данных из устройства: чтение из памяти (mov) или чтение из порта (inb/inw)? Сколько времени обходится одно чтение?

Просто мне кажется, что в твоем случае самый простой способ будет и самым быстрым:

1) userspace дергает некий ioctl

2) драйвер при получении ioctl опрашивает устройство и возвращает значение как результат ioctl

Если чтение из устройства использует только mov, то можно заморочиться и код драйвера перенести в сам userspace процесс (общение в память через /dev/mem). Будет экономия на syscall.

P.S. Ну и это, что-то у тебя слишком часто прерывания идут. Может, их обработку на другие ядра перевесить?

P.P.S. Тебе что важнее: получить как можно более свежие данные или как можно меньше блокировать процесс? Одновременно и то, и другое не получится.

anonymous(*)(2016-04-09 13:47:26)
Отредактировано anonymous по причине "не указана"
Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!