c-copy_to_user:如何在用户空间中读取内核空间的结构类型值?
我有一个内核模块,希望在其中向用户空间传递一些值。有人建议我使用struct type来传递更多的值。 在内核空间中,我有:c-copy_to_user:如何在用户空间中读取内核空间的结构类型值?,c,linux,linux-kernel,kernel-module,C,Linux,Linux Kernel,Kernel Module,我有一个内核模块,希望在其中向用户空间传递一些值。有人建议我使用struct type来传递更多的值。 在内核空间中,我有: typedef struct data { int val_delta; int val_btn_status; }data_t; static ssize_t sample_read(struct file *filp, char *buffer, size_t length, loff_t * offset) { int re
typedef struct data {
int val_delta;
int val_btn_status;
}data_t;
static ssize_t sample_read(struct file *filp, char *buffer, size_t length, loff_t * offset)
{
int ret = 1;
int delta = 10;
data_t val;
val.val_btn_status = gpio_get_value( BTN );
val.val_delta = delta;
copy_to_user( buffer, &val, sizeof(data_t));
return( ret );
}
在用户空间中,如何将这两个值带入数据结构?
我还想在用户空间中将数据类型声明为:
typedef struct data {
int val_delta;
int val_btn_status;
}data_t;
int main(int argc, char **argv)
{
data_t str;
char *app_name = argv[0];
char *dev_name = "/dev/sample";
int fd = -1;
if ((fd = open(dev_name, O_RDWR)) < 0)
{
fprintf(stderr, "%s: unable to open %s: %s\n", app_name, dev_name, strerror(errno));
return( 1 );
}
x = read(fd, &str, 1);
return 0;
}
typedef结构数据{
瓦卢三角洲;
int val_btn_状态;
}数据;
int main(int argc,字符**argv)
{
数据挖掘;
char*app_name=argv[0];
char*dev_name=“/dev/sample”;
int-fd=-1;
如果((fd=open(dev_name,O_RDWR))<0)
{
fprintf(stderr,“%s:无法打开%s:%s\n”、应用程序名称、开发程序名称、strerror(errno));
申报表(1);
}
x=读取(fd和str,1);
返回0;
}
但我不喜欢这样,因为我不想在用户空间和内核空间上重写同一个typedef,也许这个不能工作。还有其他解决方案吗?您可以将
公共结构
和开发人员名称
添加到标题中,并包含在驱动程序和用户空间程序中
比如:data.h
#ifndef DATA_H
#define DATA_H
typedef struct data {
int val_delta;
int val_btn_status;
}data_t;
#define dev_name "/dev/sample"
#endif
也改变
read(fd, &str, 1);
到
首先,你需要了解这个问题 在示例中,
sample\u read()
函数应该使用char\u user*buffer
而不是char*buffer
将typedef struct data
定义放入头文件,该头文件可以包含内核模块和用户程序,而无需重新定义两次
您是否尝试过其他选项,比如将传感器的回波中断(我假设它是一个中断)标记为快速中断,这样它就不会被同一级别的其他人抢占。 或者,为什么不让它处于处理器上的最高可用中断级别(在硬编码的中断级别之下)。
正如桑托什所说,冻结的原因应该有所不同。也许你看过你的结构的排列了吗?根据您的底层处理器的字长???谢谢您的回答。我不喜欢header(这也是一个很好的解决方案),因为在程序中我必须尽可能快,否则程序会冻结。我的程序管理一个距离传感器(HC-SR04)。这个传感器,当它收到一个至少10 us的触发信号时,它确保开始回波信号,我用它来计算测量值。在我的内核模块中,我使用write函数设置TRIGGER和read函数来读取回声的持续时间并计算距离。我担心在调用typedef时,当我声明struct(也声明为a.h)时,我会浪费时间并冻结程序添加头不会影响程序的运行时。如果你的程序冻结了,那一定是另一个问题。因为任何与头文件有关的操作都是在预处理时完成的,现在我尝试一下。在此之前,我注意到当我将typedef写入内核空间时,程序会冻结。当我删除它时,程序运行正常。但是我试着告诉你:)好的,这个程序在时间方面也能正常工作,谢谢你,桑托什。也谢谢askb。谢谢你的回答。我不喜欢header(这也是一个很好的解决方案),因为在程序中我必须尽可能快,否则程序会冻结。我的程序管理一个距离传感器(HC-SR04)。这个传感器,当它收到一个至少10 us的触发信号时,它确保开始回波信号,我用它来计算测量值。在我的内核模块中,我使用write函数设置TRIGGER和read函数来读取回声的持续时间并计算距离。我担心在调用typedef时,当我声明struct(也声明为a.h)时,我会浪费时间并冻结程序
read(fd, &str, sizeof(data_t));
unsigned long copy_to_user ( void __user * to,
const void * from,
unsigned long n);