Пробую написать свой модуль, в функции module_init такая строчка
...
int F = sys_open("/etc/filename", O_RDONLY, 0);
...
возвращает -14 (есть файл, нету, все по барабану)... Прочитал про kernel/user spaces там предлагают такое решение
...
mm_segment_t fs = get_fs();
set_fs(get_ds());
int F = sys_open("/etc/filename", O_RDONLY, 0);
set_fs(fs);
...
Этот код засталяет ядро паниковать и все тут (много чего пришет, в конце "EIP bad value"). Кстати, в kern.log ни слова про панику (зачем тогда лог нужен?). Вопрос еще, как зделать чтобы логи паники появлялись в kern.log (если вообще возможно)?
Версия ядра - 2.6.9. Если кто сталкивался, раскажите
Т.е. ты хочешь из ядра открыть и прочитать файл. Так?
>Т.е. ты хочешь из ядра открыть и прочитать файл. Так?вроде так
>>Т.е. ты хочешь из ядра открыть и прочитать файл. Так?
>
>вроде такPoprobuy etot code:
/* copy_file.c */
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>// get_fs(), set_fs(), KERNEL_DS
#include <linux/file.h> // fput()
#include <linux/mm.h> // GFP_KERNEL
#include <linux/slab.h> // kmallocvoid copy_file(const char * fread, const char * fwrite)
{
int length_read, length_write;
char buffer[255];
struct file * f = NULL;
struct inode *inode;
mm_segment_t orig_fs;f = filp_open(fread, O_RDONLY, 00);
if (!f || !f->f_op || !f->f_op->read) {
printk(KERN_INFO "File (read) object is a null pointer!\n");
return;
}//f->f_pos = 2;
inode = f->f_dentry->d_inode;
printk(KERN_INFO "File size - %u\n", (unsigned int)inode->i_size);orig_fs = get_fs();
set_fs(KERNEL_DS);length_read = f->f_op->read(f, buffer, 4, &f->f_pos);
fput(f);
f = filp_open(fwrite, O_WRONLY | O_CREAT, 0600);
if (!f || !f->f_op || !f->f_op->write) {
printk(KERN_INFO "File (write) object is a null pointer!\n");
return;
}//f->f_pos = 4;
orig_fs = get_fs();
set_fs(KERNEL_DS);length_write = f->f_op->write(f, buffer, 4, &f->f_pos);
fput(f);
return;
}
static int __init copymodule_init(void)
{
unsigned char *file_to_read = kmalloc(20, GFP_KERNEL);
unsigned char *file_to_write = kmalloc(20, GFP_KERNEL);file_to_read = "/home/readwrite/mark";
file_to_write = "/home/readwrite/mike";
copy_file(file_to_read, file_to_write);
return 0;
}static void __exit copymodule_exit(void)
{
return;
}module_init(copymodule_init);
module_exit(copymodule_exit);MODULE_LICENSE("GPL");
/* end of copy_file.c */#Makefile:
CC = gcc
CFLAGS = -O2 -Wall
LINUX = /usr/src/linux
MODFLAGS = -D__KERNEL__ -DMODULE -I$(LINUX)/includecopy_file.o: copy_file.c
$(CC) $(CFLAGS) $(MODFLAGS) -c copy_file.c
#end of MakefilePosle compilyacii vvodi comandu:
insmod copy_file.oTolko pravil`no zaday imena faylov (file_to_read i file_to_write).
P.S. Kernel 2.4.28.
Может, оно и работает... Но скорее вопреки усилиям автора, чем благодаря
им. Например, меня сильно радует фрагментик:static int __init copymodule_init(void)
{
unsigned char *file_to_read = kmalloc(20, GFP_KERNEL);
unsigned char *file_to_write = kmalloc(20, GFP_KERNEL);file_to_read = "/home/readwrite/mark";
file_to_write = "/home/readwrite/mike";
copy_file(file_to_read, file_to_write);
return 0;
}
M-da... Desitvitel'no... Vopreki...
>>>Т.е. ты хочешь из ядра открыть и прочитать файл. Так?
>>
>>вроде так
>
>Poprobuy etot code:
>Разбираюсь... спасибо
>Этот код засталяет ядро паниковать и все тут (много чего пришет, в
>конце "EIP bad value").Скорее всего ядро заставляет паниковать другой код, т.к. то, что написано - корректно.
> Кстати, в kern.log ни слова про панику
>(зачем тогда лог нужен?). Вопрос еще, как зделать чтобы логи паники
>появлялись в kern.log (если вообще возможно)?man klogd
>Версия ядра - 2.6.9. Если кто сталкивался, раскажите