已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。本文只讨论基于 intel x86 架构的 Linux /proc 文件系统。/proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。/proc 由内核控制,没有承载 /proc 的设备。因为 /proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。对 /proc 进行一次 ls -l 可以看到大部分文件都是 0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。这怎么可能?这是因为 /proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层 (VFS) 了。然而,直到当 VFS 调用它,请求文件、目录的 i-node 的时候,/proc 文件系统才根据内核中的信息建立相应的文件和目录。加载 proc 文件系统 如果系统中还没有加载 proc 文件系统,可以通过如下命令加载 proc 文件系统:mount -t proc proc /proc上述命令将成功加载你的 proc 文件系统。更多细节请阅读 mount 命令的 man page。察看 /proc 的文件 /proc 的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。大部分 /proc 中的文件和目录提供系统物理环境最新的信息。尽管 /proc 中的文件是虚拟的,但它们仍可以使用任何文件编辑器或像more, less或 cat这样的程序来查看。当编辑程序试图打开一个虚拟文件时,这个文件就通过内核中的信息被凭空地 (on the fly) 创建了。这是一些我从我的系统中得到的一些有趣结果$ ls -l /proc/cpuinfo-r-r-r- 1 root root 0 Dec 25 11:01 /proc/cpuinfo$ file /proc/cpuinfo/proc/cpuinfo: empty$ cat /proc/cpuinfoprocessor : 0vendor_id : GenuineIntelcpu family : 6model : 8.bogomips : 1992.29注意:这里ls, file两个命令看到的cpuinfo的大小是0,但是cat可以可以看到内容.得到有用的系统/内核信息 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文件来获取更多的信息 。有关运行中的进程的信息 /proc 文件系统可以用于获取运行中的进程的信息。在 /proc 中有一些文件名为数字的子目录。每个目录对应一个进程 id (PID)。这样,每一个运行中的进程 /proc 中都有一个用它的 PID 命名的目录。这些子目录中包含可以提供有关进程的状态和环境的重要细节信息的文件。下面是一些文件(实在太多,只列一部分):1.文件 cmdline 包含启动进程时调用的命令行。2.envir 进程的环境变两。 3.status 是进程的状态信息,包括启动进程的用户的用户ID (UID) 和组ID(GID) ,父进程ID (PPID),还有进程当前的状态,比如Sleelping和Running。4.”cwd”是指向进程当前工作目录的符号链接5.exe指向运行的进程的可执行程序5.root指向被这个进程看作是根目录的目录 (通常是/)。6.fd包含指向进程使用的文件描述符的链接。 7.cpu仅在运行 SMP 内核时出现,里面是按 CPU 划分的进程时间。/proc/self 是一个有趣的子目录,它使得程序可以方便地使用 /proc 查找本进程地信息。/proc/self 是一个链接到 /proc 中访问 /proc 的进程所对应的 PID 的目录的符号链接。通过 /proc 与内核交互 上面讨论的大部分 /proc 的文件是只读的。而实际上 /proc 文件系统通过 /proc 中可读写的文件提供了对内核的交互机制。写这些文件可以改变内核的状态,因而要慎重改动这些文件。/proc/sys 目录存放所有可读写的文件的目录,可以被用于改变内核行为(linux有专门的api做读取这个目录的文件)。/proc/sys/kernel:这个目录包含反通用内核行为的信息.可修改已改变配置./proc/sys/kernel/domainname, hostname: 存放着机器/网络的域名和主机名。这些文件可以用于修改这些名字。通过修改 /proc 文件系统中的文件,我们可以修改主机名./proc/sys/net:这个目录中的文件可以用于修改机器/网络的网络属性。比如,简单修改一个文件,你可以在网络上瘾藏匿的计算机。$ echo 1 /proc/sys/net/ipv4/icmp_echo_ignore_all这将在网络上瘾藏你的机器,因为它不响应 icmp_echo。主机将不会响应其他主机发出的 ping 查询。要改回缺省设置,只要$ echo 0 /proc/sys/net/ipv4/icmp_echo_ignore_allVFS与proc fs的对照表 注意:proc仅存在于内存中VFS类型Proc fs 相应类型备注super block无. proc只要使用VFS的super block就可以表示其信息了. 没有自己的super block表示proc的super block动态分配得到.Super block operation相应的super_operations 为proc_sops.其值在备注栏显示.alloc_inode= proc_alloc_inode,.destroy_inode= proc_destroy_inode,.read_inode= proc_read_inode,.drop_inode= generic_delete_inode,.delete_inode= proc_delete_inode,.statfs= simple_statfs,.remount_fs= proc_remount,inodeproc_inode.这个类型内嵌了inode. proc有相应的cache实例proc_inode_cachep来分配proc_inode实例.Inode operation不同文件的inode,其操作不一样file无File operation不同文件其操作不一样dentry无Dentry operaion不同文件其操作不一样注:proc fs使用proc_dir_entry表示每一个inode(即proc_inode)实例, proc_dir_entry包含了proc中的文件所需要的信息. 每一个proc fs中的文件都有一个inode,也都有一个proc_dir_entry实例,该实例的首地址存放在相应的inode的u.generic_ip成员中proc file inodeproc_inodeproc_dir_entryproc fs使用全局变量proc_fs_type 表示其文件系统类型.其定义如下:static struct file_system_type proc_fs_type = .name= proc,.get_sb= proc_get_sb,.kill_sb= kill_anon_super,;通过调用register_filesystem(proc_fs_type)向内核注册proc fs文件系统类型.proc fs定义了全局的指向vfsmount实例的指针proc_mnt.它通过调用kern_mount(proc_fs_type)进行初始化, 并且proc_mnt有一个成员包含了proc fs超级块的信息(proc_mnt.mnt_sb). 此外,proc_mnt也包含了两个dentry实例. proc_mnt.mnt_root, proc_mnt.mnt_c fs使用了全局的vfsmount实例proc_mnt,以方便VFS对proc进行管理.把proc fs加载后, 目录/proc对应的dentry是动态分配的, 对应的inode是动态分配的, 对应的proc_dir_entry是proc_root. (参考下文) 对proc文件的管理 前面我们提过,相对于其他逻辑文件系统的具体文件组织形式(比如ext2文件系统的inode),proc文件系统也有自己的组织结构,那就是 proc_dir_entry结构,所有属于proc文件系统的文件,都对应一个proc_dir_entry结构,并且在VFS需要读取proc文件的 时候,把这个结构和VFS的inode建立链接(即由inode-u.generic_ip指向该prc_dir_entry结构)。 因此,proc文件系统实现了一套对proc_dir_entry结构的管理,下面我们就此进行一个分析。 proc_dir_entry结构 proc_dir_entry描述proc中文件的信息. 实例对应一个proc中的文件.proc_dir_entry实例放在inode-u.generic_ip成员中. proc文件系统本质就是一堆proc_dir_entry实例.proc_dir_entry定义如下:unsigned short low_ino;proc_dir_entry实例的ID, 除了根结点,其他的节点号都是在创建proc_dir_entry的时候,由make_inode_number()动态创建的unsigned short namelen; const char *name;proc文件的名字,以及其长度mode_t mode;proc文件的模式由两部分用位或运算组成,第一部分是文件的类型,可以参考include/linux/stat.h中的定义,比 如,S_IFREG表示普通文件,而S_IFDIR表示目录文件。第二部分是该文件的权限,同样可以参考include/linux/stat.h中的定 义,比如,S_IRUSR表示该文件能够被拥有者读,S_IROTH 表示该文件可以被其他人读取。但真正的权限检查,我们可以放到后面提到的inode_operations结构中。nlink_t nlink;uid_t uid; gid_t gid;unsigned long size;使用“ls”命令时,所显示出的文件大小struct inode_operations * proc_iops;proc中的inode的操作(即proc下inode的操作). 值得注意的是proc中不同的类型的文件其inode操作是不一样的struct file_operations * proc_fops;Proc中file的操作.注意不同类型的文件支持的文件操作不一样get_info_t *get_info当用户向proc文件读取的数据小于一个页面大小时,可以使用这个函数向用户返回数据struct module *owner定义proc fs的模块struct proc_dir_entry *next, *parent, *subdir;使用这些指针,把所有的proc_dir_entry构成树void *data;特殊用途的字段.如果文件是链接文件,那么这个字段指向目标文件的文件名read_proc_t *read_proc;write_proc_t *write_proc;对于proc中普通的文件,我们只要用这两个函数来实现或者写操作. 而不用为其专门定义inode 操作.atomic_t count使用计数.一个proc_dir_entry结构的count减为零时,会释放该实例int deleted;当我们调用remove_proc_entry函数要删除一个proc_dir_entry时,如果发现该结构还在使用,就会设置该标志并且退kdev_t rdev; 如果该proc文件是设备文件,那么设置这个成员创建proc文件create_proc_entry proc中使用create_proc_entry来创建一个文件.其函数原型为:struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent)该函数的执行流程如下:1.检查参数的合法性(eg:父节点的存在性)2.分配proc_dir_entry实例的空间(ent),然后做必要的初始化.比如,初始化文件名,如果该文件是目录,那么把ent-proc_fops = &proc_dir_operations, ent-proc_iops = &proc_dir_inode_operations3.调用proc_register把ent加入proc文件系统(即proc文件树)中4.返回entproc_register函数 这个函数把一个proc文件加入到proc文件树中,其函数原型如下:static int proc_register(struct proc_dir_entry * parent, struct proc_dir_entry * ent)其主要的流程如下:1.使用make_inode_number()函数动态的到一个节点号,并且设置low_ino.注意只是获得inode编号,并不会真的创建inode. 该inode的创建会推迟到proc_lookup中.2.将 这个proc_dir_entry结构链接到它的父节点上3.根据文件类型(普通文件,目录,symbolic)的不同,设置不同的缺省操作函数集。 删除proc文件remove_proc_entry 这个函数用来删除一个proc文件.注意如果该文件正被使用那么只是设置deleted标志,该函数的原型:void remove_proc_entry(const char *name, struct proc_dir_entry *parent)其中name是待删的proc文件. parent是该文件的父目录. 其执行流程如下:1.确定其父目录.如果parent有效,则执行2,否则(parent=NULL)尝试从name分析出parent,如果分析失败则函数返回失败,否则执行2.2.在parent中找出待删的文件对应的proc_dir_enty实例ent.3.把ent从proc文件树中删除,并更新树的状态4.如果该文件被使用则设置deleted标识(在其后的恰当时候会被释放),否则调用free_proc_entry其他proc文件操作函数 struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent)这个函数用来在proc文件系统中创建一个子目录,根据它的参数,我们就可以看出它的功能。在这个函数里,将动态分配一个 proc_dir_entry结构以及它的名字,然后,设置目录文件的缺省操作(proc_iops以及proc_fops)以及nlink值,最后,调 用proc_register函数将其注册。 struct proc_dir_entry *proc_mknod(const char *name, mode_t mode, struct proc_dir_entry *parent, kdev_t rdev)用来在proc文件系统中建立一个设备文件,因此,在创建proc_dir_entry结构后,没有设置缺省操作,而是使用 ent-rdev = rdev指定了设备。最后,调用proc_register函数将其注册。 struct proc_dir_entry *proc_symlink(const char *name, struct proc_dir_entry *parent, const char *dest)函数,该函数创建了一个链接文件,使用ent-mode = S_IFLNK|S_IRUGO|S_IWUGO|S_IXUGO来标志,它和其他文件的建立很相似,只是,它将链接的目标文件名放在了 ent-data域中。最后,它同样调用proc_register函数将该结构注册。struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void * data)创建只读的proc文件,并且设置其对应的proc_dir_entry中的read_proc成员. void create_seq_entry(char *name, mode_t mode, struct file_operations *f)在/proc目录下创建一个文件,其文件操作函数由f指定内核还定义了很多其他的创建proc文件的方式,请参考源代码.对proc文件操作的分析 对于proc中的普通文件,目录,链接的默认操作为:注:需要看看下面各个全局函数表的各个成员是如何实现的.proc文件类型Inode默认操作(proc_dir_c_iops)它也记录在inode上类型:struct inode_operationsFile默认操作(proc_dir_c_fops)它也记录在inode上类型:struct file_operationsdentry默认操作.它记录在相应的struct file实例上注意下面是proc定义的全局变量普通文件proc_file_inode_operationsproc_file_operationsproc_dentry_operations目录proc_dir_inode_operationsproc_dir_operations;proc_dentry_operations链接proc_link_inode_operationsNULLproc_dentry_operations注意:Proc_dir_entry中有两个函数指read_proc, write_proc.对于proc中普通的文件,我们只要用这两个函数来实现或者写操作. 而不用为其专门定义inode 操作或者file操作. 不同类型的文件,这两个操作也不一样. 下面的讨论针对proc下各个类型的文件来说明.如果必要会指定相应的proc_dir_entry实例(通常是静态的).如果没有说明是采用上面的默认值. 注意,这里只列出一部分/proc(proc_root)proc_root_inode_operationsproc_root_operations/proc/meminfo注:read_proc为meminfo_read_proc,其它默认/proc/modulesproc_modules_operations/proc/TGID(它其实是一个线程组)proc_tgid_base_inode_operationsproc_tgid_base_operationspid_base_dentry_operations注:/proc/tgid目录下的文件的dentry操作均为pid_dentry_operations/proc/TGID/environ/proc/TGID/task/PID/environproc_info_file_operations; read_proc=proc_pid_environ注意:/proc/TGID下还有很多文件,其操作也大不相同.这里只是列举了一些.另外/proc/tgid/task/pid目录下的文件的操作大部分与/proc/TGID目录下的操作一样/proc/TGID/taskproc_task_inode_operationsproc_task_operations/proc/TGID/fd/proc/TGID/task/PID/fdproc_fd_inode_operationsproc_fd_operations/proc/TGID/task/PIDproc_tid_base_inode_operationsproc_tid_base_operationspid_base_dentry_operations/proc/selfproc_self_inode_operations假设有一个线程组,其TGID为32182, 其包含两个线程:32182, 32255. 那么:执行 ls /proc, 则能看到有一个32182的目录.执行 ls /proc/32182则能看到该线程组的信息执行 ls /proc/32182/task则能看到两个目录32182,32255执行 ls /proc/32182/task/32182则能看到该task实例的信息但是如果我们执行 ls /proc/32255 也能得到和执行ls /proc/32182同样的效果.假设有一个线程组,其TGID为32243, 其包含一个线程:32243. 那么其效果类似上面的情况.注意:针对/proc/TGID目录下的各个文件,内核定义了一个全局数组tgid_base_stuff用来约定各个文件的基本信息,这个数据的元素的类型是pid_entry. 同样,内核也为/proc/TGID/task/PID目录下的文件定义了全局数组tid_base_stuff./proc/tgid目录的创建时机 (注意:这里只讨论/proc/下的进程目录)当执行ls /proc是并不会创建线程组的相应目录,而只是告诉你
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安徽防滑彩色沥青施工方案
- 安庆沥青道路路面施工方案
- 厂房行车梁安装施工方案
- 厂房地坪涂装施工方案
- 北市区装潢施工方案
- 别墅小哥团队专业施工方案
- 保山中型水上乐园施工方案
- gis变电站消防施工方案
- 基于微信公众平台的航空售票系统的设计与实现-20210509143
- 黄石职业技术学院-湖北工程职业学院集成门户
- 2024-2025学年高中政治上学期《新时代的劳动者》教学设计
- 幼儿园故事绘本《卖火柴的小女孩儿》课件
- JJF 1909-2021 压力式温度计校准规范_(高清正版)
- WI-QP007-13油温机操作指导书
- 诗词鉴赏李煜浪淘沙ppt课件
- 领导艺术与管理智慧
- 碳排放介绍及相关计算方法
- 八年级英语试卷分析10篇
- 社团活动记录(足球)
- 毕业设计(论文)-圆柱滚子轴承受力有限元分析设计(含全套CAD图纸)
- 学院学生工作思路、目标、举措
评论
0/150
提交评论