在 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_function
的 2
。将第二个参数更改为 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);
我正在尝试导出一个函数以便它可以从另一个 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_function
的 2
。将第二个参数更改为 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);