<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Использование С++ в ядре линукса</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8226.html</link>
    <description>Здравствуйте!&lt;br&gt;&lt;br&gt;Пишу драйвер для ucLinux и хочу реализовать драйвер на С++, а не на С.&lt;br&gt;Возникла проблема линковки - линковщик не понимает объектные файлы созданные g++.&lt;br&gt;В частности имены функций в объектных файлах скомпилированных gcc и g++ создаються по-разному.&lt;br&gt;gcc:  _funcname&lt;br&gt;g++:  __Z7funcnamev&lt;br&gt;&lt;br&gt;Если в .cpp файле функцию заключить в   extern &quot;C&quot; &#123; void funcname() &#123;&#125;  &#125;, то имена ф-ии в объектниках g++ делает как и gcc, однако по прежнему&lt;br&gt;: undefined reference to &#096;funcname&apos;.&lt;br&gt;&lt;br&gt;Вопросы:&lt;br&gt;1) как сделать чтобы код С++ нормально собирался с ядром линукса?&lt;br&gt;2) какие подводные камни возможны при использовании С++ в ядре линкса?&lt;br&gt;</description>

<item>
    <title>Использование С++ в ядре линукса (Alexander S. Salieff)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8226.html#31</link>
    <pubDate>Tue, 02 Jun 2009 20:59:16 GMT</pubDate>
    <description>Какой вы страшный флейм устроили. При написании LKM главное что, чтобы весь экспорт ядро распознало, и чтобы весь импорт ядро предоставило. А пиши хоть на испанском, лишь бы вменяемый компилятор был. С экспортом просто, с импортом сложнее, но совсем не в плане STL, exceptions и RTTI, а в плане того, что они потащат за собой целую libstdc++ и libgcc, которые, в свою очередь, зависимы от glibc, и там начинается гемор. Но при желании это можно порешать... Только дрова жирные получатся, C транслируется в asm практически линейно, а C++ требует обширной библиотечной поддержки...&lt;br&gt;</description>
</item>

<item>
    <title>2ONE (poulch)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8226.html#30</link>
    <pubDate>Wed, 13 May 2009 07:11:32 GMT</pubDate>
    <description>это было общее рассуждение... я тоже C++ больше люблю. и очень не люблю править драйвера с выходом новых ядер тк функции ядра меняются. Предпочел бы что-то типа numega driver studio иметь в linux. C телекоммуникациями никак не связан... www.lcard.ru мой профиль....&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>2ONE (worman)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8226.html#29</link>
    <pubDate>Wed, 13 May 2009 02:34:46 GMT</pubDate>
    <description>&amp;gt;Дело не в скорости итп... основное это возможность изящно &quot;стабилизировать&quot; API ядра &lt;br&gt;&amp;gt;посредством разноообразных фрэймворков для драйверов, не загубив гибкости развития... но похоже &lt;br&gt;&amp;gt;пока у энтузиастов хватает сил ползать по всему коду драйвероа  &lt;br&gt;&amp;gt;и патчить его под новые API... &lt;br&gt;&lt;br&gt;Не понял что ты имеешь ввиду. Какие фреймворки???&lt;br&gt;Исходная задача такая была:  есть микросхема для работы с потоками E1, есть  ucLinux, надо реализовать протокол канального уровня. Протокол канального уровня и реализуеться в виде драйвера. Таким образом драйвер пишеться с нуля и привязан к микросхеме.&lt;br&gt;Был вопрос в выборе языка C или С++. Я преверженец С++ вот и интересовался как обстоит дело с С++ в ядре.&lt;br&gt;&lt;br&gt;Пэ.Эс. Если у тебя есть пара фреймфорков реализующих телекоммуникационные протоколы, дай плиз :-)&lt;br&gt;</description>
</item>

<item>
    <title>2ONE (poulch)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8226.html#28</link>
    <pubDate>Tue, 12 May 2009 10:38:16 GMT</pubDate>
    <description>Дело не в скорости итп... основное это возможность изящно &quot;стабилизировать&quot; API ядра посредством разноообразных фрэймворков для драйверов, не загубив гибкости развития... но похоже пока у энтузиастов хватает сил ползать по всему коду драйвероа  и патчить его под новые API...&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>2ALL (svn)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8226.html#27</link>
    <pubDate>Thu, 07 May 2009 10:04:18 GMT</pubDate>
    <description>&amp;gt;Шаблоны раздувают код?  Имеете в виду, что будет множество инстанцированний? Опять &lt;br&gt;&amp;gt;же - зависит от кривизны рук программиста. Кстати, а дефайны не &lt;br&gt;&amp;gt;раздувают? ))))) &lt;br&gt;&lt;br&gt;Макросы раздувают, но они не вносят проблемы линковки. В последнее время всё чаще используются inline функции.&lt;br&gt;&lt;br&gt;&amp;gt;И в чем сложность линковки? (хотя бы - лично для вас?) &lt;br&gt;&lt;br&gt;В том что линковщик должен определить что это шаблон, и не нервничать встретив дубликата при линковке, а просто его потерять. Это сложность, не приемлемая во время линковки (загрузки) загружаемого модуля ядра.&lt;br&gt;&lt;br&gt;&amp;gt;Про загаживаение пространства имен - не смешите - в сишных проектах оно &lt;br&gt;&amp;gt;загажено еще сильнее глобальными переменными. С++ как раз и задумывался как &lt;br&gt;&amp;gt;язык инкапсулирующий данные и методы их обработки &lt;br&gt;&lt;br&gt;Слышал звон. Писать плохо можно и на С. Посмотри сколько глобальных переменных и функций в linux. Почти всё скрыто статиками. С шаблонами такие выкрутасы не прокатят. И классы с методами и namespace всплывут в глобальной области имён, дикими префиксами.&lt;br&gt;</description>
</item>

<item>
    <title>2ALL (svn)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8226.html#26</link>
    <pubDate>Wed, 06 May 2009 09:42:39 GMT</pubDate>
    <description>&amp;gt;Тут главное суть - удобство факта существования конструктора &lt;br&gt;&amp;gt;/ деструктора. &lt;br&gt;&lt;br&gt;Если и удобно оно, то только для автоматических переменных. А учитывая, что автоматических переменных в ядре нет (экономить стек надо, в стеке только указатели на структуры), никакого удобства не получается. Явный new + delete ничем не лучше функций init + fini.&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt;Или создание объекта до main() &lt;br&gt;&lt;br&gt;В ядре нет main. И порядок создание объектов в ядре linux очень чёткий, понятный и контролируемый.&lt;br&gt;</description>
</item>

<item>
    <title>2ALL (DimaG)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8226.html#25</link>
    <pubDate>Wed, 06 May 2009 04:15:20 GMT</pubDate>
    <description>Ес-но код выше прошу не обсуждать - это тупой пример функции в несколькими точками выхода. Тут главное суть - удобство факта существования конструктора / деструктора.&lt;br&gt;&lt;br&gt;Или создание объекта до main()&lt;br&gt;&lt;br&gt;class ClassMainWarpper&lt;br&gt;&#123;&lt;br&gt;  ClassMainWarpper()&lt;br&gt;  &#123;&lt;br&gt;    printf(&quot;Before main&#092;n&quot;);&lt;br&gt;  &#125;&lt;br&gt;&lt;br&gt;  ~ClassMainWarpper()&lt;br&gt;  &#123;&lt;br&gt;    printf(&quot;After main&#092;n&quot;);&lt;br&gt;  &#125;&lt;br&gt;&#125;;&lt;br&gt;&lt;br&gt;ClassMainWarpper clMW;&lt;br&gt;&lt;br&gt;&lt;br&gt;void main()&lt;br&gt;&#123;&lt;br&gt;  printf(&quot;main&#092;n&quot;);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>2ALL (DimaG)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8226.html#24</link>
    <pubDate>Wed, 06 May 2009 03:02:16 GMT</pubDate>
    <description>В качестве примера удобства использования - напишите мне аналог на Си&lt;br&gt;&lt;br&gt;class CCriticalSect&lt;br&gt;&#123;&lt;br&gt;  inline CCriticalSect()&#123;int_disable();&#125;&lt;br&gt;  inline ~CCriticalSect()&#123;int_enable();&#125;&lt;br&gt;&#125;;&lt;br&gt;&lt;br&gt;&lt;br&gt;* * * &lt;br&gt;&lt;br&gt;void func(int a)&lt;br&gt;&#123;&lt;br&gt;  CCriticalSect clCS_;&lt;br&gt;&lt;br&gt;  switch (a)&lt;br&gt;  &#123;&lt;br&gt;    case (A0):&lt;br&gt;    &#123;&lt;br&gt;      * * *&lt;br&gt;      return;&lt;br&gt;    &#125;&lt;br&gt;&lt;br&gt;    case (A1):&lt;br&gt;    &#123;&lt;br&gt;      * * *&lt;br&gt;      return;&lt;br&gt;    &#125;&lt;br&gt;&lt;br&gt;    case (A2):&lt;br&gt;    &#123;&lt;br&gt;      * * *&lt;br&gt;      return;&lt;br&gt;    &#125;&lt;br&gt;&lt;br&gt;    case (A3):&lt;br&gt;    &#123;&lt;br&gt;      * * *&lt;br&gt;      return;&lt;br&gt;    &#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;    case (A4):&lt;br&gt;    &#123;&lt;br&gt;      * * *&lt;br&gt;      return;&lt;br&gt;    &#125;&lt;br&gt;&lt;br&gt;  &#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&#125;&lt;br&gt;</description>
</item>

<item>
    <title>2ALL (DimaG)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8226.html#23</link>
    <pubDate>Wed, 06 May 2009 02:58:02 GMT</pubDate>
    <description>&amp;gt;&amp;gt;Наследования, шаблоны. В своих проектах (на том же BF537) использую все, кроме &lt;br&gt;&amp;gt;&amp;gt;RTTI. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Наследование без виртуальных методов и исключений - обычное вкладывание одной структуры данных &lt;br&gt;&amp;gt;в другую, прекрасно пишется и на C. &lt;br&gt;&lt;br&gt;Виртуальные методы не используются в данном проекте (scmRTOS), но активно используются в других. Кстати, а чем они вас так напрягают? В ядре линукса они тоже (в сишном виде) используются. &lt;br&gt;&lt;br&gt;&amp;gt;Шаблоны раздувают код и усложняют линковку. И так процедура загрузки модуля в &lt;br&gt;&amp;gt;ядро не тривиальная, а уж если использовать шаблоны то будет вообще &lt;br&gt;&amp;gt;кошмар. И самое печальное, что глобальное пространство имён загадится шаблонами похлеще &lt;br&gt;&amp;gt;авгиевых конюшен. &lt;br&gt;&lt;br&gt;Шаблоны раздувают код?  Имеете в виду, что будет множество инстанцированний? Опять же - зависит от кривизны рук программиста. Кстати, а дефайны не раздувают? )))))&lt;br&gt;&lt;br&gt;И в чем сложность линковки? (хотя бы - лично для вас?)&lt;br&gt;Про загаживаение пространства имен - не смешите - в сишных проектах оно загажено еще сильнее глобальными перем</description>
</item>

</channel>
</rss>
