proc文件系统 国防科大操作系统课件
- 格式:ppt
- 大小:779.50 KB
- 文档页数:22
第12章/proc文件系统实验目的●学习使用/proc文件系统●使用/proc文件系统显示缺页状态●使用/proc文件系统输出超过一个页面的信息。
请注意:你在第一阶段的学习中可以先把重点放在怎样使用proc文件系统上;关于proc 文件系统的内部实现细节,由于牵涉到太多文件系统原理与相关概念,建议你在学习完本书《文件系统》这一章之后,在回过头来对照相应代码进行分析。
实验内容1. 在/proc文件系统中添加必要的节点,以统计操作系统发生的缺页中断次数。
2. 实现一个proc文件接口,每次当用户读取这个proc文件的时候,要求打印出系统中所有进程的pid,comm,start_time,utime,stime,policy,priority 实验原理12.1 /proc文件系统procfs,是process fs的缩写。
最开始的时候只是一些进程相关的信息的集合,Linux 扩展了这个概念,可以通过/proc文件系统交互几乎任何内核的信息。
/proc不是一个真正的文件系统(这么说的意思是,/proc不像普通的文件系统是用于管理磁盘上的文件,并且要占用磁盘上的空间;/proc只存在于内存中,更确切地说是只有管理模块存在于内存中,所有具体的信息都动态地从运行中的内核里面读取)。
proc文件系统的历史有点复杂,基本上,随着Unix的演化而到了今天这个样子,为我们带来方便。
/proc文件系统是一个接口,用户与内核交互的接口,用户从/proc文件系统中读取很多内核释放出来的信息(包括内核各个管理模块的动态信息,CPU信息,硬件驱动释放出来的信息等等);同时内核也可以在必要的时候从用户得到输入,进而改变内核的变量,或者运行状态。
/proc文件系统中主要包含两方面的文件(或者说主要有两个大的用途):一是只读文。
Proc文件系统简要介绍什么是proc文件系统proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。
它以文件系统的方式为访问系统内核数据的操作提供接口。
用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。
由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
它的目录结构如下:目录名称目录内容apm 高级电源管理信息cmdline 内核命令行Cpuinfo 关于Cpu信息Devices 可以用到的设备(块设备/字符设备)Dma 使用的DMA通道Filesystems 支持的文件系统Interrupts 中断的使用Ioports I/O端口的使用Kcore 内核核心印象Kmsg 内核消息Ksyms 内核符号表Loadavg 负载均衡Locks 内核锁Meminfo 内存信息Misc 杂项Modules 加载模块列表Mounts 加载的文件系统Partitions 系统识别的分区表Rtc 实时时钟Slabinfo Slab池信息Stat 全面统计状态表Swaps 对换空间的利用情况Version 内核版本Uptime 系统正常运行时间并不是所有这些目录在你的系统中都有,这取决于你的内核配置和装载的模块。
另外,在/proc下还有三个很重要的目录:net,scsi和sys。
Sys目录是可写的,可以通过它来访问或修改内核的参数(见下一部分),而net和scsi则依赖于内核配置。
例如,如果系统不支持scsi,则scsi目录不存在。
除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。
系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的PID号为目录名,它们是读取进程信息的接口。
而self目录则是读取进程本身的信息接口,是一个link。
Proc文件系统的名字就是由之而起。
进程目录的结构如下:目录名称目录内容Cmdline 命令行参数Environ 环境变量值Fd 一个包含所有文件描述符的目录Mem 进程的内存被利用情况Stat 进程状态Status 进程当前状态,以可读的方式显示出来Cwd 当前工作目录的链接Exe 指向该进程的执行命令文件Maps 内存映象Statm 进程内存状态信息Root 链接此进程的root目录用户如果要查看系统信息,可以用cat命令。
proc⽂件系统介绍(1)linux内核是⼀个⾮常庞⼤、⾮常复杂的⼀个单独的程序,对于这样的⼀个程序来说调试是⾮常复杂的。
(2)项kernel这样庞⼤的项⽬,给⾥⾯添加/更改⼀个功能是⾮常⿇烦的,因为你这添加的⼀个功能可能会影响其他已经有的。
(3)早期内核版本中尽管调试很⿇烦,但是⾼⼿们还可以凭借个⼈超凡脱俗的能⼒去驾驭。
但是到了2.4左右的版本的时候,这个难度已经⾮常⼤了。
(4)为了降低内核调试和学习的难度,内核开发者们在内核中添加了⼀些属性专门⽤于调试内核,proc⽂件系统就是⼀个尝试。
(5)proc⽂件系统的思路是:在内核中构建⼀个虚拟⽂件系统/proc,内核运⾏时将内核中⼀些关键的数据结构以⽂件的⽅式呈现在/proc⽬录中的⼀些特定⽂件中,这样相当于将不可见的内核中的数据结构以可视化的⽅式呈现给内核的开发者。
(6)proc⽂件系统给了开发者⼀种调试内核的⽅法:我们通过实时的观察/proc/xxx⽂件,来观看内核中特定数据结构的值。
在我们添加⼀个新功能的前后来对⽐,就可以知道这个新功能产⽣的影响对还是不对。
(7)proc⽬录下的⽂件⼤⼩都是0,因为这些⽂件本⾝并不存在于硬盘中,他也不是⼀个真实⽂件,他只是⼀个接⼝,当我们去读取这个⽂件时,其实内核并不是去硬盘上找这个⽂件,⽽是映射为内核内部⼀个数据结构被读取并且格式化成字符串返回给我们。
所以尽管我们看到的还是⼀个⽂件内容字符串,和普通⽂件⼀样的;但是实际上我们知道这个内容是实时的从内核中数据结构来的,⽽不是硬盘中来的。
1、常⽤proc中的⽂件介绍(1)/proc/cmdline(2)/proc/cpuinfo(3)/proc/devices(4)/proc/interrupts2、proc⽂件系统的使⽤cat以⼿⼯查看程序中可以⽂件IO访问在shell程序中⽤cat命令结合正则表达式来获取并处理内核信息#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>int main(int argc ,char **argv){int fd=-1;char buf[500]={0};if(argc!=2){printf("eg: %s -d|-v\n",argv[0]);return -1;}if(!strcmp(argv[1],"-v")){fd=open("/proc/version",O_RDONLY);read(fd,buf,sizeof(buf));printf("结果:\n%s\n",buf);}else if(!strcmp(argv[1],"-d")){fd=open("/proc/devices",O_RDONLY);read(fd,buf,sizeof(buf));printf("结果:\n%s\n",buf);}}3、扩展:sys⽂件系统(1)sys⽂件系统本质上和proc⽂件系统是⼀样的,都是虚拟⽂件系统,都在根⽬录下有个⽬录(⼀个是/proc⽬录,另⼀个是/sys⽬录),因此都不是硬盘中的⽂件,都是内核中的数据结构的可视化接⼝。
《操作系统》实验报告实验序号:实验十一实验项目名称:Linux proc文件系统学号1207022103 姓名陈华荣专业、班1班实验地点实1-311 指导教师李桂森实验时间2014-12-17 一、实验目的通过本实验的学习,使学生掌握Linux 系统Web服务器的配置方法,搭建简单的动态数据网站。
二、实验内容实验内容:实践Linux系统Web服务器的配置操作,并搭建简单的动态网站。
三、实验内容与步骤1,查看/proc 目录,了解此目录下各个目录以及文件的含义;解释以下文件的含义:proc 文件系统可以被用于收集有用的关于系统和运行中的内核的信息。
下面是一些重要的文件:* /proc/cpuinfo - CPU 的信息 (型号, 家族, 缓存大小等)* /proc/meminfo - 物理内存、交换空间等的信息* /proc/mounts - 已加载的文件系统的列表* /proc/devices - 可用设备的列表* /proc/filesystems - 被支持的文件系统* /proc/modules - 已加载的模块* /proc/version - 内核版本* /proc/cmdline - 系统启动时输入的内核命令行参数* /proc/XXX – XXX是指以数字编号的目录,有不少这样的目录,每一个目录表示一个进程(即线程组)* /proc/sys –可以修改的系统信息* /proc/swaps - 要获知swap空间的使用情况* /proc/uptime - 获取系统的正常运行时间* /proc/fs/nfsd/exports - 列出由NFS共享的文件系统* /proc/kmsg –该文件被作为内核日志信息源,它可以被作为一个系统信息调用的接口使用。
* /proc/kcore –该文件提供了以内核文件格式形式访问系统物理内存,并且可以被gdb用于检查任意内核数据结构的当前状态。
如果装了源码,那么可以通过查看/usr/src/linux/Documentation/filesystems/proc.txt文件来获取更多的信息。
Struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent)说明:Name:要创建的目录名Parent:父目录指针返回值:proc_dir_entry类型指针,以后会传递这个指针到create_proc_read_entry() 里在name目录下创建文件。
用法:Struct proc_dir_entry *parent;Parent=proc_mkdir(“myproc”,NULL);Create_proc_read_entry(“scullmem”,0744,parent,scull_read_procmem,NULL);函数create_proc_entry,由它创建并注册proc文件struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent)这样,在/proc下创建了myproc目录,并在myproc目录下创建了一个名为scullmem的文件,权限为0744proc_dir_entry结构体的详解:相对于其他逻辑文件系统的具体文件组织形式(比如ext2文件系统的inode),proc文件系统也有自己的组织结构,那就是proc_dir_entry结构,所属于proc文件系统的文件,都对应一个proc_dir_entry结构,并且VFS需要读取proc文件的时候,把这个结构和VFS的inode建立链接(即由inode u.generic_ip指向该proc_dir_entry结构),因此,proc文件系统实现了一套对proc_dir_entry结构的管理。
1.proc_dir_entry结构,这个结构体描述了一个proc文件的全部信息,每一个proc文件都是由这个结构体来表示的struct proc_dir_entry{unsigned short low_ino; //这是用来唯一标志proc_dir_entry结构的节点号,也就是proc文件系统内的索引节点的标号,除了根节点,其他的节点号都是在创建proc_dir_entry的时候,由make_inode_number()动态创建的unsigned short namelen;const char *name; //这个proc文件的名字mode_t mode; //文件的模式,由两部分用位或运算组成,第一部分是文件的类型如S_IFREG表示普通文件,S_IFDIR表示目录文件,第二部分是文件的权限如S_IRUSR表示该文件能够被拥有者读,S_IROTH表示可以被其他人读取nlink_t nlink;uid_t uid;gid_t gid;unsigned long size; //文件大小struct inode_operator *proc_iops; //这是一个inode_operations结构,其中设置了针对这个proc索引节点的操作函数,这样,我们就可以针对不同类型的proc 文件,提供不同的方法,以完成不同的工作。