Code für Lesen und schreiben auf eine device-Datei ein kernel-Modul?
Habe ich versucht den folgenden code viele Male .
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/fs.h>
#include<linux/cdev.h>
#include<asm/uaccess.h>
#include<linux/semaphore.h>
MODULE_LICENSE("DUAL BSD/GPL");
static int dev_open(struct inode *,struct file *);
static int dev_release(struct inode *,struct file *);
ssize_t dev_read(struct file *,char *, size_t ,loff_t *);
ssize_t dev_write(struct file *,const char *,size_t ,loff_t *);
static int major;
int dev_major = 0;
int dev_minor = 0;
struct cdev *cdev;
struct device {
char array[100];
struct semaphore sem;
}chr_arr;
struct file_operations dev_ops = {
.owner = THIS_MODULE,
.read = dev_read,
.write = dev_write,
.open = dev_open,
.release = dev_release
};
ssize_t dev_read(struct file *filp,char *buf,size_t count,loff_t *offset)
{
int i;
i=copy_to_user(buf,chr_arr.array,count);
printk(KERN_ALERT"buff:%s",buf);
return i;
}
ssize_t dev_write(struct file *filp,const char *buf,size_t count,loff_t *offset)
{
//printk(KERN_ALERT"\nsorry,byebye");
int j;
//msg_ptr = kmalloc(count,GFP_KERNEL);
//for(j=0;j<count;j++)
if(count>100)
return -1;
j = copy_from_user(chr_arr.array,buf,count);
//printk(KERN_ALERT"msg_ptr:%s",msg_ptr);
return j;
}
static int dev_open(struct inode *inode,struct file *filp)
{
filp->private_data = inode->i_cdev;
if(down_interruptible(&chr_arr.sem))
{
printk(KERN_INFO " could not hold semaphore");
return -1;
}
//printk(KERN_ALERT"ah ha the device is open !now we can go further");
return 0;
}
static int dev_release(struct inode *inode,struct file *filp)
{
up(&chr_arr.sem);
//module_put(THIS_MODULE);
return 0;
}
static int init_device(void)
{
int result;
dev_t dev_no,dev;
result = alloc_chrdev_region(&dev_no,0,1,"chr_dev");
if(result < 0)
{
printk("sorry no major number left");
return result;
}
major = MAJOR(dev_no);
dev = MKDEV(major,0);
cdev = cdev_alloc();
cdev->ops = &dev_ops;
sema_init(&chr_arr.sem,1);
printk("the major number allocated is %d\n",major);
result = cdev_add(cdev,dev,1);
if(result < 0 )
{
printk(KERN_INFO "Unable to allocate cdev");
return result;
}
return 0;
}
static void clean_device(void)
{
cdev_del(cdev);
unregister_chrdev_region(major,1);
}
module_init(init_device);
module_exit(clean_device);
aber sein, dass Sie mir die folgende Warnung.
CC [M] /home/karan/practice/scrw/scrw1.o
In file included from /usr/src/linux-2.6.34.10-0.6/arch/x86/include/asm/uaccess.h:571:0,
from /home/karan/practice/scrw/scrw1.c:4:
In function ‘copy_from_user’,inlined from ‘write’ at /home/karan/practice/scrw/scrw1.c:43:6:
/usr/src/linux-2.6.34.10-0.6/arch/x86/include/asm/uaccess_32.h:212:26: warning: call to ‘copy_from_user_overflow’ declared with attribute warning: copy_from_user() buffer size is not provably correct
Building modules, stage 2.
MODPOST 1 modules
CC /home/karan/practice/scrw/scrw1.mod.o
LD [M] /home/karan/practice/scrw/scrw1.ko
dann, wenn ich versuche zu schreiben echo Hallo > /dev/my_dev der Bildschirm friert ein, nach 30 Sek oder so.
- sollten Sie nicht test für count < 100?
- das ist ok, aber es funktioniert nicht wenn ich echo-Befehl hängt er sich nach paar Sek.....
- Das problem liegt wahrscheinlich woanders. Können Sie zeigen Sie Ihren code? Sie können auch versuchen, Ihren kernel neu kompilieren mit debug-Optionen aktiviert, so erhalten Sie möglicherweise einen stack-trace, wenn der freeze Auftritt.
- hi ... könnten Sie erzählen, wie Ihnen mein code ...ich glaube nicht, seine möglich, code zu schreiben, auf Kommentar....
- hi, man konnte sehen, meinen code auf den folgenden forum-link unter karan2386 Benutzer-id (die Letzte) [link] linuxquestions.org/questions/linux-kernel-70/...
- Können Sie nicht Bearbeiten Sie Ihre ursprüngliche Frage? Sie können auch laden Sie Sie z.B. pastebin.
- hi ... ich habe es getan, könnten Sie einen Blick auf es.
- jetzt schreiben die Funktion ist in Ordnung, aber die read-Funktion ist nicht ...immer wenn ich mit cat /dev/my_dev es liest infintely ich habe versucht mit return count ein dwithout es auch.....bitte helfen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie zurückgeben soll, die Anzahl der bytes, die gelesen/geschrieben wird in der read - /write-Methoden, die einen Rückgabewert copy_{aus,an}_durch() ist 0, wenn alles gut geht. Zurück zählen zB die in Ihrem write-Methode, wenn das kopieren erfolgreich:
Sollten Sie auch sicherstellen, dass ein abschließendes '\0' - Zeichen angehängt wird, wenn Sie kopieren, um den Puffer (wenn Sie möchten, sich nur mit strings). Wenn es binäre Daten, Sie befassen sich mit der Speicherung seiner Länge in Ihrer Struktur als auch.
Beispiel read-Methode:
Edit: messed up Beispiel-code, es zu beheben.
Edit2: Beispiel-Lesen-Methode.