我正在计算dev.c内核源代码中的中断时间,如下所示:
extern double InterruptTime;
InterruptTime = ktime_get_real(); //timestamp
我正在使用procfs从内核空间向用户空间写入数据,并在内核空间中使用下面的api将数据发送到用户空间。 PROCFS.c:
struct device {
double array[100];
}chr_arr;
ssize_t dev_read(struct file *filp,const char *buf,size_t count,loff_t *offset)
{
int len;
chr_arr.array =InterruptTime; // Is this possible ??
len = count >= strlen(chr_arr.array) ? strlen(chr_arr.array) : count;
*offset += len;
if (*offset >= strlen(chr_arr.array))
return 0;
if (copy_to_user(buf,chr_arr.array,len))
return -EFAULT;
return len;
}
是否可以从PROCFS.c中的dev.c读取InterruptTime,如上所示? 如何在用户端接收从上面的内核代码发送的数据(即InterruptTime)??
答案 0 :(得分:0)
我还不太确定,您是否只需提供InterruptTime
的单个值,或者是否需要缓存这些值,因为它们是为用户空间代码生成的,以便稍后检索。如果没有额外的缓冲和简单的努力,我会提出一些建议:
ssize_t dev_read(struct file *filp,const char *buf,size_t count,loff_t *offset)
{
if ( count < sizeof(InterruptTime) ) {
// Not enough space provided.
return 0; // Or some error code maybe.
}
if (copy_to_user(buf,&InterruptTime,sizeof(InterruptTime)) {
return -EFAULT;
} else {
return sizeof(InterruptTime); // Number of bytes we copied.
}
}
(请注意,这不是很干净,应该通过缓冲数据来改进,以允许读取任意大小,正确的错误处理,&amp; c。)
然后,在用户空间中,您可以执行类似
的操作#include <fcntl.h>
...
int fd = open("/proc/...", O_RDONLY);
double timestamp;
loff_t dummyOffset;
if ( read( fd, ×tamp, sizeof(timestamp) ) != sizeof(timestamp) ) {
// Failure.
} else {
// Use value in timestamp...
}
...