[linux驱动]proc学习笔记(一)

1,在/proc文件系统下创建节点的API
http://www.cnblogs.com/ziziwu/archive/2011/10/20/2218975.html
  struct proc_dir_entry *create_proc_entry (const char *name, mode_t mode, struct proc_dir_entry *parent);
  其中参数分别是 /proc 文件名,掩码,父目录。

 32 struct proc_dir_entry {
 33         unsigned int low_ino;
 34         umode_t mode;
 35         nlink_t nlink;
 36         kuid_t uid;
 37         kgid_t gid;
 38         loff_t size;
 39         const struct inode_operations *proc_iops;
 40         const struct file_operations *proc_fops;
 41         struct proc_dir_entry *next, *parent, *subdir;
 42         void *data;
 43         atomic_t count;         /* use count */
 44         atomic_t in_use;        /* number of callers into module in progress; */
 45                         /* negative -> it's going away RSN */
 46         struct completion *pde_unload_completion;
 47         struct list_head pde_openers;   /* who did ->open, but not ->release */
 48         spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
 49         u8 namelen;
 50         char name[];
 51 };


 
2,实现read和write proc文件系统节点的函数,分别为read_proc和write_proc函数
 原型函数:int (*read_proc)(char *page, char **start, off_t offset, int count, int *eof, void *data)
 原型函数:typedef int (write_proc_t)(struct file *file, const char __user *buffer, unsigned long count, void *data);

 http://blog.csdn.net/wbd880419/article/details/6637102
  对于read_proc_t
 
1. 第一个参数:为啥叫page?答案就是如果对proc文件调用读操作,内核会分配一个页大小的缓冲区。如何输出大于一个页的数据呢,这得依赖于第二个和第三个参数了。
为了理解第二三个参数,回忆下与文件操作相关的系统调用:
int open(const char *pathname, int flags);
off_t lseek(int fildes, off_t offset, int whence);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
对于proc文件,一次read操作最多只能读取一个page的数据,如果需要读取大于一个页的数据需要保存read的返回值,
然后使用lseek设定offset,然后再次调用read。回到参数的说明:
2. start和off参数:off对应于lseek里面的offset(lseek whence为SEEK_END,offset为负 的情况下,传进来的off为零,具体原因待考古)。
如果不设置*start的值,off的取值只能在[0, count - 1]之间,且能够读取的数据大小为:count - off。可以理解系统拷贝了
 [page + off, page+count - 1]之间的数据到用户的buffer里。如果off的取值超出范围,read将读不到数据。
如果设置了*start的值,系统认为*start指向的地址就是off指定的地址,off的值会被忽略,系统会拷贝[start, start+count-1]之间的
数据到用户空间。当然我们在实现start地址的定位时,可能会需要off的值。
3. count 参数与read中的count一致
4. eof参数,设置了这个参数表明不想再提供数据了,神马意思呢?
如果不设置这个参数,对于上面说的start为空的情况,read_proc返回后,系统如果发现 (count - off) < count
会接着下发写请求,读取off大小的数据。
例如:有这样的读取操作:
lseek(fd, 2, SEEK_SET); read(fd, buff_r, 30)
第一次调用read_proc, off=2, count=30, 由于我们没有设置start的值,将读取28字节的数据,由于没有设置*eof, 系统会再次下发read_proc
第二次调用read_proc, off=30, count=2, 在参数start的说明里提到,对于这个调用,系统默认读不到数据(怨念啊,为啥要下发)
于是read返回28
如果设置了这个参数就不会有第二次的下发了。
5. data参数,这个是给驱动程序预留的参数。
对于write_proc函数,参数是很简单的,需要说明的只有一点,就是write_proc的第二个参数buffer是用户态的地址,需要用copy_from_user
从用户态把数据拷到内核态的缓冲区里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统中,/proc文件是一种虚拟文件系统,用于提供内核和进程信息的访问接口。驱动程序可以通过读取/proc文件来获取系统的运行状态、内核参数、硬件信息等。 首先,驱动程序需要打开/proc文件并读取其中的内容。在Linux内核中,可以使用标准的文件操作函数(如open、read和close)来完成这个操作。驱动程序可以通过指定/proc文件的路径,并调用open函数来打开文件。通过read函数可以读取文件的内容,并将结果存储在缓冲区中。最后,通过close函数关闭/proc文件。 读取/proc文件时,驱动程序必须以只读模式打开文件,并按照文档中所描述的格式解析文件内容。每个/proc文件都有一个特定的格式,常见的包括以换行符分隔的多行文本、键值对等。驱动程序需要按照相应的格式解析内容,并将所需的信息提取出来。 例如,驱动程序可以读取/proc/cpuinfo文件来获取CPU的相关信息,如型号、频率、核心数等。读取/proc/meminfo文件可以获取系统内存的使用情况。另外,还可以通过读取/proc/modules文件来获取加载的内核模块列表。 在读取/proc文件时,驱动程序需要注意文件的并发访问。由于/proc文件是全局资源,可能会被其他进程或驱动程序同时访问。为了保证数据的一致性和安全性,驱动程序可以采用互斥锁或读写信号量来进行同步操作。 总之,在Linux驱动程序中,通过读取/proc文件可以获取内核和进程的各种信息。驱动程序需要打开/proc文件、读取文件内容,并按照文件格式解析所需的信息。同时,需要注意并发访问的情况,保证数据的一致性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值