|
第一:/proc文件系统是什么 ?这个网上很多,说的很细,我也就不说了。但是他是做什么用的,网上也很多,但是我不解,就我目前了解的,简单的说,/proc是驱动程序的一种调式方法(如有不对可以指出),那么怎样让我的/proc文件系统与我的驱动程序建立联系!!??如下面最简单的一个/proc文件系统例子:- // include kernel head files
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/proc_fs.h>
- #include <asm/uaccess.h>
- // licensed under BSD/GPL
- MODULE_LICENSE("Dual BSD/GPL");
- static struct proc_dir_entry *prwd_dir = NULL;
- static struct proc_dir_entry *prwd_rdonly = NULL;
- static struct proc_dir_entry *prwd_rdwr = NULL;
- static char sbufr[ 100 ] = "One test string from reading only !\n";
- static char sbufrw[ 1000 ] = "";
- // read-only function
- static int prwd_rdonly_read(char *page, char **start, off_t off, int count, int *eof, void *data)
- {
- sprintf( page, "%s", sbufr );
- *eof = 1;
- return strlen( sbufr );
- }
- // read function for read-write
- static int prwd_rdwr_read(char *page, char **start, off_t off, int count, int *eof, void *data)
- {
- int len;
- len = strlen( sbufrw );
- if( len <= off ) {
- printk(KERN_ALERT "File pointer at end of file or no data for reading in read-write buffer !\n");
- return -EINVAL;
- }
- if( ( len - off ) < count ) {
- count = len - off;
- }
- memcpy( page, ( sbufrw + off ), count );
- if( len <= ( off + count ) ) {
- *eof = 1;
- }
- return count;
- }
- // write function for read-write
- static int prwd_rdwr_write(struct file *file, const char __user *buffer, unsigned long count, void *data)
- {
- unsigned long cnt = count;
- if( cnt >= sizeof( sbufrw ) ) {
- cnt = sizeof( sbufrw ) - 1;
- }
- if( copy_from_user( sbufrw, buffer, cnt ) ) {
- printk(KERN_ALERT "Failure to copy data from user space !\n");
- return -EFAULT;
- }
- sbufrw[ cnt ] = '\0';
- return cnt;
- }
- // initialize module function
- static int __init procreadwritedemo_init(void)
- {
- printk(KERN_ALERT "Entry procreadwritedemo_init !\n");
- // create directory: procreadwritedemo in /proc
- prwd_dir = proc_mkdir( "procreadwritedemo", NULL );
- if( NULL == prwd_dir ) {
- printk(KERN_ALERT "Cann't create directory: /proc/procreadwritedemo !\n");
- goto failure_create_dir;
- }
- printk(KERN_ALERT "Success to create directory: /proc/procreadwritedemo !\n");
- // create read-only file: rdonly in /proc/procreadwritedemo
- prwd_rdonly = create_proc_read_entry( "rdonly", 0400, prwd_dir, prwd_rdonly_read, NULL );
- if( NULL == prwd_rdonly ) {
- printk(KERN_ALERT "Cann't create read-only file: /proc/procreadwritedemo/rdonly !\n");
- goto failure_create_rdonly;
- }
- printk(KERN_ALERT "Success to create read-only file: /proc/procreadwritedemo/rdonly !\n");
- // create read-write file: rdwr in /proc/procreadwritedemo
- prwd_rdwr = create_proc_entry( "rdwr", 0666, prwd_dir );
- if( NULL == prwd_rdwr ) {
- printk(KERN_ALERT "Cann't create read-write file: /proc/procreadwritedemo/rdwr !\n");
- goto failure_create_rdwr;
- }
- prwd_rdwr->read_proc = prwd_rdwr_read;
- prwd_rdwr->write_proc = prwd_rdwr_write;
- printk(KERN_ALERT "Success to create read-write file: /proc/procreadwritedemo/rdwr !\n");
- return 0;
- failure_create_rdwr:
- remove_proc_entry( "rdonly", prwd_dir );
- failure_create_rdonly:
- remove_proc_entry( "procreadwritedemo", NULL );
- failure_create_dir:
- return -EFAULT;
- }
- // clean up module function
- static void __exit procreadwritedemo_exit(void)
- {
- printk(KERN_ALERT "Entry procreadwritedemo_exit !\n");
- // remove files and directory created in /proc
- remove_proc_entry( "rdwr", prwd_dir );
- remove_proc_entry( "rdonly", prwd_dir );
- remove_proc_entry( "procreadwritedemo", NULL );
- }
- // the declarations of initilization and cleaning up module funcitons
- module_init( procreadwritedemo_init );
- module_exit( procreadwritedemo_exit );
- // module information
- MODULE_AUTHOR("wensheng");
- MODULE_DESCRIPTION("Proc filesystem read/write demo");
- MODULE_VERSION("0.0.1");
- MODULE_ALIAS("ProcReadWriteDemo");
复制代码 上面的一例,完全是一个独立/proc系统代码的实现,问题是:他是那怎与我想调试的驱动(如一个块设备)程序建立关系了,如是不能跟我的相关驱动建联系,那/proc文件系统存在意义是什么 (简单说就是做什么用的,最好可以举个易懂的例子)??
第二:关于seq_file机制
有如下代码- #include <linux/fs.h>
- #include <linux/init.h>
- #include <linux/proc_fs.h>
- #include <linux/seq_file.h>
- struct proc_dir_entry proc_root;
- void * our_seq_start(struct seq_file *m, loff_t *pos)
- {
- //printk("<0>""in our_seq_start/n");
- if(*pos == 0)
- return pos;
- return NULL;
- }
- void * our_seq_stop(struct seq_file *m, void *v)
- {
- //printk("/nDO NOTHING/n");
- }
- int our_seq_show(struct seq_file *m, loff_t *pos)
- {
- static unsigned long counter = 0;
- int i;
- for(i=0;i<10;i++)
- seq_printf(m,"the counter is %d/n",i);
- return 0;
- }
- void *our_seq_next(struct seq_file *m, loff_t *pos)
- {
- static unsigned long counter_next = 0;
- if(pos < 1)
- {
- counter_next++;
- pos++;
- return pos;
- }
- else
- {
- *pos = 0;
- return NULL;
- }
- }
- static const struct seq_operations our_seq_ops = {
- .start = our_seq_start,
- .next = our_seq_next,
- .stop = our_seq_stop,
- .show = our_seq_show
- };
- static int our_seq_open(struct inode *inode, struct file *filp)
- {
- printk("<0>""in our_seq_open/n");
- return seq_open(filp, &our_seq_ops);
- }
- int our_ioctl()
- {
- printk("<0>""in our_seq_ioctl/n");
- return 0;
- }
- int our_write()
- {
- printk("<0>""in our_seq_write/n");
- return 5;
- }
- struct file_operations our_proc_ops = {
- .open = our_seq_open,
- .read = seq_read,
- .write = our_write,
- .llseek = seq_lseek,
- .ioctl = our_ioctl,
- .release = seq_release
- };
- int our_init()
- {
- proc_create("hehe", 0, NULL, &our_proc_ops);
- return 0;
- }
- void our_exit()
- {
- remove_proc_entry("hehe",NULL);
- }
- module_init(our_init);
- module_exit(our_exit);
复制代码 上面代码是目前我在网上查到的/proc文件系统实现中唯一个涉及到ioctl操作(此处不关心代码是否有错,关心功能码是否以实现),因为之前所有相关seq_file机制建立/proc,中struct file_operations,只有如下操作- struct file_operations our_proc_ops = {
- .open = our_seq_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release
- };
复制代码 而且我们只用实现open(),而read,lseek,release,都是seq_file内部实现,我们可不管。问题是没有write(),没有ioctl()(为什么没有,我们可以暂不讨论),我想问的是,我们可否像上面那个代码一样添加自己的write与ioctl功能。
以上都是自己跟据现有资做出的理解,如有不对,请您不吝指出,还有我的一些不解之处,求大神解惑!! |
|