proc文件系统 国防科大操作系统课件
操作系统课程设计proc文件系统
![操作系统课程设计proc文件系统](https://img.taocdn.com/s3/m/4a865fc29b89680203d82541.png)
得到有用的系统/内核信息
proc 文件系统可以被用于收集有用的关于系统和运行中 的内核的信息。下面是一些重要的文件:
• • • • • • • • /proc/cpuinfo - CPU 的信息 (型号, 家族, 缓存大小等) /proc/meminfo - 物理内存、交换空间等的信息 /proc/mounts - 已加载的文件系统的列表 /proc/devices - 可用设备的列表 /proc/filesystems - 被支持的文件系统 /proc/modules - 已加载的模块 /proc/version - 内核版本 /proc/cmdline - 系统启动时输入的内核命令行参数
操作系统 课程设计
proc 文件系统
proc
• proc 文件系统是 Linux 中的特殊文件系统,提供 给用户一个可以了解内核内部工作过程的可读窗 口,在运行时访问内核内部数据结构、改变内核 设置的机制。
保存系统当前工作的特殊数据,但并不存在于任何物
理设备中;
对其进行读写时,才根据系统中的相关信息即时生成;
• 同学们在实验课程中重新编译过 Linux 内核, 有些同学可能会发现在内核的配置过程中,有 很多设备驱动程序和其他内核元素都被编译成 了模块。如果一个驱动程序被直接编译到了内 核中,那么即使这个驱动程序没有运行,它的 代码和静态数据也会占据一部分空间。但是如 果这个驱动程序被编译成一个模块,就只有在 需要内存并将其加载到内核时才会真正占用内 存空间。有趣的是,对于 LKM 来说,我们不 会注意到有什么性能方面的差异,因此这对于 创建一个适应于自己环境的内核来说是一种功 能强大的手段,这样可以根据可用硬件和连接 的设备来加载对应的模块。
proc 中的文件远不止上面列出的这么多。想要进一步了 解,可以对 /proc 的每一个文件都'more'一下。
Linux教程第12章 proc文件系统
![Linux教程第12章 proc文件系统](https://img.taocdn.com/s3/m/2eba724333687e21af45a9ff.png)
第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文件系统](https://img.taocdn.com/s3/m/a90488503b3567ec102d8a5f.png)
实验四 PROC文件系统
预备知识
proc文件系统功能 proc文件描述
proc进程目录结构
实验指导
proc信息获取
终端图形编程curses
图形界面编程GTK和Qt
实验目的、内容
2.1 proc信息获取—获取性能参数
读取proc文件系统,能获取系统各种性能参数
CPU使用率:/proc/stat 来源数据:用户模式(user)、低优先级用户模式(nice)、内核模式 (system)和空闲的处理器时间(idle) 计算方法:100 * (user+nice+system) / (user+nice+system+idle) 内存使用情况:/proc/meminfo 来源数据:当前内存使用量(cmem)、内存总量(amem) 计算方法:100 * (cmem / amem) 网络负载情况:/proc/net/dev 来源数据:从本机输出的数据包数(output)、流入本机的数据包数 (input) 计算方法:(output+input) / 2
2.2 终端图形编程curses—在屏幕上显 示字符
echochar(char) / addch(ch) 显示某个字符 mvaddch(y,x,ch) 在(x,y)上显示某个字符 addstr(str) 显示一串字符 mvaddstr(y,x,str) 在(x,y)上显示一串字符 printw(format,str) 以一定的格式输出至屏幕 mvprintw(y,x,format,str) 在(x,y)位置做printw的工作 getch()、getstr() 从键盘上读取字符/字符串 scanw(format,&arg1,&arg2) 同scanf()读取字符或字符串 ……
proc文件系统简要介绍
![proc文件系统简要介绍](https://img.taocdn.com/s3/m/1340d705a58da0116d17494b.png)
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文件系统介绍
![proc文件系统介绍](https://img.taocdn.com/s3/m/7ecc4e3ce3bd960590c69ec3d5bbfd0a7956d560.png)
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⽬录),因此都不是硬盘中的⽂件,都是内核中的数据结构的可视化接⼝。
19 Proc文件系统
![19 Proc文件系统](https://img.taocdn.com/s3/m/5b19758fa0116c175f0e48c3.png)
写操作
int write_func(struct file*file,const char *buffer,unsigned long count,void*data) 参数: 参数: file:该proc文件对应的 结构,一般忽略。 该 文件对应的file结构 文件对应的 结构,一般忽略。 buffer:待写的数据所在的位置 待写的数据所在的位置 count:待写数据的大小 待写数据的大小 data:一般不使用 一般不使用
读写
为了能让用户读写添加的 proc文件,需要 文件, 文件 挂接上读写回调函数: 挂接上读写回调函数: read_proc write_proc
读操作
int read_func(char*buffer,char**stat,off_t off,int count,int*peof,void*data) 参数: 参数: buffer:把要返回给用户的信息写在 把要返回给用户的信息写在buffer里,最 把要返回给用户的信息写在 里 大不超过PAGE_SIZE 大不超过 stat:一般不使用 stat:一般不使用 off:偏移量 偏移量 count:用户要取的字节数 用户要取的字节数 peof:读到文件尾时,需要把*peof置1 读到文件尾时,需要把 读到文件尾时 置 data:一般不使用 一般不使用
创建目录
struct proc_dir_entry*proc_mkdir(const char*name,struct proc_dir_entry*parent) 功能:创建proc目录 功能:创建 目录 参数: 参数 name:要创建的目录名 要创建的目录名 parent:这个目录的父目录 这个目录的父目录
Proc文件 文件
特点
每个文件都规定了严格的权限 可读?可写?哪个用户可读?哪个用户可写? 可读?可写?哪个用户可读?哪个用户可写? 可以用文本编辑程序读取( 命令, 命 可以用文本编辑程序读取(more命令,cat命 命令 程序等等) 令,vi程序等等) 程序等等 不仅可以有文件,还可以有子目录。 不仅可以有文件,还可以有子目录。 可以自己编写程序添加一个/proc目录下的文件。 目录下的文件。 可以自己编写程序添加一个 目录下的文件 文件的内容都是动态创建的, 文件的内容都是动态创建的,并不存在于磁盘 上。
第18章 proc文件系统
![第18章 proc文件系统](https://img.taocdn.com/s3/m/0fe48407bb68a98271fefa23.png)
proc文件系统数据结构(2)
–系统启动后,创建由proc_dir_entry结构形成的文件系 统树,每当从用户空间读取/proc目录下的文件时,内 核根据读取的文件映射到对应的函数,动态地获得内核 数据。
–除提供读出功能,/proc文件系统的部分文件还提供写 入功能。/proc文件系统的超级块和普通文件系统的超 级块不同,它不需要从硬件中获得超级块中的数据,而 是在内核启动时直接初始化超级块数据,从而完成系统 对/proc文件系统操作函数的初始化过程。
• 读文件接口的函数原型是:
int (*read_proc) (char *page, char **start, off_t off, int count, int *eof, void *data);
参数page指针是写数据给用户的数据缓冲区;start指 明要把数据写在哪一个位置;offset指定写入数据相对 于缓冲区的偏移量;count为写入的字节数;eof是一个 返回参数,当文件指针已经指向文件尾时,该标志被置 位;data一般用作保存私有数据。
–该方法既可以用于收集状态信息和统计信息,也可以 用于程序调试或修改内核数据结构及变量值。在UNIX 的发展过程中,该功能被进一步加强,在系统根目录 下建立/proc目录,演变成一个特殊的文件系统/proc, 该文件系统目录中的特殊文件包含以下内容:
/proc文件系统目录中的内容(1)
–·资源管理信息。 如/proc/slabinfo是主存管理中关于各个slab 缓冲块的信息、/proc/swaps是系统的swap设 备的信息、/proc/partitions是磁盘分区的信 息。
文件系统数据结构(4)
–/proc文件系统中,proc_dir_entry数据结构的定义 (续): • struct module *owner; • struct proc_dir_entry *next, *parent, *subdir; • void *data; • read_proc_t *read_proc; • write_proc_t *write_proc; • atomic_t count; • int deleted; • kdev_t rdev; • };
课件:实验教案-模块参数及Proc文件系统
![课件:实验教案-模块参数及Proc文件系统](https://img.taocdn.com/s3/m/6c22326dec3a87c24128c41d.png)
三、实验内容:
➢ 写一个简单的字符设备驱动程序,要求:
定义一个全局结构指针,初始值为NULL,该数据结构中包 含一个大小为N的buffer;
在open中对该全局结构进行NULL判断,为NULL则为其分配 内存,并将buffer初始化为0;
在release中释放buffer; 通过读proc文件系统对该buffer进行读取; 通过写proc文件系统对该buffer进行赋值; 在加载过程中指定模块参数N,Buffer的大小。
第二次上机实验
1
பைடு நூலகம்
一、实验目的
➢ 掌握简单字符设备驱动程序中模块参数及Proc文件系 统的编写方法。
➢ 学习利用模块参数进行驱动程序参数传递,学习利用 Proc文件系统进行数据读写。
2
二、实验要求
➢ 按实验内容编写驱动程序 ➢ 编译驱动程序 ➢ 在嵌入式设备上加载驱动程序并利用Proc文件系统的
读写进行驱动程序测试
四、实验步骤:
➢ 参考《嵌入式系统设计》课程第05讲内容,根据实验 内容要求设计编写驱动程序
➢ 编译和加载驱动程序 ➢ 进行驱动程序测试 ➢ 卸载驱动程序
操作系统实验11 Linux proc文件系统
![操作系统实验11 Linux proc文件系统](https://img.taocdn.com/s3/m/d425536ccaaedd3383c4d3b7.png)
《操作系统》实验报告实验序号:实验十一实验项目名称: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文件来获取更多的信息。
proc文件系统及其相关操作
![proc文件系统及其相关操作](https://img.taocdn.com/s3/m/a3ef4ddcad51f01dc281f18a.png)
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 文件,提供不同的方法,以完成不同的工作。
Proc文件系统
![Proc文件系统](https://img.taocdn.com/s3/m/bf7b8a02b52acfc789ebc9bb.png)
理解 Proc 文件系统Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。
尽管在各种硬件平台上的 Linux 系统的 /proc 文件系统的基本概念都是相同的,但本文只讨论基于 intel x86 架构的 Linux /proc 文件系统。
_________________ _________________ _________________/proc --- 一个虚拟文件系统/proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制(所以叫做 /proc)。
这个伪文件系统让你可以和内核内部数据结构进行交互,获取有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。
与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。
如果你察看文件 /proc/mounts (和 mount 命令一样列出所有已经加载的文件系统),你会看到其中一行是这样的:grep proc /proc/mounts/proc /proc proc rw 0 0/proc 由内核控制,没有承载 /proc 的设备。
因为 /proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。
对 /proc 进行一次 \'ls -l\' 可以看到大部分文件都是 0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。
这怎么可能?这是因为 /proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层 (VFS) 了。
然而,直到当 VFS 调用它,请求文件、目录的 i-node 的时候,/proc 文件系统才根据内核中的信息建立相应的文件和目录。
加载 proc 文件系统如果系统中还没有加载 proc 文件系统,可以通过如下命令加载 proc 文件系统:mount -t proc proc /proc上述命令将成功加载你的 proc 文件系统。
Proc文件系统
![Proc文件系统](https://img.taocdn.com/s3/m/e2a38941be1e650e52ea99a6.png)
/proc 文件系统是一种特殊的、由软件创建的文件系统,内核使用它向外界导出信息。
/proc 下面的每个文件都绑定与一个内核函数,用户读取其中的文件时,该函数动态地声称文件的内容。
我已经见过这类文件的一些输出情况,例如:/proc/modules列出的是当前载入模块的列表。
在Linux系统对/proc的使用很频繁。
现代Linux发行版中的很多工具都是通过/proc来获取它们所需要的信息,例如:ps、top、uptime等。
有些设备驱动程序也通过/proc导出信息。
我们自己的驱动程序当然也可以这么做。
因为/proc文件系统是动态的,所以驱动程序模块可以在任何时候添加或删除其中的入口项。
具有完整特征的/proc入口项可以相当复杂;在所有的这些特征当中,有一点要指出的是,这些/proc文件不仅可以用于读出数据,也可以用于写入数据。
不过,大多数时候,/proc 入口项是只读文件。
本节将只涉及简单的只读情形。
在/proc中实现文件所有使用/proc的模块必须包含</linux/proc_fs.h>,并通过这个头文件来定义正确的函数。
为创建一个只读的/proc文件,驱动程序必须实现一个函数,用于在读取文件时生成数据。
当某个进程读取这个文件时,读取请求会通过这个函数发送到驱动程序模块。
我们把注册接口放在本节后面,先直接讲这个函数。
在某个进程读取我们的/proc文件时,内核会分配一个内存页(即PAGE_SIZE字节的内存块),驱动程序可以将数据通过这个内存页返回到用户空间。
该缓冲区会传入我们定义的函数,而这个函数称为read_proc方法:Int(* read_proc)(char *page , char ** start , off_t offset , int count , int *eof , void *data)参数表中的page指针指向用来写入数据的缓冲区;函数应使用start返回实际的数据写到内存页的哪个位置;offset 和count这两个参数与read方法相同;eof 参数指向一个整数,当没有数据可返回时,驱动程序必须设置这个参数;data 参数是提供给驱动程序的专用数据指针,可用于内部记录。
国防科大操作系统全套试验
![国防科大操作系统全套试验](https://img.taocdn.com/s3/m/0a940a2fc77da26925c5b0e1.png)
wait_event_interruptible(wq,conditin);调用者挂入等待队列wq中并置为阻塞状态,有返回值:当条件condition为真时,返回0;为假时,返回值≠0。
(4)内核中与信号量相关的数据结构和函数:
}
module_init(init_addprocfile);
module_exit(exit_addprocfile);
8)编译内核模块
gcc–Wall–DLINUX–I/usr/src/linux-–c xxxx.c
9)加载模块
insmod xxxx.o
lsmod | grep xxxx
10)读/proc/procstat文件
创建文件:create_proc_entry()
创建只读文件:create_proc_read_entry()
删除文件或目录:remove_proc_entry()
读文件函数原型:int (*read_proc)(char *page……)
page是存放读出数据的缓冲区,限于一个内存页面。
写文件函数原型:int (*write_proc)(…char *buffer,…)
linux内核编译原来的系统是redhat95内核编译的内核共分为四部分编译前准备编译新内核运行新内核编译前准备1下载一份内核源代码例如linux你可在如下地址下载它或者是更新的版本
试验1:使用proc文件系统:读/proc/stat文件,计算并显示系统CPU占用率和用户态CPU占用率。(需要使用fopen(),fscanf(),printf())
# make modules开始编译外挂模块。以后重新编译内核时,可省去这一步。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我要加可个载以叫模加he载块llo,的不pr过oc要文给件我,创到建时一候
程序p工roc作_如t流e果s读t程写这(1个)文件,你就找 hello_read和hello_write
用户要 加载你 们这个 模块了
内核
hello_ hello_
init_module read write
好吧, 我同意 创建文 件。
我要写文件
程序h工ell作o 流程 (2)
用户要写文
件了,要写
的内容是 12345。怎 么办?
内核
知道了,我已 经记下来了。
hello_write
12345
程序我 h工e要ll作o读流文件这 出 h程el个 的lo(文 内m3e件 容)ss可是ag以:e:读。读
More write: 12345
创建proc文件
• 在上面的例子中,我们看到,通过编写一段 程序,在/proc目录下创建了如下内容:
一个名叫proc_test的子目录。 一个名叫current的文件,只读,读出的内容是
读它的进程的情况。
一个名叫current_too的链接,指向current。 一个名叫hello的文件,可读可写。读出的内容是
proc文件和用户的交互
• 当用户(用户态程序)写proc文件时,内核调 用预先设定的写函数。(回调)
• 写函数的例子,请看例子程序里面的 proc_write_hello函数。
• 参数2,3对我们有用,分别表示要写什么东西 进去,要写多少字节。
• 注意要用copy_from_user函数。 • global_buffer是我们用来保存数据的缓冲区。
gcc -c -I/usr/src/linux-2.4.208/include proc_test.c
• 加载这个模块。
insmod
proc_test.o
• 用lsmod命令检查是否已经加载成功。
• 如果加载不成功,请找我检查。
一个例子
• 看看是不是多了一个/proc/proc_test目 录。(输入以下两行命令)
• 请参照课件,读懂这个示例程序。 • 请注意理解上面所说的几个函数,不过
不必记住具体的格式。 • 可以自己试试再加一个proc文件,多练
习有助于你的理解。
表示所有用户都可以访问。
– 参数3:在哪个目录下创建,可以用NULL 表示在/proc下创建。
– 创建之后,还要设定读函数和写函数。
创建proc文件
• proc_symlink函数:创建一个链接文件。
– 参数1:字符串型,要创建的链接文件名。 – 参数2:在哪个目录下创建,可以用NULL表
示在/proc下创建。 – 参数3:字符串型,要链接到哪个文件。
• 看看hello文件的内容。
一个例子
• 试试写一下hello这个文件。
打开任意文本编辑器,如gedit,用编辑器打开 /proc/proc_test/hello这个文件,然后清除 里面的全部内容,再随便写一句话,保存。
• 再次看看hello文件的内容:
more hello
• 卸载模块: rmmod proc_test
的时候应该找谁处理。
– 参数5:告诉内核在找读函数的时候,顺便给它一 个指针,一般不用的话(或者你看不懂的话)就置 NULL。
创建proc文件
• create_proc_entry函数:创建一个普 通的proc文件。
– 参数1:字符串型,要创建的文件名。 – 参数2:整数型,文件的访问权限。0666
指针。
– 注意,以下几个函数都要在调用后,对返 回的proc_dir_entry结构进行设置。
创建proc文件
• create_proc_read_entry函数:创建一个只 读的proc文件。
– 参数1:字符串型,要创建的文件名。 – 参数2:整数型,文件的访问权限。 – 参数3:在哪个目录下创建。 – 参数4:读函数。告诉内核如果用户要读这个文件
操作系统课程实验 创建proc文件
2005.12
其他的proc文件
子目录/文件名 apm bus
devices driver interrupts ioports version
内容描述 高级电源管理信息 总线以及总线上的设备
可用的设备信息 已经启用的驱动程序
中断信息 端口使用信息
内核版本
proc文件系统的特点
• 每个文件都规定了严格的权限
– 是否可读?是否可写? – 哪个用户可读?哪个用户可写?
• 可以由任何文本编辑程序读取(more命令,cat 命令,vi程序,自己编的读文件程序,等等)
• 不仅可以有文件,还可以有子目录(文件夹)。 • 可以自己写程序添加一个/proc目录下的文件。
一个例子
• 编译这个模块。
上次写的内容前面加两句话。
分析这个程序
• 总体结构——五个函数
init_module (创建所有的proc文件) cleanup_module (清除所有创建的内容) proc_read_current (当需要读current文
件的内容时,由内核调用这个函数)
proc_read_hello (和上面类似) proc_write_hello (和上面类似)
proc文件和用户的交互
• 当用户(用户态程序)读proc文件时,内核调 用预先设定的读函数。
• 读函数的例子,请看例子程序里面的 proc_read_hello函数。
• 参数1,3,4对我们有用,分别表示读到哪里 去、从什么位置开始读、以及要读多少个字节 。
• 返回值:实际读出的字节数。
更多的任务?
用户要读文 件了,老大, 赶快准备一 下撒!
内核
hello_read
12345
就把我上次读 到的内容前面 加两句话,然 后交给他。
创建proc文件
• proc_mkdir函数:创建一个目录。
– 参数1:字符串,要创建的目录名。 – 参数2:在哪个目录下创建,一般用NULL
表示在/proc下创建。 – 返回值:一个指向proc_dir_entry结构的
cd /proc ls
• 看看有没有三个文件,名字叫current, current_too和hello。
cd /proc/proc_test ls
一个例子
• 看看current文件的内容:
more current
• 看看current_too文件的内容:
可以看出这个文件的内容和current差不多, 其实这个文