在linux模块中使用带参数的导出符号时丢失数据
我正在尝试导出一个函数,以便可以从其他linux模块使用它,导出的函数被第二个模块成功检测到并可以调用,但看起来我使用的是带有传递参数的数据 我在互联网上找到的所有示例都使用在linux模块中使用带参数的导出符号时丢失数据,linux,linux-kernel,linux-device-driver,Linux,Linux Kernel,Linux Device Driver,我正在尝试导出一个函数,以便可以从其他linux模块使用它,导出的函数被第二个模块成功检测到并可以调用,但看起来我使用的是带有传递参数的数据 我在互联网上找到的所有示例都使用void参数 以下是两个模块: #include <linux/module.h> #include <linux/init.h> static void exported_function(char* buffer, int n) { char msg[n]; copy_from_u
void
参数
以下是两个模块:
#include <linux/module.h>
#include <linux/init.h>
static void exported_function(char* buffer, int n) {
char msg[n];
copy_from_user(msg, buffer, n);
printk("MAIN received : %s\n", buffer);
printk("MAIN copied : %s\n", msg);
printk("MAIN size(n) : %s\n", n);
}
static int __init load_module(void) {
printk("module loaded");
return 0;
}
static void __exit unload_module(void) {
printk("module unloaded");
}
module_init(load_module);
module_exit(unload_module);
EXPORT_SYMBOL(exported_function);
如您所见,exported_函数(char*buffer,int n)
中的n
为空!!但缓冲区中没有数据丢失
我不明白为什么:/
谢谢
[编辑]
如果我将exported_函数(char*,int)
的签名更改为exported_函数(int,int)
两个值都为空 I.在第二个模块中:
char* str = "AA";
exported_function(str, 2);
str
基本上是3
个字符,而不是2
,您要将其传递到导出的\u函数
。将第二个参数更改为3
二:单元一:
printk("MAIN size(n) : %s\n", n);
这里您正在打印n
的大小,格式说明符为字符串类型%s
,更改为%d
,您将获得从模块2中收到的正确值
printk("MAIN size(n) : %d\n", n);
III:copy\u from\u user
实际上是将数据从用户复制到内核空间,返回值为失败时无法复制的字节数,成功时为零。这意味着您必须收集返回的值,在您的情况下,它是非零的,因为您试图从内核空间复制失败的副本
简介:
unsigned long copy_from_user ( void * to,
const void __user * from,
unsigned long n);
printk("MAIN size(n) : %d\n", n);
unsigned long copy_from_user ( void * to,
const void __user * from,
unsigned long n);