2014-04-17 59 views
0

我計算如下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

你返回到用戶空間的代碼是什麼?每次只讀一個'char'? – JimmyB

+0

InterruptTime是我的代碼中的時間戳。我想將InterruptTime返回給用戶。 – user3458454

+0

那麼'InterruptTime'是什麼類型? 'extern char InterruptTime'表明它只是一個字符。你在你的chr_arr中緩存了多個字符還是隻緩存一個字符? - 或者,更具體地說,sizeof(InterruptTime)'是什麼? – JimmyB

回答

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. 
    } 

} 

(請注意,這不是很乾淨,應由緩衝數據加以改進,以允許任意大小的讀取,正確錯誤處理,&角)

然後,在用戶空間,你會做這樣的事情

#include <fcntl.h> 
... 

int fd = open("/proc/...", O_RDONLY); 

double timestamp; 

loff_t dummyOffset; 

if (read(fd, &timestamp, sizeof(timestamp)) != sizeof(timestamp)) { 
    // Failure. 
} else { 
    // Use value in timestamp... 
} 

... 
+0

非常感謝你,但在dev.c程序中計算的InterruptTime和我在PROCFS.c程序中使用ssize_t dev_read(struct file * filp,const char * buf,size_t count,loff_t * offset)爲1:我想要讀取來自dev.c的InterruptTime以及後來轉移到內核的時間。從PROCFS.c程序訪問InterruptTime是否正確? – user3458454

+0

當內核收到中斷時。 InterruptTime將被計算出來,然後通過PROCFS.c程序發送給用戶。我認爲根據你的程序:我不想創建一個數組來存儲中斷時間。相反,我們可以直接從dev.c訪問中斷時間 - 是對的嗎? – user3458454

相關問題