du-a/proc
(1) 系统中的每个进程都有- -个以其pid为名的子目录
而每个子目录中则包括关于该进程执行的命令行
所有环境变量
cpu占用时间
内存映射表
已打开文件的文件号以及进程状态等特殊文件。
(2)系统中各种资源的管理信息,
如proc/slabinfo 就是内存管理中关于各个slab缓冲块队列的信
息,
/proc/swaps 就是关于系统的swap设备的信息,
/proc/paritions 就是关于各个磁盘分区的信息,等等。
(3) 系统中各种设备的有关信息,
如proclpci就是关于系统的PCI总线上所有设备的一 份清单,
4)文件系统的信息,如/proc/mounts 就是系统中已经安装的各个文件系统设备的清单,
而/proc/filesystemts则是系统中已经登记的每种文件系统(类型)的清单。
5) 中断的使用,cat /proc/interrupts
是一-份关于中断源和它们的中断向量编号的清单.
(6)与动态安装模块有关的信息,
/proc/mnodules 是一-份系统中已安装动态模块的清单,而
/proc/ksysms则是内核中供可安装模块动态连接的符号名及其地址的清单.
7) 与前述/dev/mem类似的内存访问手段,如pro/kcore
(8)系统的版本号以及其它各种统计与状态信息。
对proc文件系统不能
直接通过mount()来安装,而要先由系统内核在内核初始化时自动地通过一-个函数kern_mount(安装一
次,然后再由处理系统初始化的进程通过mount()安装,实际上是“重安装”。
static DECLARE_ FSTYPE(proc_fs_type, "proc", proc_read_super, FS_SINGLE);
static int _init init_ proc_fs(void)
{
int err = register_ filesystem(&proc_fs_type);
if (!err) {
proc_ mnt = kern_mount(&proc _fs_type);
err = PTR_ ERR(proc_mnt);
if (IS_ _ERR(proc_mnt))
unregister_filesystem(&proc_fs_type) ;
else
err = 0;
}
return err;
}
系统在初始化阶段对proc文件系统做两件事,一是 通过register_ filesystem0向 系统登记“proc” 这
么-种文件系统;二是通过kern_mount(将-一个具体的proc文件系统安装到系统中的/proc结点上。函
数kern_ mount()的 代码在fs/super.c中:
[init_ proc_ fs()>kern_ mount()]
struct vfsmount *kern_ mount(struct file_ system_ type *type)
{
kdev_t dev = get_unnamed_dev() ;
struct super_ b1ock *sb;
struct vfsmount *mnt;
if ( !dev)
return ERR_ PTR(-EMFILE) ;
sb = read_ super(dev,NULL, type, 0,NULL, 0);
if (!sb) {
put_unnamed_ dev(dev) ;
return ERR_ PTR(- EINVAL) ;
}
mnt = add_vfsmnt(NULL,sb->S_root, NULL) ;
if (!mnt) {
ki1l_super(sb, 0);
return ERR_ PTR(- ENOMEM) ;
}
type->kern_ mnt = mnt;
return mnt ;
}
每个已安装的文件系统都要有个super_ block 数据结构,proc 文件系统也不例外。由于super block
数据结构需要有个设备号来惟一地加以标识,尽管proc文件系统并不实际存在于任何设各上,却也得
有个“设备号”,所以要通过get_ unnamed_ dev()分配 -一个。这个函数的代码也在super.c中:
= === == === fs/proc/inode.c 181 210
[init_ proc_ fs()>kern_ mount()>read_ super()>proc_ read_ super()]
181 struct super_ b1ock *proc_ read_ super(struct super_ _b1ock *s,void *data,
182
int si lent)
183
184
struct inode * root_ _i node;
185
struct task_ struct *p;
186
187
s->S_ blocksize = 1024;
188
s->s_ _b1ocksize_ bits = 10;
189
S->S_ magic = PROC_ _SUPER_ _MAGIC;
190
S->S_ op = &proC_ sops;
191
root_ inode = proc_ get_ _inode(s, PROC_ ROOT_ INO, &proC_ root) ;
192
if (! root_ i node)
193
goto out_ no_ root ;
194
/*
195
* Fixup the root inode's nlink value
196
*/
197
read_ _1ock (&tasklist_ _1ock);
198
for_ each_ _task(p) if (p->pid) root_ _inode->i_ nlink++;
199
read_ unlock(&tasklist_ 1ock);
200
s->S_ root = d_ _a11oc_ root(root_ inode) ;
201
if (!s->s_ root)
202
goto out_ _no_ root ;
203
parse_ options(data, &root_ inode->i_ _uid, &root_ inode->i_ _gid);
204
return s;
205
206
out_ no_ root:
207
printk("proc_ read_ super: get root inode failed\n") ;
208
i put(root_ _i node) ;
209
return NULL ;
210 }
fs/proc/inode.c 94 99 ==
94
static struct super_ operations proc_ _sops = {
95
read_ _i node:
proc_ _read. _inode,
96
put_ inode:
force_ delete,
97
delete_ inode: proc_ delete_ _i node ,
98
statfs :
proc_ statfs,
99};