<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_4_subsect_6_thread_42385"  />
<title>rulinux.net - Форум - Development - Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Форум - Development - Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#215732</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#215732</guid>
<pubDate>Sat, 09 Apr 2016 09:47:26 +0300</pubDate>
<description><![CDATA[<p>Вышеуказанное решение я написал из расчета, что данные уже в ядре, и тебе осталось только сделать &quot;Вывод быстроменяющихся данных из ядра в пользовательское пространство&quot;. Про busyloop в ядре я ничего не писал, только в userspace. :)<br><br>Как происходит забирание данных из устройства: чтение из памяти (mov) или чтение из порта (inb/inw)? Сколько времени обходится одно чтение?<br><br>Просто мне кажется, что в твоем случае самый простой способ будет и самым быстрым:<br><br>1) userspace дергает некий ioctl<br><br>2) драйвер при получении ioctl опрашивает устройство и возвращает значение как результат ioctl<br><br>Если чтение из устройства использует только mov, то можно заморочиться и код драйвера перенести в сам userspace процесс (общение в память через /dev/mem). Будет экономия на syscall.<br><br>P.S. Ну и это, что-то у тебя слишком часто прерывания идут. Может, их обработку на другие ядра перевесить?<br><br>P.P.S. Тебе что важнее: получить как можно более свежие данные или как можно меньше блокировать процесс? Одновременно и то, и другое не получится.</p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#215718</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#215718</guid>
<pubDate>Fri, 08 Apr 2016 20:56:36 +0300</pubDate>
<description><![CDATA[<p>Я вот тоже не понял.</p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#215715</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#215715</guid>
<pubDate>Fri, 08 Apr 2016 20:47:04 +0300</pubDate>
<description><![CDATA[<p>А накуй ему тогда линукс? </p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#215713</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#215713</guid>
<pubDate>Fri, 08 Apr 2016 20:42:48 +0300</pubDate>
<description><![CDATA[<p>Кого волнует вывод от сенсоров материнской платы, когда человек реально задрачивается по счётчику времени в процессоре?</p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#215708</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#215708</guid>
<pubDate>Fri, 08 Apr 2016 20:18:43 +0300</pubDate>
<description><![CDATA[<p>Очень интересно, ну а что ты &lt;прошу прощения&gt; предлагаешь? lol<br><br>ТС, посмотри как реализуется вывод от сенсоров материнской платы, возможно тебе этого хватит.</p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#215703</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#215703</guid>
<pubDate>Fri, 08 Apr 2016 19:14:01 +0300</pubDate>
<description><![CDATA[<p>Ты больной на всю голову. Прикинь, тебе нужно сообщить 64 бита в юзерспейс. При чём о состоянии регистра, значение которого меняется чаще чем исполняются машинные команды. Ты делаешь драйвер, который тратит 100% CPU на копирование этого регистра в какую-то там память, с потерями. Потом юзерский процесс пытается достучаться до этих восьми байт - обращается к 4196-байтной странице памяти, &lt;прошу прощения, прерывание по неотложным причинам&gt; в которую драйвер записал данные хуй знает когда. Едро вместо этого сначала &lt;прошу прощения, прерывание по неотложным причинам&gt; подгружает локальную и глобальную таблицы дескрипторов чтобы удостовериться, что твой сраный юзерспейс &lt;прошу прощения, прерывание по неотложным причинам&gt; имеет право читать эти &lt;прошу прощения, прерывание по неотложным причинам&gt; данные, когда ядро убедилось что &lt;прошу прощения, прерывание по неотложным причинам&gt; твой процесс имеет право доступа к &lt;прошу прощения, прерывание по неотложным причинам&gt; данной области памяти, оно начинает долго и томи&lt;прошу прощения, прерывание по неотложным причинам&gt;тельно тянуть эти четыре килоба&lt;прошу прощения, прерывание по неотложным причинам&gt;йта из RAM потому, что друг&lt;прошу прощения, прерывание по неотложным причинам&gt;ие процессы уже вытеснили страницу из кеш-лайна. 
<br><br>
Вот что тут можно гарантировать для рил-тайма кроме 100% потребления одного ядра CPU? </p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#215700</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#215700</guid>
<pubDate>Fri, 08 Apr 2016 17:32:21 +0300</pubDate>
<description><![CDATA[<p>Как-то так:<br><br>1. Драйвер при инициализации выделяет страницу памяти (kmalloc). Запоминает ее адрес.<br><br>2. Драйвер постоянно перегоняет данные из устройства в эту страницу<br><br>3. Драйвер реализует ioctl, результат которого — физический адрес этой странички<br><br>4. Процесс при инициализации дергает этот ioctl, тем самым знает, откуда эти данные забирать<br><br>5. Процесс отображает эту страницу в свое виртуальное пространство (mmap на /dev/mem по полученному выше адресу).<br><br>6. Теперь процесс может считывать в цикле данные из отображенной страницы<br><br>Замечание #1. Использование /dev/mem требует соответствующих прав и, вообще говоря, несколько криво. Наверняка, есть более красивый способ.<br><br>Замечание #2. Если данные не влезают в машинное слово, то можно огрести проблем с атомарностью. Например, считывание 128-битного значения на 64-битной архитектуре требует два 64-битных mov, тем самым ты можешь получить левую часть от считывания N_i, а правую — от считывания N_j.<br><br>Традиционная книжка по драйверам: http://www.makelinux.net/ldd3/<br><br></p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#215699</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#215699</guid>
<pubDate>Fri, 08 Apr 2016 17:30:31 +0300</pubDate>
<description><![CDATA[<p>Ну, традиционно самый быстрый способ — это через отображение памяти. Системные вызовы, связанные со временем, делаются именно так.<br><br>Т.е. твой драйвер создает страницу памяти, которую шарит внутрь виртуального адресного пространства твоего userspace процесса. Ну и дальше перегоняет данные из устройства в эту страницу, а userspace процесс — читает из нее (например, в цикле).<br><br>А если доступ к устройству — простой memory-mapped, API устройства простое, и устройство отдает данные быстро, то можно смаппить прямо адресное пространство устройства внутрь userspace процесса.<br><br>Ну или вообще, реализовать код userspace процесса in-kernel.<br><br>Вообще, тебя какая модель общения интересует? Чтобы userspace процесс on-demand дергал какую-то функцию, и она отдавала с минимальным latency текущее значение из устройства? Или тебе нужно последовательность значений из устройства вытаскивать (не потеряв промежуточные значения)?</p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#214672</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#214672</guid>
<pubDate>Mon, 01 Feb 2016 15:29:44 +0300</pubDate>
<description><![CDATA[<p>Спасибо за совет! А приоритетами задержки будет не побороть? Или скажем RT патчем?<br /> Еще очень хочу скомпилить ядро с кое-какими параметрами для целей отладки (а именно CONFIG_PROC_KCORE и CONFIG_KGDB_SERIAL_CONSOLE), но что-то не могу их найти в menuconfig'е... Не подскажите, плз, где их искать?</p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#214619</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#214619</guid>
<pubDate>Thu, 28 Jan 2016 16:58:01 +0300</pubDate>
<description><![CDATA[<p>Типа того. Если речь о быстроменяющихся счётчиках, то наверняка контроллер нужен а не многозадачная система с непредсказуемыми задержками.</p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#214618</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#214618</guid>
<pubDate>Thu, 28 Jan 2016 16:36:07 +0300</pubDate>
<description><![CDATA[<p><i>> проблему твою наверняка надо решать аппаратно.</i><br> Ардуину на ком-порт?</p>]]></description>
</item>
<item>
<title>Re:Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#214616</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#214616</guid>
<pubDate>Thu, 28 Jan 2016 16:32:04 +0300</pubDate>
<description><![CDATA[<p>По-yahoo-й на тему &quot;создание драйверов linux&quot; - там и хабровские хелловорлды найдутся и книжки соответствующие. Но в целом проблему твою наверняка надо решать аппаратно.</p>]]></description>
</item>
<item>
<title>Вывод быстроменяющихся данных из ядра в пользовательское пространство</title>
<link>https://rulinux.net/message.php?newsid=42385&amp;page=1#214615</link>
<guid>https://rulinux.net/message.php?newsid=42385&amp;page=1#214615</guid>
<pubDate>Thu, 28 Jan 2016 16:12:11 +0300</pubDate>
<description><![CDATA[<p>Здравствуйте! Очень нужен совет программистов-ядерщиков и всех кто имел дела с написанием/модификацией драйверов/модулей. Есть драйвер, который нужно малость допилить. В общем нужно в этом драйвере как-то считывать значения определенных регистров и передавать их в юзерспейс, причем значения эти быстроменяются (счетный регистр таймера). Сами функции считывания написаны, остается только придумать каким способом отслеживать эти значения из пользовательского пространства. В процессе поиска выяснилось, что можно использовать procfs, sysfs, Netlink, ioctl и наверняка много чего еще. В принципе из драйвера проброшены атрибуты в sysfs, так что можно сделать аналогичным образом, но я не знаю насколько быстро будет происходить обновление значения атрибута (файла в sysfs). Плюс мне не совсем до конца понятна вся концепция модели устройств. Если у кого есть хорошая-годная литература по этому всему, то я обязательно RTFM.</p>]]></description>
</item>
</channel>
</rss>