LinuxForum.Fans
Тема

Может ли модуль читать обычный файл?

Автор: nihao 33 сообщений 16391 просмотров
#138003

Можно ли в модуле выполнить те же функции, что и в пользовательской программе? А именно: открыть файл (не файл устройства! не в /proc) и прочитать данные оттуда в свой собственный буфер, дабы потом передать эти данные по запросу пользователю.

Внутренний голос подсказывает, что нельзя. Но вдруг есть способ?

Вообще раньше данный модуль получал данные от pci-ной железки и передавал их по запросу пользователю (а точнее - целому ППО) . Теперь внутренность компа несколько изменились. В итоге нужные данные приходят в FIFO-файл. Дабы не сильно модифицировать это самое ППО, хотят так изменить прежний модуль (с которым общалось это ППО), чтобы ППО ничего не заметило.

Просто от пользователя посылать вместо имени девайса (/dev/...) имя FIFO-файла - не получается.

#138026

ядро может все... и не обязательно читать из /proc - можно вызвать функцию, которая пишет в /proc.

#138036
nihao написал:
Можно ли в модуле выполнить те же функции, что и в пользовательской программе?

нет. у ядра есть свои функции.

nihao написал:

1)А именно: открыть файл (не файл устройства! не в /proc) и прочитать данные оттуда в свой собственный буфер,
2) дабы потом передать эти данные по запросу пользователю.

1) можно.
2) вот тут - не знаю. как пойдёт запрос-то? ядро может передавать сигналы от одного процесса другому, но вот как передать сигнал модулю - не знаю.

#138344
drBatty написал:

1) можно.

Как? ткните, пожалуйста!

drBatty написал:

2) вот тут - не знаю. как пойдёт запрос-то? ядро может передавать сигналы от одного процесса другому, но вот как передать сигнал модулю - не знаю.

Пардон. некорректно выразилась.

Имелось ввиду, что пользователь спрашивает (через ioctl), есть ли данные и если есть, читает их read-ом.
Думаю, если будет в модуле собственный буфер с данными, то можно прописать функцию read на передачу этих данных.
Осталось только модулю добыть эти данные из FIFO.

#138346
UTe11ok написал:
ядро может все... и не обязательно читать из /proc - можно вызвать функцию, которая пишет в /proc.

А по подробнее?

#138413
nihao написал:
А по подробнее?

Как Вы открываете файл из user space? С помощью system call.
Что далает system call? Обращается к ядру и вызвывает системную функцию, для открытия файла.

Зачем из ядра вызвать system call, если мы и так уже работаем в адресном пространстве ядра?

#138426
nihao написал:
Как? ткните, пожалуйста!

/usr/src/linux-2.6.33.4/fs/ext4/ext4.h

#212758
UTe11ok написал:
[quote=nihao]А по подробнее?

Как Вы открываете файл из user space? С помощью system call.
Что далает system call? Обращается к ядру и вызвывает системную функцию, для открытия файла.

Зачем из ядра вызвать system call, если мы и так уже работаем в адресном пространстве ядра?[/quote]

Вопрос был - хорош!

Ответы были все - полная херня :(

Этот последний - особенно.

Любой (почти любой) system call, кроме своего предписанного действия делает (своим кодом!) что? правильно wink : а). перед собственно действием копирует параметры userspace->kernelspace + б). после действия копирует результаты kernelspace->userspace.
Поэтому вот в этих местах своего кода system call вызванный из kernel - зашьётся ... ну нет, нет для него userspace :lol:

Кое-какие эксперименты на этот счёт показаны здесь.

А вопрос то - хорош... не без интереса его обсудить.
Только open() - read() - close() ... - здесь полная херня.
Такой модуль (обращающийся к fs) должен вызывать по экспортируемым именам модуль самой fs, и не вообще fs, а той конкретно fs, например ext2 ... А как быть и что делать, если модуль той fs которая нужна ещё не загружался?

P.S. а вот запустить в пользовательское пространство новое приложение как exec() модуль элементарно может wink
а делает это exec() по имени файла ... значит ядро легко находит файлы по их именам...

#212783

Olej, во-первых, полегче в выражениях, особенно когда сами бред пишите. во-вторых читайте сообщения внимательно, прежде чем писать, что всё - херня.

Olej написал:
Поэтому вот в этих местах своего кода system call вызванный из kernel - зашьётся ... ну нет, нет для него userspace

никто не предлагал пускать всё по общему тракту через системный вызов

Olej написал:
Кое-какие эксперименты на этот счёт показаны здесь.

много текста... раз уж в очередной раз шлёте на rus-linux, то хоть точнее бы указали, а то во все дыры лепите к месту и не к месту.

Olej написал:
Только open() - read() - close() ... - здесь полная херня.

это как раз верный путь. с двумя оговорками:
1) использовать не прямо эту схему, а аналогичную(легко находится по исходникам)
2) обычный файл из ядра можно читать только при крайней необходимости(или когда очень лень всё переделывать)

Olej написал:
Такой модуль (обращающийся к fs) должен вызывать по экспортируемым именам модуль самой fs, и не вообще fs, а той конкретно fs, например ext2 ...

"я упала с самосвала тормозила головой" (с)
или трава такая хорошая?

Olej написал:
а вот запустить в пользовательское пространство новое приложение как exec() модуль элементарно может

как exec модуль уж точно не может. man 3 exec для закрепления.

#212826
Fat-Zer написал:

[quote=Olej]Кое-какие эксперименты на этот счёт показаны здесь.

много текста... раз уж в очередной раз шлёте на rus-linux, то хоть точнее бы указали, а то во все дыры лепите к месту и не к месту.
[/quote]

Какие ж вы тут все нервные wink ... ну, прям дЕвицы из смольного института wink
Никуда я вас не шлю (потому как если бы слал - то в другое место wink )
И rus-linux мне - до фени, он такой же мой, как и ваш: они первыми предложили рукопись разместить у себя - пусть будет у них... Отсылаю, потому как всяк заинтересованный найдёт там то, о чём мы здесь говорим, а незаинтересованному - так ему и не надо!
Я у них на то время эти обсуждения писал ... сегодня у вас пишу ... завтра ещё куда пойду, где мне веселее (я много-много где свои заметки оставлял) - что ж мне? всю свою писанину с места на место в полном объёме перетаскивать?

Fat-Zer написал:

[quote=Olej]Только open() - read() - close() ... - здесь полная херня.

это как раз верный путь. с двумя оговорками:
1) использовать не прямо эту схему, а аналогичную(легко находится по исходникам)
[/quote]
Что находится из исходников? Если эти имена ядром не экспортируются? Как вы к ним будете связываться? Абсолютные адреса вызова из "исходников" вписывать? :D :D :D

Fat-Zer написал:

2) обычный файл из ядра можно читать только при крайней необходимости(или когда очень лень всё переделывать)

Обычный файл из ядра читать может трудно, а может и невозможно ... даже "только при крайней необходимости"(с)
Вы покажите как читать - и всё станет, может, не так трудно? :D

Fat-Zer написал:

[quote=Olej] а вот запустить в пользовательское пространство новое приложение как exec() модуль элементарно может

как exec модуль уж точно не может. man 3 exec для закрепления.
[/quote]
я ведь не сказал "exec", а сказал "как exec" wink - это чтоб ... ну, не очень продвинутым было понятно, по аналогии wink
вызов там называется call_usermodehelper()
вы можете пойти ... wink не-е-е-е, не туда, а туда где "много текста"(с) - там есть архив примеров, и вы мне можете не поверить, но там все примеры - работающие и проверены... берите - пользуйтесь wink ; и там есть как раз запуск из модуля "как exec" ... наслаждайтесь :lol:

#212827
Olej написал:
и там есть как раз запуск из модуля "как exec" ... наслаждайтесь :lol:

Я вам ещё чудовищнее вэсчь скажу, ещё крамольнее по звучанию: из ядра даже сигналы UNIX можно посылать процессам юзерспейс! :O

#212828
Fat-Zer написал:
Olej, во-первых, полегче в выражениях, особенно когда сами бред пишите. во-вторых читайте сообщения внимательно, прежде чем писать, что всё - херня.

Уважаемый Fat-Zer, правда - она не может быть абыдной wink , она может быть горькой, но абыдной быть не может, если это правда.
Если сказано, что всё херня, так оно всё - это слово и есть :lol:

#212831
Olej написал:
вы можете пойти ... wink не-е-е-е, не туда, а туда где "много текста"(с) - там есть архив примеров, и вы мне можете не поверить, но там все примеры - работающие и проверены... берите - пользуйтесь

зачем?

#212835
drBatty написал:
зачем?

Ну ... может ума наберётесь? wink

Или нет?

#212836

Нет, ну как малые дети, право wink

Ну взял бы кто, да пример модуля ядра привёл бы, который файл читает ... да и дело с концом! :[

#212843
Olej написал:
Ну взял бы кто, да пример модуля ядра привёл бы, который файл читает ... да и дело с концом!

я вполне конкретный вопрос задал - зачем это нужно?
Мне это непонятно. Причём тут дети малые?

#212864
drBatty написал:
[quote=Olej]Ну взял бы кто, да пример модуля ядра привёл бы, который файл читает ... да и дело с концом!

я вполне конкретный вопрос задал - зачем это нужно?
[/quote]

Зачем?
Был вопрос задан:

drBatty написал:

Можно ли в модуле выполнить те же функции, что и в пользовательской программе? А именно: открыть файл

Вопрос хороший и ответ на него не очевидный...
Но в ответ на него начали такую пургу безграмотную нести (и вы, drBatty, как везже - в первых рядах отметившись :D :( )...

Это вместо того, чтобы и вправду обсудить и, может, на фактах показать "как?" :
- модуль становится после загрузки такой же частью ядра, как и само ядро, и может сделать всё... (это в принципе)
- вплоть до того, чтобы разрушить систему дотла - это те неизбежные "прелести", которые нужно платить за моноядерное ядро ... и не потому, что в Linux конкретно это так через задницу сделано, а в любом монолитном ядре так будет!
- в частности, наверняка можно из кода ядра открыть и читать файл по имени (вопрос, от которого всё и началось);
- но так же наверняка это нельзя сделать, обратившись к обработчикам системных вызовов open(), read() в ядре ... даже если бы вам удалось найти их точки входа (поскольку таблица syscall в ядре 2.6 не экспортируется, и сделать это без трюков совсем не просто, ... без экспорта у вас просто связывание адресов не произойдёт на этапе компиляции модуля, вы его не соберёте);
- но нельзя использовать код обработчиков open(), read() и др. в ядре по другой, более веской, причине: этот код всегда заточен для копирования параметров-результатов между адресными пространствами пользователя и ядра (сначала туда, а затем обратно), а в нашем случае просто нет пользовательского адресного пространства ...
- но можно было бы решить поставленную задачу (наверное) обратившись к последовательной россыпи тех вызовов, которые и используют для этого сами системные вызовы open(), read() и др.
- и это могло бы быть или очень просто ... или очень сложно... но дальше можно было бы судить только обсуждая образец кода, который бы это делал...
- вот для чего его и предлагалось показать.

А любой другой ответ - это: бла-бла-бла ... такое вот блеяние, чтобы только покрасоваться "ой, какой же я ку-у-у-у-л" :D

Вот где-то так wink

#212865

drBatty написал:
[quote=Olej]Причём тут дети малые?
[/quote]

При том, что "Букварь" читай, а "при чём" пиши раздельно :lol:
#212871
Olej написал:
[quote=drBatty][quote=Olej]Ну взял бы кто, да пример модуля ядра привёл бы, который файл читает ... да и дело с концом!

я вполне конкретный вопрос задал - зачем это нужно?
[/quote]

Зачем?
Был вопрос задан:

drBatty написал:

Можно ли в модуле выполнить те же функции, что и в пользовательской программе? А именно: открыть файл

Вопрос хороший и ответ на него не очевидный...[/quote]

цитировать научитесь. Уже и на кнопку не попасть. Потом портещим о "грамотности".

(непонятно? не надо мне свои слова приписывать. Можно читать свои посты перед отсылкой, раз уж вы меня обвиняете в неграмотности.)

#212872
Olej написал:
Но в ответ на него начали такую пургу безграмотную нести (и вы, drBatty, как везже - в первых рядах отметившись big_smile sad )...
Это вместо того, чтобы и вправду обсудить и, может, на фактах показать "как?" :

вы не показали ничего. До свидания. Вы в игноре.

Войдите или зарегистрируйтесь, чтобы ответить.