感觉 proc
文件系统挺简单的,这倒是省了不少事,呵呵了~~
(四)、嵌入式Linux内核驱动进阶
(5)、Linux进程控制(Proc文件系统)—③
Proc
文件系统
1、定义
Proc 文件系统,是一个特殊的文件系统,内核通过 Proc 文件系统将内核的一些信息输出给用户,/proc
目录下的每个文件都可以绑定到一个内核函数上;文件被读写时,被绑定的相应内核函数就会被触发,有这些函数处理文件的输出和输入。
简单的说,Proc 文件并不是真正意义上的文件,只有调用的时候才会由系统即时的生成以供读取!
2、Proc
的目录结构
和普通文件一样,Proc 文件系统目录结构由目录和文件组成。不同的是,Proc
文件系统中的文件都是有特定用途的,分别反映出不同的内核信息。
然后列出 Proc 文件系统中的主要功能文件:
子目录/文件名 内容描述
Apm 高级电源管理信息
Bus bus 总线相关信息
Cmdline 内核引导命令行参数
Cpuinfo cpu 信息
Devices 当前可用设备(包含所有的块设备和字符设备)
Dma DMA 通道使用情况
Filesystems 当前内核支持的文件系统
Ide IDE 子系统相关信息的子目录
Interrupt 终端使用情况
Ioports I/O 端口使用情况
Ksyms 内核符号表
Kmsg 内核信息
Locks 内核锁信息
Meminfo 内存信息
Modules 已加载内核模块列表
Mounts 已加载的文件系统
Net 网络子系统信息
Partitions 已识别的本地系统分区表
Slabinfo slab 内存分配池信息
Stat 内存状态总览
Sys 内核系统参数
Tty TTY 驱动信息
Uptime 系统 uptime
Version 内核版本
3、特点
▲:每个文件都规定了严格的权限
可读?可写?那个用户可读?哪个用户可写?
▲:可以用文本编辑程序读取(more、cat、vi 命令等)
▲:不仅可以有文件,还可以有子目录
▲:可以自己编写程序添加一个 /proc 目录下的文件
▲:文件的内容都是动态创建的,并不存在于磁盘上
4、Proc
编程接口
1)creat_proc_entry
函数功能:
创建 proc 文件
头文件:
#include
函数原型:
Struct proc_dir_entry *creat_proc_entry(const char *name,mode_t
mode,struct proc_dir_entry *parent)
参数说明:
Name:要创建的文件名
Mode:要创建文件的属性,默认 0755
Parent:这个文件的父目录,填写 NULL 为 proc 文件系统顶层目录
返回值:
成功返回 proc_dir_entry 结构体指针,失败返回 NULL。
该结构体的主要成员:
Struct proc_dir_entry
{
Const char
*name // 文件名
Mode_t
mode; // 文件权限
Uid_t
uid; // 文件的 uid
Gid_t
gid; // 文件的 gid
Struct inode_operations
*proc_iops; // 节电操作结构指针
Struct file_operations
*proc_fops; // 文件操作结构指针
Struct proc_dir_entry
*parent; // 父目录
…
Read_proc_t
*read_proc; // proc 读操作函数
Write_proc_t *
write_proc; // proc 写操作函数
Void
*data; // 指向私有数据
Stomic_t
count; // 使用计数
…
}
2)proc_mkdir
函数功能:
创建 proc 目录
头文件:
#include
函数原型:
Struct proc_dir_entry *proc_mkdir(const char *name,struct
proc_dir_entry *parent)
参数说明:
name:要创建的目录名
parent:该目录为父目录,填写 NULL 为 proc 文件系统顶层目录
返回值:
成功返回 proc_dir_entry 结构体指针,失败返回 NULL
3)remove_proc_entry
函数功能:
删除 proc 目录或者文件
头文件:
#include
函数原型:
Void remove_prco_entry(const *name,struct proc_dir_entry
*parent)
参数说明:
Name:要删除的文件或者目录名
Parent:所在的父目录
返回值:
无
4)read_prco 成员对应的读回调函数
函数原型:
Int read_func(char *page,char **stat,off_t off,int count,int
*peof,void *data)
参数说明:
Page:把要返回给用户的信息写在 buffer 里,最大不超过 PAGE_SIZE。
Stat:一般不使用
Off:偏移量
Count:用户要取的字节数
Peof:读到文件尾时,需要把 *peof 置 1
Data:指向私有数据,一般不使用
5)write_proc 成员对应的写回函数
函数原型:
Int write_func(struct file *file,const char *buffer,unsigned
long count,voide *data)
参数说明:
File:该 proc 文件对应的 file 结构,现在暂时还是用不到的!
Buffer:待写的数据所在饿位置
Count:待写数据的大小
Data:指向私有数据,一般不使用
然后就是实现代码:
#include
#include
#include
#define procfs_name "protest" //
proc 的名字
struct proc_dir_entry *our_proc_file;
/*
* read_proc 成员对应的读回调函数
*~/
int procfile_read(char *page,char **stat,off_t off,int count,
int
*peof,void *data)
{
int ret;
ret = sprintf(page,"Hello,_Justin!\n");
return(ret);
}
int __init proc_init()
{
/*
* 创建 proc 文件
*~/
our_proc_file =
create_proc_entry(procfs_name,0644,NULL);
if(our_proc_file == NULL)
{
remove_proc_entry(procfs_name,NULL);
printk("<1>Error:
Could not initialize /proc/%s\n",
procfs_name);
return(-ENOMEM);
}
/*
* 给 proc_dir_entry 结构体赋值
*~/
our_proc_file->read_proc =
procfile_read;
our_proc_file->uid = 0;
our_proc_file->gid = 0;
our_proc_file->size = 37;
printk("<1>/proc/%s
created\n",procfs_name);
return(0);
}
void __exit proc_exit()
{
/*
* 删除 proc 目录或者文件
*~/
remove_proc_entry(procfs_name,NULL);
printk("<1>/proc/%s
removed!\n",procfs_name);
}
module_init(proc_init);
module_exit(proc_exit);
再然后就是通过
NFS 起根文件系统了,安装内核模块,查看其运行状态: