Linux proc文件系统相关

    PS:本博文为读深入Linux内核架构proc文件部分的读书笔记。

Linux proc文件系统是一种虚拟文件系统,其信息不能从块设备读取,只有在读取文件内容时,才动态生成响应的信息。proc文件系统和系统控制机制(system control mechanism 简称 sysctl)紧密相连。可以通过sysctl来修改/proc文件系统中的内从,从而动态的修改内核的运行参数。比如利用sysctl修改/proc/net文件下的某些数据,能够动态的改变当前内核的运行参数,如打开包转发功能。

proc文件下保存着很多文件,这些文件有些是文本文件,可以利用cat来着看其内容,有些不是文本文件,这种情况下可以利用od工具来将其转换为刻度格式。使用od -t a  /proc/1/cmdline可以查看产生进程1的程序名字,其为/sbin/initroot。

proc文件保存的主要内容:

1.特定于进程的数据:/proc文件下有多个以数字命名的文件夹,这些数字对应于进程pid,每个进程的相关信息都保存在这里如其中的cmdline保存着进程对应的程序名字。

2.一般性系统信息:这部分信息和特定的内核子系统无关,其是一般性的信息,比如/proc/iomen下保存着用来与设备通信的内存地址和端口的有关信息。

3.网络信息:主要存放在/proc/net下面的文件包括ARP表等信息。

4.系统控制参数:这部分内容主要保存着/proc/sys下面,如/proc/sys/vm/swappiness保存的是页交换算法的积极承担默认值为60,值越高,换页越积极。

proc文件系统相关数据结构:

1.struct proc_dir_entry:文件系统中的每个数据项(或者说文件)都由该结构的一个实例描述

2.typedef int (read_proc_t) (char *page,char**start...),typedef int (write_proc_t)...:可以通过这两个函数格式来创建自己的proc文件的读写函数,之后只需要把这两个函数指针赋值给proc_dir_entry结构中对应的reda_proc和write_proc即可。

3.inode_operation,file_operations,proc_op,proc_inodes,这几个结构都是用来将proc数据和VFS层的inode数据关联起来。其中前面两个是用来对文件进行操作的结构(保存着操作文件的数据)。

4.此外,在早期版本3.10以前,可以通过create_proc_entry函数来创建proc文件,然后制定其读写函数等。而在之后的版本,该函数删除了,对应的有create_proc和proc_mkdir函数用来创建对应的proc文件。其参数也有一些改变,早期版本不需要用到file_operations函数,而之后的版本需要用到该操作函数,并且可以通过该结构制定对应的实现该proc文件的读写函数。

proc文件系统的初始化

proc文件系统的初始化和普通文件系统的初始化意义需要用mount装载。之后调用proc_root_init函数来初始化创建/proc的子目录。该函数的主要步骤如下:

1.使用proc_init_inodecache为proc_inode对象创建一个slab缓存。

2.使用register_filesysytem将文件系统正式的注册到内核

3.之后mount装载文件系统,使用kern_mount_data返回一个vfsmount实例的指针,供内核后面使用。

4.使用proc_misc_init穿件proc主目录中的各种文件项,这些文件项和特定函数关联,用于从内核的数据结构读取信息。然后具体的创建各个子目录,如使用proc_net_init创建和网络相关的proc文件等。

proc文件系统的装载

proc文件系统的结构和内容初始化之后,我们需要将该系统装载到目录树中。将proc文件挂载到VFS目录下和其他的非虚拟文件系统的装载是等同的,差别之处在于proc文件将一根关键字(proc或者none)指定为数据源。而不适用设备文件。之后的装载过程有VFS系统来完成,在内核添加新文件系统时,会扫描一根链表,查找与该文件系统相关的file_sysytem_type实例,该文件提供了读取文件的一些信息。之后又VFS根据信息将文件系统加入,具体的操作在VFS系统中有更加详细的介绍,这里不再深入。

/proc数据项的管理

1.数据项的创建和注册:首先必须创建一个proc_dir_entry的实例,之后将该实例注册到proc的数据结构。这两个步骤不对执行,都是合并在一起。利用前面提到的create_proc_entry函数来执行。该实例生成之后,需要注册到相关的数据结构,其步骤主要如下:

(1)生成一个唯一的proc内部编号。利用get_inode_number返回一个未使用的编号。

(2)设置proc_dir_entry的next和parent成员,将数据项集成到proc文件系统中

(3)根据文件类型,在proc_iops和proc_fops为空指针时,设置file_operations和inode_operations结构实例的指针。其值非空时则不需要设置。

2.proc数据项的查找:proc文件的查找访问和访问常规文件系统中的普通文件一样。即搜索proc数据项是所经由的代码路径。从装载点/proc,通过调用proc_lookup查找,如果找到则停止,如果没有找到,这种情况下该文件主要是特定进程的数据项则调用proc_pid_lookup查找。

proc文件的读取和写入

proc文件系统中对数据项的读写操作保存在前面我们所提到的proc_file_operations中,该结构主要通过.read=porc_file_read值和.write=proc_file_write值来实现默认的读写操作。其具体的实现如下:

1.proc_file_read的实现:

其主要有三个步骤:

(1)分配一个内存页面,将产生的数据填充到页面中

(2)调用一个特定于文件的函数,向内存页面填充数据

(3)将数据从内核空间复制到用户空间

2.proc_file_write的实现:

同样主要执行四个步骤:

(1)检测用户输入的长短,确保不超过分配区域的长度。

(2)数据从用户空间复制到分配的内核空间区域

(3)从字符串中提取信息,即解析操作。该任务有cpufreq_parse_policy函数完成。

(4)根据收到的用户信息,对该系统或者子系统进行操作。

此外,你可以自己编写读写函数,并且把对应的读写函数地址复制给proc_file_operations操作。之后,你对该文件进行读写的时候调用的是自己的读写函数。如果没有指定自己的读写函数,则使用默认的读写函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值