2012-12-29 91 views
1

通過proc我們可以很容易地使用讀取&寫入系統調用,如本例所示。 write on /proc entry through user space將數據寫入debugfs ---從設備驅動程序

但我正致力於使用調試信息從驅動程序傳遞給用戶空間。 我能找到這兩個示例代碼。這裏應用程序能夠使用mmap()系統調用來讀寫debugfs文件。

但是,假如在使用Debugfs與設備驅動程序文件傳達我的情況的要求:

user-space application <-------> debugfs file <-------> Device driver 
  1. 所以我可以使用相同的代碼mmap_simple_kernel。 c在我的--- >>設備驅動代碼--- >>和tr將數據直接從驅動程序中調入數據?但在這種情況下,我的驅動程序中會有兩個file_operations結構會導致一些問題?這是正確的方法嗎?

  2. 或者就像在mmap_user.c中的應用程序一樣 - 同樣的過程 - 我遵循我的設備驅動程序。並保持mmap_simple_kernel.c作爲debugfs條目的分離模塊?

+0

你可以用'閱讀()'和'寫()'如果你需要的話,也可以在debugfs文件中使用。例如,如果你需要傳遞大量的數據,'mmap()'就會派上用場,但它並不是強制性的。 – Eugene

+0

在我的其中一個項目中,我使用debugfs文件向用戶空間提供一些數據並控制我的內核空間系統,例如,請參閱[此文件](http://code.google.com/p/)內核黽/源/瀏覽/來源/型芯/ resolve_ip.c)。在debugfs(_「i_addr」_,_「func_name」_和_「func_i_start」_)中創建了三個文件,第一個文件是可寫的,其餘兩個文件是隻讀的。另請參閱如何在此處使用'debugfs_create_file()'。我還建議看看其他的[debugfs_create _ \ * *函數](http://lxr.free-electrons.com/source/include/linux/debugfs.h),它們可能更適合您的需求。 – Eugene

+0

至於使用'mmap()'的另一個例子,這些鏈接是[在這個評論](http://stackoverflow.com/questions/11501527/ioctl-vs-netlink-vs-memmap-to-communicate-between-內核空間和用戶空間#comment15219915_11501527)。根據你想要完成的事情,這可能是有用的。 – Eugene

回答

2

如何kmemleak毫米/ kmemleak.c使用debugfs你可以看看:

static const struct seq_operations kmemleak_seq_ops = { 
     .start = kmemleak_seq_start, 
     .next = kmemleak_seq_next, 
     .stop = kmemleak_seq_stop, 
     .show = kmemleak_seq_show, 
}; 

static int kmemleak_open(struct inode *inode, struct file *file) 
{ 
     return seq_open(file, &kmemleak_seq_ops); 
} 

static int kmemleak_release(struct inode *inode, struct file *file) 
{ 
     return seq_release(inode, file); 
} 

static ssize_t kmemleak_write(struct file *file, const char __user *user_buf, 
           size_t size, loff_t *ppos) 
{...} 

static const struct file_operations kmemleak_fops = { 
     .owner   = THIS_MODULE, 
     .open   = kmemleak_open, 
     .read   = seq_read, 
     .write   = kmemleak_write, 
     .llseek   = seq_lseek, 
     .release  = kmemleak_release, 
}; 


dentry = debugfs_create_file("kmemleak", S_IRUGO, NULL, NULL, 
          &kmemleak_fops); 
1

這個問題是在谷歌的MMAP debugfs頂部的搜索結果。我在這裏添加一個重要的信息。根據這一https://lkml.org/lkml/2016/5/21/73後debugfs_create_file()在內核4.8.0或更高版本將忽略.mmap場在file_operations結構

使用debugfs_create_file_unsafe()作爲一種解決方法