基本数据类型的 copy_to_user() 和 copy_from_user()

标签 c linux linux-kernel linux-device-driver embedded-linux

我正在编写一个 linux 内核驱动程序,对于将数据发送到用户空间或从用户空间读取数据的每个函数,我正在使用 copy_to_user() 和 copy_from_user()。我的问题是:如果我只是复制基本数据类型(例如 u32 或 int),是否需要使用这些调用?

最佳答案

如果函数接收到指向用户空间数据的指针,您必须使用copy_from_user() 将指向的数据从用户空间复制到内核空间(反之亦然)。

请注意,指针值本身是按值传递的(就像所有 C 参数一样),因此您不必在 之前执行 copy_from_user() 来获取指针值copy_from_user() 它指向的数据。

数字参数与指针参数的工作方式相同;用 C 术语来说,它们都是标量。您不必使用 copy_from_user() 来复制参数的值;那已经被复制了。您只需使用它来复制传递的指针指向的数据。

所以如果你有一个int类型的参数,你可以直接使用它。如果你的参数指向一个int,那么这个int对象就会在用户空间,你需要用copy_to_user来复制该对象进入内核空间。

关于基本数据类型的 copy_to_user() 和 copy_from_user(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29397364/

相关文章:

c - 如何在C中将3个字符添加到一个字符中?

c - 如何解决这个逻辑表达式?

c - MinGw 交叉编译

c - shmat() 返回的虚拟内存地址指向不同的硬件内存位置

linux - 确保 .csv 文件在 bash 中每一行的列数相同

linux - 如何从 IRQ 范围内的非整体内核模块进行软重启?

linux - USB 键盘和 setxkbmap

linux - 在 Linux 上通过 USB 发送原始数据

linux - 如何将 Linux-Next 重置为指定日期?

linux - 为所有内核模块添加对符号的支持