在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

我正在尝试导出一个函数,以便可以从其他linux模块使用它,导出的函数被第二个模块成功检测到并可以调用,但看起来我使用的是带有传递参数的数据

我在互联网上找到的所有示例都使用
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);