LINUX.ORG.RU

можно попробовать через вызовы vfs_*
тема эта тут уже поднималась.

xydo ★★
()

> Появился вопрос - каким образом из этого модуля можно открыть фаил символьного устройства

ты уверен, что тебе нужен именно модуль ядра?

tailgunner ★★★★★
()

Это плохой дизайн. Лучше не открывать файлов из ядра.

tim239 ★★
()

В корне не правильный подход если требуется открыть файл из ядра. Опиши задачу вкратце.

I-Love-Microsoft ★★★★★
()

Есть такой загрузчик - kexecboot. По сути патч к ядру. Он монтирует всё что есть и ищет там в /boot ядро и конфиг. И конфиг этот читает. Посмотри в сурсах как они это сделали, хотя вопрос о кривизне архитектуры я считаю открытым.

anonymous
()
Ответ на: комментарий от anonymous

Я знаю что подход достаточно кривой но цель у этого модуля в получении зачета))) Собственно задача - открыть фаил устройства мышки и при чтении из модуля (device_read) прочитать из этого файла и вывести наружу (в логи или консоль) то что было прочтено.

XShadow
() автор топика
Ответ на: комментарий от XShadow

Попробовал стандартно открыть фаил через open.

Если эту функцию не вызывать все нормально компилируется. Если вызвать ругается /home/shad/li/mou.c:119: error: implicit declaration of function ‘open’.
Инклуд сделал #include <linux/fcntl.h>. С ним компилится все.
Параметры компиляции: make -C /usr/src/linux-headers-`uname -r` SUBDIRS=$PWD

В чем может быть причина?

XShadow
() автор топика
Ответ на: комментарий от frey

Какой инклуд нужно подключить для использования vfs_open?? Попробовал просто его использовать и выдает теже /home/shad/li/mou.c:119: error: implicit declaration of function ‘vfs_open’.

XShadow
() автор топика
Ответ на: комментарий от XShadow

Максимально упростил.

Исходник:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fcntl.h>   
#include <linux/unistd.h>   

int init_module(void)
{
   int fd;

   fd = open(«/dev/input/mice», 0);
   close(fd);

   printk(«<1>Hello world 1.\n»);
   return 0;
}

void cleanup_module(void)
{
printk(KERN_ALERT «Goodbye world 1.\n»);
}

Makefile: obj-m += sip.o

Параметры сборки: make -C /usr/src/linux-headers-`uname -r` SUBDIRS=$PWD^C

Вот что выдает:
root@shad:/home/shad/li# make -C /usr/src/linux-headers-`uname -r` SUBDIRS=$PWD
make: Вход в каталог `/usr/src/linux-headers-2.6.32-21-generic'
CC [M] /home/shad/li/sip.o
/home/shad/li/sip.c: In function ‘init_module’:
/home/shad/li/sip.c:10: error: implicit declaration of function ‘open’
/home/shad/li/sip.c:11: error: implicit declaration of function ‘close’
make[1]: *** [/home/shad/li/sip.o] Ошибка 1
make: *** [_module_/home/shad/li] Ошибка 2
make: Выход из каталога `/usr/src/linux-headers-2.6.32-21-generic'

Почему не находит объявление функции open?

XShadow
() автор топика
Ответ на: комментарий от frey

Какие инклуды нужно подключить чтобы использовать sys_open и vfs_open?

XShadow
() автор топика
Ответ на: комментарий от AnDoR

А должно быть как минимум /home/shadow/linux/mouse.c


а какая разница как я назвал фаил и путь к нему?)

Проблему решил:

   int length_read;
   char buffer[80];
   struct file * f = NULL;
   mm_segment_t orig_fs;

   f = filp_open(«/dev/input/mice», O_RDONLY, 00);

   orig_fs = get_fs();
   set_fs(KERNEL_DS);

   length_read = f->f_op->read(f, buffer, 1, &f->f_pos);

   fput(f);
   return buffer;

Всем спасибо

XShadow
() автор топика
Ответ на: комментарий от XShadow

Ты в стеке отводишь 80 байт под buffer, потом возвращаешь указатель на этот buffer. Молодец, блин =( Там могут быть те данные, которые тебе нужны, прямо сейчас, но пямять может быть изменена в любой момент. Это одна из широко известных ошибок неопытных программистов на C.

tim239 ★★
()
Ответ на: комментарий от tim239

>Это одна из широко известных ошибок неопытных программистов на C.

Так ему ж зачет надо получить. А так-то вообще одна из главных ошибок любых программистов — писать модуль ядра чтобы делать из него исключительно то, что можно делать из юзерспейса.

proud_anon ★★★★★
()

Блин, убейте его кто нибудь.

Нах%$ ты пошел на специальность где тебя заставляют писать модули ядра назачет, а ты спрашиваешь «какие инклуды подключать»? Хотя явно это было и на лекциях и все вам, одаренным, объяснялось.

И нафига ты это на лоре спрашиваешь, будущая жертва военкомата? У одногрупников спросить в голову не пришло, вследствие тотальной незамутненности сознания? «Вот он я, прямо из дерёвни, у кого хочу у того и спрашиваю»?

kernel ★★☆
()
Ответ на: комментарий от proud_anon

Такие указатели возвращать - можно и без зачета остаться. Тут не юзерспейс.

tim239 ★★
()
Ответ на: комментарий от kernel

>Блин, убейте его кто нибудь.

Чему ты удивляешься, это же ЛОР, он уже давно не торт. Тут остались только такая школота как автор топика и псевдоэксперты, которые смотрят на всех с высока, но сами ничего стоящего не написали.

anonymous
()
Ответ на: комментарий от anonymous

> но сами ничего стоящего не написали.

У тебя есть желание развернуто ему отвечать?

frey ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.