我正在嘗試編寫一個非常簡單的echo Linux驅動程序。無法識別echo內核模塊中的錯誤
該驅動程序最多需要250個命令行字符,並將其寫入虛擬設備「mydev」。這再次從設備讀回。前端和驅動程序代碼粘貼在下面以供參考。
問題是我能寫但不能讀。編譯或分段錯誤沒有錯誤。但是,在驅動程序讀取的printk中沒有任何消息被打印。我對所發生的事情感到困惑。我可以在這裏得到一些線索嗎?
我只是分享代碼複製,更清晰:
mydriver.c:
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
static int major;
static char kbuf[250];
static int dv_open(struct inode *inode, struct file *filp)
{
return 0;
}
static int dv_close(struct inode *inode, struct file *filp)
{
return 0;
}
static ssize_t dv_read(struct file *filp, char __user *buf,
size_t sz, loff_t *fpos)
{
int r;
int L;
printk("READ:Entering\n");
L = strlen(kbuf);
r = copy_to_user(buf, kbuf, L);
printk("READ:Ends\n");
return L;
}
static ssize_t dv_write(struct file *filp, const char __user *buf,
size_t sz, loff_t *fpos)
{
int r, wr_sz;
printk("WRITE:Entering\n");
memset(kbuf,'\0', 250);
if (sz <= 250) {
wr_sz = sz;
} else {
wr_sz = 250;
}
r = copy_from_user(kbuf, buf, wr_sz);
printk("WRITE:Rx buf = %s\n", kbuf);
return 0;
}
static struct file_operations dv_fops = {
.open = dv_open,
.release = dv_close,
.read = dv_read,
.write = dv_write,
.owner = THIS_MODULE,
};
int init_module(void)
{
major = register_chrdev(0, "dvdev", &dv_fops);
if (major < 0) {
printk("Error in registering driver\n");
return -1;
}
else printk("Success. major = %d\n", major);
return 0;
}
void cleanup_module(void)
{
unregister_chrdev(major, "dvdev");
}
myuserapp.c
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
static char buf[250];
static char * wbuf;
int main(int argc, char **argv)
{
int fd;
int option;
int nbr = 0, len;
if (argc != 2) {
printf("usage: front <devName>\n");
return -1;
}
fd = open("mydev", O_RDONLY | O_WRONLY);
if (fd < 0) {
printf("Error opening file. %s does not exist\n", argv[1]);
return -2;
}
wbuf = argv[1];
len = strlen(wbuf);
nbr = write(fd, wbuf, len);
printf("USR: Buf written = %s, nbr = %d\n", wbuf ,nbr);
nbr = read(fd, buf, 250);
printf("USR RD: %s", buf);
close(fd);
return 0;
}
爲什麼你打開文件只讀和只寫?你的意思是讀/寫? (O_RDWR) – 2013-03-25 20:25:24
是的,讀取+寫入 – Aadishri 2013-03-25 20:33:59
好吧,我卡在一臺Windows電腦上,或者我會試用它,但那可能就是這樣。 RDWR == 2,但(RD | WR)==(0 | 1)== 1 == WRONLY。所以我猜想用「O_RDONLY | O_WRONLY」打開文件只會打開它。 – 2013-03-25 20:44:20