我正在尝试在内核空间中打印用户空间缓冲区的内容,但是我收到了一些垃圾字符,并且我不确定哪里出了问题。
SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
unsigned, flags, struct sockaddr __user *, addr,
int, addr_len) {
char *messageRead = kmalloc(len,GFP_KERNEL);
unsigned long bytesNotCopied = copy_from_user(messageRead,(char*)buff,len);
printk("The messageRead Read is %s \n",messageRead);
.....
.....
}
bytesNotCopied 返回 0,因此我能够确认内容已被复制。但是当我尝试打印 messageRead 值时,它返回了一些垃圾值。
最佳答案
返回值0表示复制成功。 为什么要将缓冲区打印为字符串,即在 printk() 中使用 %s。 buff是用户进程中的字符串吗?如果没有尝试以这种方式转储
for(i=0; i<len; i++) /*make sure you declare i */
{
printk("%x ",messageRead[i]);
}
关于copy_from_user函数打印垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30408607/