Linux 内核源码分析---proc 文件系统

proc文件系统

进程数据文件系统(process data filesystem, procfs)装载在 /proc,缩写为 procFS。

proc 文件系统是一种虚拟文件系统,其信息不能从块设备读取。只有在读取文件内容时才动态生成相应的信息。使用proc文件系统,可以获得有关内核各子系统的信息(如内存利用率、附接的外设,等等),也可以在不重新编译内核源代码的情况下修改内核的行为,或重启系统。

proc 文件系统提供一种接口,可用于该机制导出的所有选项,直接地修改参数无需开发专门程序,只需要一个shell和标准的 catecho 程序即可。

/proc信息
尽管proc文件系统的容量依系统而不同,其中仍然包含了许多深层嵌套的目录、文件、链接。信息可以分为以下几大类:
(1)内存管理;
(2)系统进程的特征数据;
(3)文件系统;
(4)设备驱动程序;
(5)系统总线;
(6)电源管理;
(7)终端;
(8)系统控制参数。

Linux系统上的/proc目录是一种文件系统,即proc文件系统。
/proc是一种伪文件系统(也即虚拟文件系统),具体目录如下:
在这里插入图片描述
在这里插入图片描述

proc 常见文件

buddyinfo:用于诊断内存碎片问题。
cmdline:在启动时传递至内核的相关参数信息,这些信息通常由lilogrub等启动管理工具进行传递;
cpuinfo:处理器的相关信息的文件;
crypto:系统上已安装的内核使用的密码算法及每个算法的详细信息列表;
devices:系统已经加载的所有块设备和字符设备的信息;
diskstats:每块磁盘设备的磁盘 I/O 统计信息列表;
filesystems:当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;
interrupts:X86 或 X86_64 体系架构系统上每个 IRQ 相关的中断号列表;
iomem:每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息;
ioports:当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;
kallsyms:模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;
locks:保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;
meminfo:系统中关于当前内存的利用状况等的信息,常由free命令使用;
mounts:在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统;
modules:当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;
partitions:块设备每个分区的主设备号(major)和次设备号(minor)等信息;
stat:实时追踪自系统上次启动以来的多种统计信息;
swaps:当前系统上的交换分区及其空间利用信息;
uptime:系统上次启动以来的运行时间;
version:当前系统运行的内核版本号;
vmstat:当前系统虚拟内存的多种统计数据;
zoneinfo:内存区域(zone)的详细信息列表;

proc 数据结构

1、proc 核心数据结构
实现 proc 文件系统的代码紧围绕这些结构而建立的,proc 大量使用 VFS 的数据结构,因为作为一种文件系统,它必须集成到内核的 VFS 抽象层中。

还有一些特定于 proc 的数据结构,用于组织内核提供的数据信息。还必须提供一个到内核各个子系统的接口,使得内核能从其数据结构中提取信息,然后借助 /proc 提供给用户空
间。proc 文件系统中的每个数据项都由proc_dir_entry的一个实例描述,
在这里插入图片描述

2、装载proc文件系统
内核内部用于描述 proc 文件系统结构和内容的数据已初始化之后,下一步是将该文件系统装载到目录树中。在内核添加新文件系统时,会扫描一个链表,查找与该文件系统相关的file_system_type实例。

在这里插入图片描述

proc 文件系统的超级块由proc_get_sb提供。该函数基于另一个内核辅助例程( get_sb_single),借助proc_fill_super(主要负责用一些定义后从不改变的值来填充 super block 的每个成员)来填充一个super_block的新实例。
在这里插入图片描述

proc_sops 中对超级块的各个操作,其中收集内核管理proc文件系统所需的各个函数,
在这里插入图片描述

静态的proc_dir_entry实例:
在这里插入图片描述

管理 /proc 数据项

1、数据项的创建和注册
新数据项分两个步骤添加到proc文件系统。首先,创建proc_dir_entry的一个新实例,填充描述该数据项的所有需要的信息。
使用fs/proc/generic.c中的proc_register将其注册到proc文件系统当中:

在这里插入图片描述

创建数据项之后,注册到 /proc 文件系统步骤:
a.生成一个唯一 proc 内部编号,向数据项赋予身份。get_inode_number 返回一个未使用的编号,用于为动态生成的数据项;
b.必须适当地设备proc_dir_entry实例的 nextparent 成员,将新数据项集成到 proc 文件系统的层次结构中;
c.如果此proc_dir_entry成员的proc_iopsproc_fopsNULL指针,那么需要根据文件类型,适当地设备指向file_operationsinode_operations结构实例的指针。

用于管理proc数据项:
proc_mkdir创建一个新目录;
proc_mkdir_mode创建一个新目录,目录的访问权限可以显式指定;
proc_symlink生成一个符号链接;
remove_proc_entry从proc目录中删除一个动态生成的数据项;

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞大圣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值