Linux kernel 理解char驱动程序中的写文件操作

Linux kernel 理解char驱动程序中的写文件操作,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在学习char驱动程序。但是我没有正确理解char设备驱动程序的写入操作。下面是我的写入操作 static ssize_t dev_write(struct file *fil,const char *buff,size_t len,loff_t *off) { int count =0; int i =0; int flag=0; pr_info("user input string %s\n",buff); pr_info("user input


我正在学习char驱动程序。但是我没有正确理解char设备驱动程序的写入操作。下面是我的写入操作

static ssize_t dev_write(struct file *fil,const char *buff,size_t len,loff_t *off)
{
    int count =0;
    int i =0;
    int flag=0;
    pr_info("user input string %s\n",buff);
    pr_info("user input string len %d\n",len);
    return len;
}
我的疑问是,如果我像

echo "hello" > /dev/myDev
以下是dmesg的内容

[20596.975355] user input string hello
[20596.975355] 77b9e4
[20596.975355] insmod insmod
[20596.975355] n/zeitgeist-daemon
[20596.975355] atives
[20596.975355] 
[20596.975355] vars "${upargs[@]}"
[20596.975355]  cur cword words=();
[20596.975355]     local upargs=() upvars=() vcur vcword vprev vwords;
[20596.975355]     while getopts "c:i:n:p:w:" flag "$@"; do
[20596.975355]         case $flag in 
[20596.975355]             c)
[20596.975355]                 vcur=$OPTARG
[20596.975355]             ;;
[20596.975355]             i)
[20596.975355]                 vcword=$OPTARG
[20596.975355]             ;;
[20596.975355]             n)
[20596.975355]                 exclude=$OPTARG
[20596.975355]             ;;
[20596.975355]             p)
[20596.975355]                 vprev=$OPTARG
[20596.975355]             ;;
[20596.975355]             w)
[20596.975355]                 vwords=$OPTARG
[20596.975355]             ;;
[20596.975358] user input string len 6
[20596.975361] Device closed

所以我不明白里面发生了什么。有人能解释一下发生了什么吗?
以及如何只访问用户输入字符串,即“hello”
谢谢

当您对“/dev/myDev”文件执行
echo
时,这将调用用户空间中的
write(“/dev/myDev”)
系统调用。这转化为一个file\u operations ops
(struct file\u operations*)->write
调用调用内核空间中的函数
dev\u write()

现在看来原始定义可能是错误的,因为它缺少一个指向用户空间应用程序缓冲区的
\uu user
。不建议直接打印或使用缓冲区中的用户空间,因为这会弄乱某些内容并打印大量其他数据,可能是与某个程序的
.text
部分有关的页面

相反,在将缓冲区打印到系统日志之前,应该使用创建内核缓冲区并使用
copy\u from\u user()
simple\u write\u to\u buffer()
复制内容。此内核空间页的原因始终固定在内存中,而不进行页入页出,而允许用户空间页使用
copy{from,to}u user()和
{get,put}}u user()从内存中进行页出/页入
首先验证指针页面,以确保从这些缓冲区读取时不会出现页面错误

例: 静态ssize\u t dev\u write(结构文件*fil,常量char\u用户*buff,大小长度,loff\u t*off)


希望这有帮助。

%s
需要以零结尾的字符串,但是
write()
的缓冲区只包含实际写入的字节数


此外,由于程序使用了错误的指针,用户空间缓冲区可能被调出或不存在,因此必须始终使用
get\u user()
copy\u from\u user()
等函数来访问用户空间缓冲区。

就像我提到的
dev\u write()
您在问题中提出的定义与链接中提供的定义不同。同样,在链接中,他使用内核缓冲区,在打印之前从_用户缓冲区复制内容。在代码中,您直接使用
pr\u info
打印用户缓冲区,这是不推荐的。接下来,我建议在开始编写代码之前先阅读一些内核模块编程和设备驱动程序的基础知识。感谢你的回答,我遵循了这一点,它与_用户一起工作,我补充说_用户仍然是一样的。请解释一下语法,我们通常使用char变量名,这是什么__用户对不起,我不明白你关于“语法通常我们使用char变量名”的部分问题。您是否看到您的代码与
dev_write()
链接中的代码之间的差异?不使用
\uu用户
在构建模块时仍应向您发出警告,但只要您不直接打印缓冲区,该警告就会起作用。当不了解某个主题的人对问题进行向下投票时,您所做的只是宣传您自己的无知。