在 linux 模块中使用带有参数的导出符号时丢失数据

losing data when using an exported symbol with parameters in linux module

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

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

第二个是:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/uaccess.h>
#include <linux/fs.h>

extern void exported_function(char*, int);


int init_module(void) {
  printk("module COMM loaded");

  char* str = "AA";
  exported_function(str, 2);


  return 0;
}

void cleanup_module(void) {
  printk("module COMM unloaded!");
}

插入第二个模块后,我通过 dmesg 得到了这个输出:

[ 2951.103121] module loaded
[ 2951.104417] module COMM loadedMAIN received : AA
[ 2951.104422] MAIN copied : 
[ 2951.104424] MAIN size(n) : (null)

如您所见,exported_function(char *buffer, int n)中的n为空!!但 buffer

中没有数据丢失

我不明白为什么:/

谢谢。

[编辑]

如果我将 exported_function(char *, int) 的签名更改为 exported_function(int, int) 两个值都为 null !!

我。在第二个模块中:

char* str = "AA";
exported_function(str, 2);

str 基本上是 3 个字符,而不是您传递给 exported_function2。将第二个参数更改为 3

二:在模块一中:

printk("MAIN size(n) : %s\n", n);

此处您打印的大小为 n,格式说明符为字符串类型 %s,更改为 %d,您将获得从模块二收到的正确值。

printk("MAIN size(n) : %d\n", n);

III:​​copy_from_user 实际上是将数据从用户复制到内核 space,其中 return 值是失败时无法复制的字节数,成功时为零。这意味着您必须收集值 returned,在您的情况下它是非零的失败副本,因为您正试图从内核 space 进行复制。

剧情简介:

unsigned long copy_from_user (  void *      to,
                   const void __user *      from,
                         unsigned long      n);