Можно ли в модуле выполнить те же функции, что и в пользовательской программе? А именно: открыть файл (не файл устройства! не в /proc) и прочитать данные оттуда в свой собственный буфер, дабы потом передать эти данные по запросу пользователю.
Внутренний голос подсказывает, что нельзя. Но вдруг есть способ?
Вообще раньше данный модуль получал данные от pci-ной железки и передавал их по запросу пользователю (а точнее - целому ППО) . Теперь внутренность компа несколько изменились. В итоге нужные данные приходят в FIFO-файл. Дабы не сильно модифицировать это самое ППО, хотят так изменить прежний модуль (с которым общалось это ППО), чтобы ППО ничего не заметило.
Просто от пользователя посылать вместо имени девайса (/dev/...) имя FIFO-файла - не получается.
Может ли модуль читать обычный файл?
ядро может все... и не обязательно читать из /proc - можно вызвать функцию, которая пишет в /proc.
Можно ли в модуле выполнить те же функции, что и в пользовательской программе?
нет. у ядра есть свои функции.
1)А именно: открыть файл (не файл устройства! не в /proc) и прочитать данные оттуда в свой собственный буфер,
2) дабы потом передать эти данные по запросу пользователю.
1) можно.
2) вот тут - не знаю. как пойдёт запрос-то? ядро может передавать сигналы от одного процесса другому, но вот как передать сигнал модулю - не знаю.
1) можно.
Как? ткните, пожалуйста!
2) вот тут - не знаю. как пойдёт запрос-то? ядро может передавать сигналы от одного процесса другому, но вот как передать сигнал модулю - не знаю.
Пардон. некорректно выразилась.
Имелось ввиду, что пользователь спрашивает (через ioctl), есть ли данные и если есть, читает их read-ом.
Думаю, если будет в модуле собственный буфер с данными, то можно прописать функцию read на передачу этих данных.
Осталось только модулю добыть эти данные из FIFO.
ядро может все... и не обязательно читать из /proc - можно вызвать функцию, которая пишет в /proc.
А по подробнее?
А по подробнее?
Как Вы открываете файл из user space? С помощью system call.
Что далает system call? Обращается к ядру и вызвывает системную функцию, для открытия файла.
Зачем из ядра вызвать system call, если мы и так уже работаем в адресном пространстве ядра?
Как? ткните, пожалуйста!
/usr/src/linux-2.6.33.4/fs/ext4/ext4.h
[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() по имени файла ... значит ядро легко находит файлы по их именам...
Olej, во-первых, полегче в выражениях, особенно когда сами бред пишите. во-вторых читайте сообщения внимательно, прежде чем писать, что всё - херня.
Поэтому вот в этих местах своего кода system call вызванный из kernel - зашьётся ... ну нет, нет для него userspace
никто не предлагал пускать всё по общему тракту через системный вызов
Кое-какие эксперименты на этот счёт показаны здесь.
много текста... раз уж в очередной раз шлёте на rus-linux, то хоть точнее бы указали, а то во все дыры лепите к месту и не к месту.
Только open() - read() - close() ... - здесь полная херня.
это как раз верный путь. с двумя оговорками:
1) использовать не прямо эту схему, а аналогичную(легко находится по исходникам)
2) обычный файл из ядра можно читать только при крайней необходимости(или когда очень лень всё переделывать)
Такой модуль (обращающийся к fs) должен вызывать по экспортируемым именам модуль самой fs, и не вообще fs, а той конкретно fs, например ext2 ...
"я упала с самосвала тормозила головой" (с)
или трава такая хорошая?
а вот запустить в пользовательское пространство новое приложение как exec() модуль элементарно может
как exec модуль уж точно не может. man 3 exec для закрепления.
[quote=Olej]Кое-какие эксперименты на этот счёт показаны здесь.
много текста... раз уж в очередной раз шлёте на rus-linux, то хоть точнее бы указали, а то во все дыры лепите к месту и не к месту.
[/quote]
Какие ж вы тут все нервные wink ... ну, прям дЕвицы из смольного института wink
Никуда я вас не шлю (потому как если бы слал - то в другое место wink )
И rus-linux мне - до фени, он такой же мой, как и ваш: они первыми предложили рукопись разместить у себя - пусть будет у них... Отсылаю, потому как всяк заинтересованный найдёт там то, о чём мы здесь говорим, а незаинтересованному - так ему и не надо!
Я у них на то время эти обсуждения писал ... сегодня у вас пишу ... завтра ещё куда пойду, где мне веселее (я много-много где свои заметки оставлял) - что ж мне? всю свою писанину с места на место в полном объёме перетаскивать?
[quote=Olej]Только open() - read() - close() ... - здесь полная херня.
это как раз верный путь. с двумя оговорками:
1) использовать не прямо эту схему, а аналогичную(легко находится по исходникам)
[/quote]
Что находится из исходников? Если эти имена ядром не экспортируются? Как вы к ним будете связываться? Абсолютные адреса вызова из "исходников" вписывать? :D :D :D
2) обычный файл из ядра можно читать только при крайней необходимости(или когда очень лень всё переделывать)
Обычный файл из ядра читать может трудно, а может и невозможно ... даже "только при крайней необходимости"(с)
Вы покажите как читать - и всё станет, может, не так трудно? :D
[quote=Olej] а вот запустить в пользовательское пространство новое приложение как exec() модуль элементарно может
как exec модуль уж точно не может. man 3 exec для закрепления.
[/quote]
я ведь не сказал "exec", а сказал "как exec" wink - это чтоб ... ну, не очень продвинутым было понятно, по аналогии wink
вызов там называется call_usermodehelper()
вы можете пойти ... wink не-е-е-е, не туда, а туда где "много текста"(с) - там есть архив примеров, и вы мне можете не поверить, но там все примеры - работающие и проверены... берите - пользуйтесь wink ; и там есть как раз запуск из модуля "как exec" ... наслаждайтесь :lol:
и там есть как раз запуск из модуля "как exec" ... наслаждайтесь :lol:
Я вам ещё чудовищнее вэсчь скажу, ещё крамольнее по звучанию: из ядра даже сигналы UNIX можно посылать процессам юзерспейс! :O
Olej, во-первых, полегче в выражениях, особенно когда сами бред пишите. во-вторых читайте сообщения внимательно, прежде чем писать, что всё - херня.
Уважаемый Fat-Zer, правда - она не может быть абыдной wink , она может быть горькой, но абыдной быть не может, если это правда.
Если сказано, что всё херня, так оно всё - это слово и есть :lol:
вы можете пойти ... wink не-е-е-е, не туда, а туда где "много текста"(с) - там есть архив примеров, и вы мне можете не поверить, но там все примеры - работающие и проверены... берите - пользуйтесь
зачем?
зачем?
Ну ... может ума наберётесь? wink
Или нет?
Нет, ну как малые дети, право wink
Ну взял бы кто, да пример модуля ядра привёл бы, который файл читает ... да и дело с концом! :[
Ну взял бы кто, да пример модуля ядра привёл бы, который файл читает ... да и дело с концом!
я вполне конкретный вопрос задал - зачем это нужно?
Мне это непонятно. Причём тут дети малые?
[quote=Olej]Ну взял бы кто, да пример модуля ядра привёл бы, который файл читает ... да и дело с концом!
я вполне конкретный вопрос задал - зачем это нужно?
[/quote]
Зачем?
Был вопрос задан:
Можно ли в модуле выполнить те же функции, что и в пользовательской программе? А именно: открыть файл
Вопрос хороший и ответ на него не очевидный...
Но в ответ на него начали такую пургу безграмотную нести (и вы, drBatty, как везже - в первых рядах отметившись :D :( )...
Это вместо того, чтобы и вправду обсудить и, может, на фактах показать "как?" :
- модуль становится после загрузки такой же частью ядра, как и само ядро, и может сделать всё... (это в принципе)
- вплоть до того, чтобы разрушить систему дотла - это те неизбежные "прелести", которые нужно платить за моноядерное ядро ... и не потому, что в Linux конкретно это так через задницу сделано, а в любом монолитном ядре так будет!
- в частности, наверняка можно из кода ядра открыть и читать файл по имени (вопрос, от которого всё и началось);
- но так же наверняка это нельзя сделать, обратившись к обработчикам системных вызовов open(), read() в ядре ... даже если бы вам удалось найти их точки входа (поскольку таблица syscall в ядре 2.6 не экспортируется, и сделать это без трюков совсем не просто, ... без экспорта у вас просто связывание адресов не произойдёт на этапе компиляции модуля, вы его не соберёте);
- но нельзя использовать код обработчиков open(), read() и др. в ядре по другой, более веской, причине: этот код всегда заточен для копирования параметров-результатов между адресными пространствами пользователя и ядра (сначала туда, а затем обратно), а в нашем случае просто нет пользовательского адресного пространства ...
- но можно было бы решить поставленную задачу (наверное) обратившись к последовательной россыпи тех вызовов, которые и используют для этого сами системные вызовы open(), read() и др.
- и это могло бы быть или очень просто ... или очень сложно... но дальше можно было бы судить только обсуждая образец кода, который бы это делал...
- вот для чего его и предлагалось показать.
А любой другой ответ - это: бла-бла-бла ... такое вот блеяние, чтобы только покрасоваться "ой, какой же я ку-у-у-у-л" :D
Вот где-то так wink
[/quote][quote=Olej]Причём тут дети малые?
При том, что "Букварь" читай, а "при чём" пиши раздельно :lol:
[quote=drBatty][quote=Olej]Ну взял бы кто, да пример модуля ядра привёл бы, который файл читает ... да и дело с концом!
я вполне конкретный вопрос задал - зачем это нужно?
[/quote]
Зачем?
Был вопрос задан:
Можно ли в модуле выполнить те же функции, что и в пользовательской программе? А именно: открыть файл
Вопрос хороший и ответ на него не очевидный...[/quote]
цитировать научитесь. Уже и на кнопку не попасть. Потом портещим о "грамотности".
(непонятно? не надо мне свои слова приписывать. Можно читать свои посты перед отсылкой, раз уж вы меня обвиняете в неграмотности.)
Но в ответ на него начали такую пургу безграмотную нести (и вы, drBatty, как везже - в первых рядах отметившись big_smile sad )...
Это вместо того, чтобы и вправду обсудить и, может, на фактах показать "как?" :
вы не показали ничего. До свидания. Вы в игноре.