Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
alexxxxxxxx Гость
|
Добавлено: Вт Сен 10 2002 09:43 Заголовок сообщения: Ядреные модули |
|
|
Народ подскажите, можно ли как то загрузив динамически в ядро первый модуль, а потом и второй, из вторго модуля получиь ссылку (работать как с обычной переменной) на переменную определенную в первом модуле? Операция типа следующей не проходит: 1. В первом модуле int shared_variable 2. Во втором модуле extern int shared_variable
Однако, вышеприведенная схема обращения через extern переменные к переменным рабочего ядра проходит. Т.е. если в коде откомпилированного ядра присутствует некоторая нестатическая переменная, то ее напрямую (через extern объявление) можно использовать в ядреном модуле. |
|
Вернуться к началу |
|
|
Dmitry.Karpov http://www. Гость
|
Добавлено: Вт Сен 10 2002 10:23 Заголовок сообщения: IMHO, обе д.б. shared |
|
|
Pls, не надо путать статическую переменную с внешней - IMHO, надо обе переменные объявлять extern, а статическая она или динамическая - это дело десятое. IMHO. |
|
Вернуться к началу |
|
|
alexxxxxx Гость
|
Добавлено: Вт Сен 10 2002 11:22 Заголовок сообщения: Re: IMHO, обе д.б. shared |
|
|
Возможно я, извеняюсь, не совсем точно описал ситуацию. Но если я в первом модуле и во втором объявлю переменную как extern, то, по-моему, я и в первом модуле не смогу пользоваться такой переменной (ведь ее нигде (в ядре) пока не существует). А необходимо следующее: загрузить первый модуль в котором есть переменная, к которой можно обращаться из второго модуля, который загрузится позднее. И ошибка возникает не в период выполнения, а в период связывания (работает каманда ld), когда загружается второй модуль (ошибка вроде не могу найти такую то _переменную в сегменте text). Все эти дела делаются под freeBSD...
А, вообще, пока я в поиске попробую объявить обе переменные как extern, может и сработает. |
|
Вернуться к началу |
|
|
Dmitry.Karpov http://www. Гость
|
Добавлено: Вт Сен 10 2002 12:01 Заголовок сообщения: Где логика? |
|
|
Насколько я понимаю, любая переменная, объявленная стандартными средствами Си (типа int или static int) является внутренней переменной модуля, иначе всем программистам пришлось бы согласовывать имена переменных. Так что для доступности переменной из других модулей надо их как-то объявлять - может, одинаково, а может, и по разному (типа загружаемый раньше модуль должен объявить переменную как свою, а остальные - как чужую).
Рекомендую посмотреть модуль miibus и модули сетевых карт, которые его используют (ed и разные PCI-ные), благо исхдники доступны. |
|
Вернуться к началу |
|
|
alexxxxxxxxxx Гость
|
Добавлено: Вт Сен 10 2002 14:49 Заголовок сообщения: Логики никакой просто надо сделать |
|
|
То, что надо как то по особенному объявлять переменые или загружать второй модуль с некоторым особенным параметром это уж как пить дать. Тока вот как?.. Исходников, miibus не нашел, а вот ed и ему подобных нашел, но эти дрова выполнены не ввиде модулей, а компиляться в ядро. А с ядром проблем нет, к его не extern переменным из модулей можно через extern обращаться.
Спасибо за предложенные советы. Я их опробывал, но пока положительного результата нет. Буду копать... |
|
Вернуться к началу |
|
|
Dmitry.Karpov httpwww.pi2 Гость
|
Добавлено: Ср Сен 11 2002 13:49 Заголовок сообщения: Не нравится ed - попробуй fxp или любой другой, работающий через miibus. А исходники miibus д.б. в ядре - поищи файл "miib |
|
|
- |
|
Вернуться к началу |
|
|
alexxxxxx Гость
|
Добавлено: Чт Сен 12 2002 11:22 Заголовок сообщения: Все еще в поиске... |
|
|
miibus, он в стандартной комплектации для всех версий freeBSD или тока для какой то конкретной (у меня версия ядра 2.ХХ? Побробую скачать откуда нибудь этот miibus. Да, если miibus ето KLD, то меня это не очень устраивает, потому как KLD это системно поддерживаемая технология динамической загрузки драйверов (да и не очень универсальная), а в моем unix такой траблы нет, а посему приходится извращаться. Читал о наличии такой вещи как Stream технология для драйверов (когда драйвера разбиваются по уровням и взаимодействуют друг с другом через потоки). Вот это то что надо, но попытки найти поддержку Stream в моем UNIX не привели к положительному результату, что и обязывает делать нечто подобное самому без внесения, однако, изменений в стандартное (откомпилированное и загружаемое) ядро.
А вообщем пока нашел решение завести некоторую переменную типа указатель на void, расположенную по конкретному физическому адресу и дать знать об этом адресе остальным загружаемым драйверам. Опасность в том какой физический адрес выбрать что бы в какой то момент не рухнула система или мои данные. Я чисто интуитивно остановился на адресе в первом мегабайте (ядро вроде начинает грузиться поверх первого метра), там, где в случае MS DOS должны располагаться io.sys и что то еще... Хотелось бы увидеть мнения на сей счет. |
|
Вернуться к началу |
|
|
Dmitry.Karpov Гость
|
Добавлено: Чт Сен 12 2002 11:26 Заголовок сообщения: Ну и старье!!! |
|
|
Во FreeBSD'2.x действительно еще не было динамически загружаемых модулей, так что рекомендую перейти на более новую версию, благо уже доступна 4.6.2 и на подходе 5.0. Лично я даю советы на основании 4.4. |
|
Вернуться к началу |
|
|
|