Can't read from linux character device
(1个答案)
2年前关闭。
1 sudo tail -f / var / log / syslog
2用户空间程序输出。
无法使用用户空间程序写入和读取内核空间模块。
我认为
copy_to_user
函数返回0,这意味着但实际上没有任何复制。
我使用的是derekmolloy示例,但根本不起作用(Ubuntu LTS 16.04.1)
其次,我想问一下我该如何打印。 char *缓冲区dev_read函数,因为当我想使用printk打印此模块时,该模块被杀死了。
dev_read(struct file *filep, char *buffer, size_t len, loff_t *offset)
ebbchar.c(LKM)
static ssize_t dev_read(struct file *filep, char *buffer, size_t len, loff_t *offset)
{
int error_count = 0;
error_count = copy_to_user(buffer, message, size_of_message);
if (error_count==0)
{ // if true then have success
printk(KERN_INFO "EBBChar: Sent %d characters to the user\n",
size_of_message);
return (size_of_message=0); // clear the position to the
//start and
return 0;
}
else
{
printk(KERN_INFO "EBBChar: Failed to send %d characters to the
user\n", error_count);
return -EFAULT; // Failed -- return a bad address message (i.e.
//-14)
}
}
static ssize_t dev_write(struct file *filep, const char *buffer, size_t
len, loff_t *offset)
{
int error;
// sprintf(message, "%c", buffer, len); // appending received
//string with its length
error = copy_to_user(message, buffer , size_of_message);
//ssize_t simple_read_from_buffer(void *to, size_t count, loff_t
//*ppos, const void *from, size_t available)
// error = simple_read_from_buffer(&message, 256, offset , buffer ,
// len);
int i = 0;
printk (KERN_INFO "KERNEL-SPACE copying copy_to_user() %d",error
size_of_message = strlen(message);
printk ( KERN_INFO "KERNEL-SPACE size of message recivied is %d \n
", size_of_message);
for (i = 0 ; i < len ; i ++)
{
printk(KERN_INFO "KERNEL-SPACE message[%d]=%s \n" , i ,
message[i] );
}
printk(KERN_INFO "EBBChar: Received %zu characters from the
user the message is %s\n", len, message);
return len;
}
用户空间程序
int main()
{
int ret,
int fd;
char stringToSend[BUFFER_LENGTH];
fd = open("/dev/ebbchar", O_RDWR);// Open the device with
if (fd < 0)
{
perror("USER-SPACE : Failed to open the device...");
return errno;
}
for (int i = 0 ; i < BUFFER_LENGTH ; i++)
{
stringToSend[i] = 'a';
}
printf(" USER-SPACE : Writing message to the device [%s].\n",
stringToSend);
ret = write(fd, stringToSend, BUFFER_LENGTH); // Send the string to
//the LKM
if (ret < 0)
{
perror(" USER-SPACE : Failed to write the message to the
device.");
return errno;
}
printf("USER-SPACE : Press ENTER to read back from the
device...\n");
getchar();
printf("USER-SPACE : Reading from the device...\n");
ret = read(fd, receive, BUFFER_LENGTH); // Read the response from
// the LKM
if (ret < 0)
{
perror("USER-SPACE : Failed to read the message from the
device.");
return errno;
}
printf("USER-SPACE : The received message is: [%s]\n", receive);
printf("USER-SPACE : End of the program\n");
return 0;
}
用户空间程序的输出
须藤./a.out
USER-SPACE:启动设备测试代码示例...
USER-SPACE:向设备写入消息[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
USER-SPACE:按ENTER从设备读回...
用户空间:正在读取设备...
USER-SPACE:收到的消息是:[]
USER-SPACE:程序结束
river @ mystic-computer:〜$ ^ C
sudo tail -f / var / log / syslog的输出
2月8日22:11:05神秘计算机内核:[21689.104780] EBBChar:设备已成功关闭
2月8日22:12:15神秘计算机内核:[21758.895624] EBBChar:设备已打开2次
2月8日22:12:15神秘计算机内核:[21758.895674]内核空间正在复制copy_to_user()0
2月8日22:12:24神秘计算机内核:[21758.895678]收到的消息的KERNEL-SPACE大小为0 KERNEL-SPACE消息[0] = KERNEL-SPACE消息[116] = KERNEL-SPACE消息[152] = KERNEL- SPACE消息[154] = <6> [21767.721994] EBBChar:向用户发送了0个字符
2月8日22:12:24神秘计算机内核:[21767.722145] EBBChar:设备已成功关闭
2月8日22:13:08神秘计算机内核:[21812.346367] EBBChar:LKM再见!
2月8日22:13:25神秘计算机内核:[21829.177728] EBBChar:初始化EBBChar LKM
2月8日22:13:25神秘计算机内核:[21829.177743] EBBChar:正确注册了主号码243
2月8日22:13:25神秘计算机内核:[21829.177773] EBBChar:设备类已正确注册
2月8日22:13:25神秘计算机内核:[21829.177943] EBBChar:正确创建了设备类
2月8日22:13:40神秘计算机内核:[21844.080308] EBBChar:设备已打开1次
2月8日22:13:40神秘计算机内核:[21844.080649]内核空间正在复制copy_to_user()0
2月8日22:13:40神秘计算机内核:[21844.080654]接收到的消息的内核空间大小为0
2月8日22:13:40神秘计算机内核:[21844.080654] <6> [21844.080660]内核空间消息[0] =(空)
2月8日22:11:05神秘计算机内核:[21689.104780] EBBChar:设备已成功关闭
2月8日22:12:15神秘计算机内核:[21758.895624] EBBChar:设备已打开2次
2月8日22:12:15神秘计算机内核:[21758.895674]内核空间正在复制copy_to_user()0
2月8日22:12:24神秘计算机内核:[21758.895678]收到的消息的KERNEL-SPACE大小为0 KERNEL-SPACE消息[0] = KERNEL-SPACE消息[116] = KERNEL-SPACE消息[152] = KERNEL- SPACE消息[154] = <6> [21767.721994] EBBChar:向用户发送了0个字符
2月8日22:12:24神秘计算机内核:[21767.722145] EBBChar:设备已成功关闭
2月8日22:13:08神秘计算机内核:[21812.346367] EBBChar:LKM再见!
2月8日22:13:25神秘计算机内核:[21829.177728] EBBChar:初始化EBBChar LKM
2月8日22:13:25神秘计算机内核:[21829.177743] EBBChar:正确注册了主号码243
2月8日22:13:25神秘计算机内核:[21829.177773] EBBChar:设备类已正确注册
2月8日22:13:25神秘计算机内核:[21829.177943] EBBChar:正确创建了设备类
2月8日22:13:40神秘计算机内核:[21844.080308] EBBChar:设备已打开1次
2月8日22:13:40神秘计算机内核:[21844.080649]内核空间正在复制copy_to_user()0
2月8日22:13:40神秘计算机内核:[21844.080654]接收到的消息的内核空间大小为0
2月8日22:13:40神秘计算机内核:[21844.080654] <6> [21844.080660]内核空间消息[0] =(空)
2月8日22:13:40神秘计算机内核:[21844.081224]内核空间消息[247] =(空)
2月8日22:13:40神秘计算机内核:[21844.081226]内核空间消息[248] =(空)
2月8日22:13:40神秘计算机内核:[21844.081228]内核空间消息[249] =(空)
2月8日22:13:40神秘计算机内核:[21844.081230]内核空间消息[250] =(空)
2月8日22:13:40神秘计算机内核:[21844.081233]内核空间消息[251] =(空)
2月8日22:13:40神秘计算机内核:[21844.081235]内核空间消息[252] =(空)
2月8日22:13:40神秘计算机内核:[21844.081237]内核空间消息[253] =(空)
2月8日22:13:40神秘计算机内核:[21844.081239]内核空间消息[254] =(空)
2月8日22:13:40神秘计算机内核:[21844.081242]内核空间消息[255] =(空)
2月8日22:13:40神秘计算机内核:[21844.081245] EBBChar:从用户收到256个字符,消息是
我是一名优秀的程序员,十分优秀!