linux proc文件系统学习
- 格式:pdf
- 大小:113.41 KB
- 文档页数:7
linux操作系统课程学习笔记,我的Linux学习笔记·Linux操作系统基础今天的笔记主要是关于Linux操作系统根底的相关学问。
那就从我⾯前的电脑开端讲起。
计算机和操作系统计算机主要包括五个部分:运算器,控制器,存储器,输⼊设备和输出设备。
通常,运算器,控制器再加上其他⼀些部件如寄存器等构成了我们通常所说的CPU(central processing unit),存储器则主要是内存。
运算器,控制器和存储器可以实现数据的处理.但是数据从何⽽来,运算之后的结果去往哪⾥?这就需要输⼊设备和输出设备(I/O设备)。
我们通常⽤到的输⼊设备包括键盘⿏标等,输出设备为屏幕,打印机等。
值得⼀提的是,计算机中有个叫做硬盘的东西,它并不是存储器,⽽是⼀个I/O设备。
在将数据读取到内存时,它是⼀个输⼊设备;⽽将结果保存到磁盘时,它就变成了⼀个输出设备。
这么多设备整合在⼀起,就成了⼀台计算机。
它可以接收我们的指令(键盘⿏标),通过运算(CPU),把结果展⽰给我们(屏幕,硬盘等)。
但是这么多硬件是如何协调作⽤,共同完成⼀个任务⽽不会我⾏我素地乱来呢?我们需要⼀个东西,它可以控制硬件有序地⼯作,各⾃执⾏⾃⼰的任务,这个东西就是操作系统(Operating System)。
操作系统是⼀个特殊的软件,它的任务就是硬件管理—控制CPU的运算,控制内存的分配,控制计算机的⼏乎⼀切。
假如⼀台电脑没有操作系统,它可能只是⼀个艺术品,或者⼀堆废铁。
⼀个完整的操作系统包括内核和⼀些辅助软件。
内核的主要任务就是进⾏硬件管理,它是⼀个操作系统最基础最底层的东西。
内核若想很好地控制硬件并使其发挥相应的功能,需要和硬件相识相知相爱,他俩可以成为完美的⼀对,全都仰仗于驱动的帮忙。
驱动是硬件的灵魂,它向操作系统提供了访问和使⽤硬件的接⼝,以便在某项任务中最⾼效地调⽤硬件。
什么是LinuxLinux就是⼀个操作系统,它可以管理整个计算机硬件,并且可以接收我们的指令,来指挥硬件完成相应的任务,并把结果反馈给我们。
Linux中/proc目录下文件详解(2008-7-20 15:54)Linux中/proc目录下文件详解(一)--------------------------------------------------------------------------------/proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。
可以使用的文件随系统配置的变化而变化。
命令procinfo能够显示基于其中某些文件的多种系统信息。
以下详细描述/proc下的文件。
--------------------------------------------------------------------------------/proc/cmdline文件这个文件给出了内核启动的命令行。
它和用于进程的cmdline项非常相似。
示例:[root@localhost proc]# cat cmdlinero root=LABEL=/ rhgb quiet--------------------------------------------------------------------------------/proc/cpuinfo文件这个文件提供了有关系统CPU的多种信息。
这些信息是从内核里对CPU的测试代码中得到的。
文件列出了CPU的普通型号(386,486,586,686等),以及能得到的更多特定信息(制造商,型号和版本)。
文件还包含了以bogomips表示的处理器速度,而且如果检测到CPU的多种特性或者bug,文件还会包含相应的标志。
这个文件的格式为:文件由多行构成,每行包括一个域名称,一个冒号和一个值。
示例:[root@localhost proc]# cat cpuinfoprocessor : 0vendor_id : AuthenticAMDcpu family : 6model : 8model name : AMD Athlon(tm) XP 1800+stepping : 1cpu MHz : 1530.165cache size : 256 KBfdiv_bug : nohlt_bug : nof00f_bug : nocoma_bug : nofpu : yesfpu_exception : yescpuid level : 1wp : yesflags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnowbogomips : 2998.27--------------------------------------------------------------------------------/proc/devices文件这个文件列出字符和块设备的主设备号,以及分配到这些设备号的设备名称。
linux中proc详解Linux-procproc ⽂件系统在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc ⽂件系统。
最初设计的⽬的是允许更⽅便的对进程信息进⾏访问(因此得名),现在它被每⼀个有有趣的东西报告的内核使⽤,例如/proc/modules 有模块的列表/proc/meminfo 有内存使⽤的统计表。
使⽤proc ⽂件系统的⽅法和使⽤设备驱动程序⾮常相似--创建⼀个/proc ⽂件需要的所有信息的结构,包括任何处理函数的指针(在我们的例⼦中只有⼀个,当某⼈试图从/proc ⽂件读时调⽤的那⼀个)。
然后,init_module 在内核中登记该结构⽽cleanup_module 注销它。
我们使⽤proc_register_dynamic(这是在2.0 版中的情况,在2.2 版中如果我们将节点设置为0系统将⾃动为我们做到) 的原因是我们不想预先决定我们的⽂件的节点数字,⽽是为防⽌冲突⽽由内核决定它。
通常的⽂件系统存在于磁盘上⽽不是内存中(/proc 在内存中),在这中情况下,节点数是是指向⽂件的索引节点所在的磁盘位置的指针。
节点包含⽂件的信息(例如⽂件的存取权限)和指向磁盘位置或⽂件数据可以被找到的⼏个位置的指针。
因为当⽂件被打开或关闭的时候不能得到调⽤,所以在这个模块中没有地⽅放置MOD_INC_USE_COUNT 和MOD_DEC_USE_COUNT,并且,如果⽂件被打开随后模块被移除,我们没有办法避免后果。
在下⼀章我们会看到⼀个艰难的但更灵活的可以处理/proc⽂件的实现⽅式,它也可以让我们防⽌那个问题。
/os/201202/119552.htmlLinux 内核提供了⼀种通过/proc ⽂件系统,在运⾏时访问内核内部数据结构、改变内核设置的机制。
尽管在各种硬件平台上的Linux 系统的/proc ⽂件系统的基本概念都是相同的,但本⽂只讨论基于intel x86 架构的Linux /proc ⽂件系统。
Linux学习笔记⼀(⽂件和⽬录操作)1.基本shell操作命令解析器--根据命令的名字,调⽤对应的可执⾏程序shell--unix操作系统bash--Linux操作系统(⽂件系统)Linux⽂件系统的存储单元是块在磁盘上存储的时候每个⽂件都有⼀个inode--i节点,保存了⼀些⽂件信息,通过iNode找到对应的⽂件a.快捷键b.虚拟终端history--查询命令的历史记录ctrl+p == 向上的箭头,查询上⼀个命令ctrl+n == 向下的箭头,查询下⼀个命令ctrl+b 向左移动backctrl+f 向右移动forwardctrl+a 移动到⾏⾸ctrl+e 移动到⾏尾ctrl+h 刪除光标前⾯的字符ctrl+d 刪除光标覆盖的字符ctrl+u 刪除光标前⾯的所有字符ctrl+k 删除光标位置到⾏尾的字符ctrl+l或者clear命令清理屏幕c.命令和路径补齐tab智能提⽰键,按⼀次没反应说明有很多符合条件的命令,再按⼀次出现符合条件的命令列表cd ⽬录 + 连续两次tab,显⽰⽬录下⼀级的所有路径d.centos7防⽕墙操作systemctl start firewalld.service 启动systemctl enable firewalld.service 开机启动systemctl stop firewalld.service 停⽌systemctl disable firewalld.service 禁⽌开机启动systemctl status firewalld.service 查看状态firewall-cmd --state 查看状态2.Linux系统⽬录结构ls 路径(查询当前路径下的所有⽂件)/根⽬录下的⽬录说明:/bin bin是binary的缩写,这个⽬录存放着经常使⽤的命令可执⾏程序/boot 存放的是启动Linux时的⼀些核⼼⽂件,包括⼀些连接⽂件以及镜像⽂件(开机启动项)/dev 是Device(设备)的缩写,该⽬录存放的是Linux的外部设备,在Linux中访问设备的⽅式和访问⽂件的⽅式是相同的(Linux奉⾏⼀切皆⽂件,它会把所有硬件外设抽象成设备⽂件存到dev⽬录之下,⽐如⿏标键盘)/etc ⽤来存放所有系统管理所需要的配置⽂件和⼦⽬录/home ⽤户的主⽬录,在Linux中,每个⽤户都有⼀个⾃⼰的⽬录,⼀般该⽬录名是以⽤户的账号命名。
linux学习心得总结范文linux学习心得总结【1】学习Linux,应该怎样学,主要学些什么,一位Linux热心学习者,一段学习Linux的风云经验,历时十二个小时的思考总结,近十位网络Linux学习者权威肯定,为您学习Linux指明方向,学习效率,掌握程度,熟悉操作是日常学习Linux中的三大法宝。
以下是作者学习Linux的一些个人经验,供参考:1,应对Linux的发展历史和特点有所了解,Linux是抢占式多任务多用户操作系统,Linux最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具。
2,熟悉并掌握安装Linux,安装是学习的前提。
目前较常见的安装方法有二种:硬盘安装及光盘安装,清楚了解安装Linux应注意的有关问题,如安装Linux应在最后一个分区内,至少分二个分区,在系统检测不到与Linux兼容的显卡,那么此次安装就可能不支持图形化界面安装,而只能用文本模式安装等等。
3,掌握硬件配置,如显卡,声卡,网卡等,硬件只要不是太老或太新一般都能被支持,作为一名Linux系统管理员建议多阅读有关硬件配置文章,对各种不支持或支持不太好的硬件有深刻的了解。
4,熟悉系统的基本操作,Linux的图形界面直观,操作简便,多加上机练习就可熟悉操作,在Linux下学习办公软件等常用软件,永中office2004增强版安装只需要默认安装即可使用并操作大多与win系统雷同,打印机的配置和管理,记录光盘等。
5,一定要学好命令,shell是命令语言,命令解释程序及程序设计语言的统称,shell也负责用户和操作系统之间的沟通,把用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户,估shell也称为命令解释器,有关命令的学习可参考论坛相关文章,精通英文也是学习Linux的关键。
6,掌握在Linux系统中安装软件,在安装Linux工具盘后大致日常所需的软件都会有,一般网络提供下载的软件都会有安装说明。
/proc文件系统编程在Linux中有一个另外的机制来使内核及内核模块发送信息给进程——/proc文件系统。
./proc文件系统在Linux中有一个另外的机制来使内核及内核模块发送信息给进程——/proc文件系统。
/proc文件系统最初是设计使得容易得到进程的信息(从名字可以看出),现在却被任意一块有内容需要报告的内核使用,比如拥有模块列表的/proc/modules和拥有内存使用统计信息的/proc/meminfo。
使用proc文件系统的方法很象使用设备驱动——你创建一个数据结构,使之包含/proc文件需要的全部信息,包括所有函数的句柄(在我们的例子里只有一个,在试图读取/proc 文件时调用)。
然后,用init_module注册这个结构,用cleanup_module注销。
我们使用proc_register_dynamic(注3.1)的原因是我们不希望决定以后在文件中使用的索引节点数,而是让内核来决定它,为了防止冲突。
标准的文件系统是在磁盘上而不是在内存(/proc的位置在内存),在这种情况下节点数是一个指向文件的索引节点所在磁盘地址的指针。
这个索引节点包含了文件的有关信息比如文件的访问权限以及指向磁盘地址的指真或者文件数据的位置。
因为在文件打开或关闭时我们没有调用,所以在模块里无处可放宏MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT,而且如果文件被打开了或者模块被删除了,就没有办法来避免这个结果。
下一章我们将会看到一个更困难的处理/proc的方法,但是也更加灵活,也能够解决这个问题。
ex procfs.c/* procfs.c - create a "file" in /proc* Copyright (C) 1998-1999 by Ori Pomerantz*//* The necessary header files *//* Standard in kernel modules */#include <linux/kernel.h> /* We're doing kernel work */#include <linux/module.h> /* Specifically, a module *//* Deal with CONFIG_MODVERSIONS */#if CONFIG_MODVERSIONS==1#define MODVERSIONS#include <linux/modversions.h>#endif/* Necessary because we use the proc fs */#include <linux/proc_fs.h>/* In 2.2.3 /usr/include/linux/version.h includes a* macro for this, but 2.0.35 doesn't - so I add it* here if necessary. */#ifndef KERNEL_VERSION#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c)) #endif/* Put data into the proc fs file.Arguments=========1. The buffer where the data is to be inserted, ifyou decide to use it.2. A pointer to a pointer to characters. This isuseful if you don't want to use the bufferallocated by the kernel.3. The current position in the file.4. The size of the buffer in the first argument.5. Zero (for future use?).Usage and Return Value======================If you use your own buffer, like I do, put itslocation in the second argument and return the number of bytes used in the buffer.A return value of zero means you have no further information at this time (end of file). A negativereturn value is an error condition.For More Information====================The way I discovered what to do with this function wasn't by reading documentation, but by reading the code which used it. I just looked to see what usesthe get_info field of proc_dir_entry struct (I used a combination of find and grep, if you're interested),and I saw that it is used in /fs/proc/array.c.If something is unknown about the kernel, this is usually the way to go. In Linux we have the great advantage of having the kernel source code for free - use it.*/int procfile_read(char *buffer,char **buffer_location,off_t offset,int buffer_length,int zero){int len; /* The number of bytes actually used *//* This is static so it will still be in memory* when we leave this function */static char my_buffer[80];static int count = 1;/* We give all of our information in one go, so if the * user asks us if we have more information the* answer should always be no.** This is important because the standard read* function from the library would continue to issue * the read system call until the kernel replies* that it has no more information, or until its* buffer is filled.*/if (offset > 0)return 0;/* Fill the buffer and get its length */len = sprintf(my_buffer,"For the %d%s time, go away! ", count,(count % 100 > 10 && count % 100 < 14) ? "th" : (count % 10 == 1) ? "st" :(count % 10 == 2) ? "nd" :(count % 10 == 3) ? "rd" : "th" );count++;/* Tell the function which called us where the* buffer is */*buffer_location = my_buffer;/* Return the length */return len;}struct proc_dir_entry Our_Proc_File ={0, /* Inode number - ignore, it will be filled by* proc_register[_dynamic] */4, /* Length of the file name */"test", /* The file name */S_IFREG | S_IRUGO, /* File mode - this is a regular * file which can be read by its* owner, its group, and everybody* else */1, /* Number of links (directories where the* file is referenced) */0, 0, /* The uid and gid for the file - we give it* to root */80, /* The size of the file reported by ls. */NULL, /* functions which can be done on the inode * (linking, removing, etc.) - we don't* support any. */procfile_read, /* The read function for this file,* the function called when somebody* tries to read something from it. */NULL /* We could have here a function to fill the* file's inode, to enable us to play with* permissions, ownership, etc. */};/* Initialize the module - register the proc file */int init_module(){/* Success if proc_register[_dynamic] is a success,* failure otherwise. */#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0) /* In version 2.2, proc_register assign a dynamic* inode number automatically if it is zero in the* structure , so there's no more need for* proc_register_dynamic*/return proc_register(&proc_root, &Our_Proc_File);#elsereturn proc_register_dynamic(&proc_root, &Our_Proc_File); #endif/* proc_root is the root directory for the proc* fs (/proc). This is where we want our file to be* located.*/}/* Cleanup - unregister our file from /proc */void cleanup_module(){proc_unregister(&proc_root, Our_Proc_File.low_ino);}。
proc⽂件系统下,创建⽂件和⽂件夹proc_mkdir()proc_create()proc_create的使⽤⽅法proc⽂件系统是个有⽤的东东。
创建⼀个proc虚拟⽂件,应⽤层通过读写该⽂件,即可实现与内核的交互。
proc虚拟⽂件是如何创建的呢?先看看⽐较简单的,创建proc⽂件夹。
调⽤以下函数,即可实现proc⽂件夹的创建:struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);name就是要创建的⽂件夹名称。
parent是要创建节点的⽗节点。
也就是要在哪个⽂件夹之下创建新⽂件夹,需要将那个⽂件夹的proc_dir_entry传⼊。
如果是在/proc⽬录下创建⽂件夹,parent为NULL。
例如:struct proc_dir_entry *mytest_dir = proc_mkdir("mytest", NULL);然后来看看proc⽂件的创建。
创建⽅法是调⽤以下函数:static inline struct proc_dir_entry *proc_create(const char *name, mode_t mode,struct proc_dir_entry *parent, const struct file_operations *proc_fops);name就是要创建的⽂件名。
mode是⽂件的访问权限,以UGO的模式表⽰。
parent与proc_mkdir中的parent类似。
也是⽗⽂件夹的proc_dir_entry对象。
proc_fops就是该⽂件的操作函数了。
例如:struct proc_dir_entry *mytest_file = proc_create("mytest", 0x0644, mytest_dir, mytest_proc_fops);还有⼀种⽅式:struct proc_dir_entry *mytest_file = proc_create("mytest/mytest", 0x0644, NULL, mytest_proc_fops);如果⽂件夹名称和⽂件名定义为常量:#define MYTEST_PROC_DIR "mytest"#define MYTEST_PROC_FILE "mytest"第⼆种⽅式为:struct proc_dir_entry *mytest_file = proc_create(MYTEST_PROC_DIR"/"MYTEST_PROC_FILE, 0x0644, NULL, mytest_proc_fops);接下来看看mytest_proc_fops的定义。
随着Linux的不断发展,越来越多的人开始使用Linux,对于那些刚刚接触的人来说,恐怕最先感到困惑的就是那些“不明不白”的目录了。
如果想熟练使用Linux,让Linux听命于自己,就必须掌握这些目录,下面就以Xteam公司的最新产品——XteamLinux 4.0为例,介绍一下在该系统下的目录。
/bin bin是Binary的缩写。
这个目录存放着最经常使用的命令。
/boot这里存放的是启动Linux时使用的一些核心文件,包括一些链接文件以及镜像文件。
/dev dev是Device(设备)的缩写。
该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。
/etc这个目录用来存放所有的系统管理所需要的配置文件和子目录。
/home用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
/lib这个目录里存放着系统最基本的动态链接共享库,其作用类似于Windows里的DLL文件。
几乎所有的应用程序都需要用到这些共享库。
/lost+found这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
/mnt在这里面中有四个目录,系统提供这些目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/cdrom上,然后进入该目录就可以查看光驱里的内容了。
/proc这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 >; /proc/sys/net/ipv4/icmp_echo_ignore_all。
/root该目录为系统管理员,也称作超级权限者的用户主目录。
/sbin s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
第一阶段Linux系统管理与编程基础1. 嵌入式系统概述2. Linux介绍2. Linux定制安装3. Linux命令详解1. Linux系统管理2. Shell 编程3. Shell 编程综合实例-qcd1. GCC程序编译2. GDB程序调试3. Makefile 工程管理第二阶段应用程序设计1. Linux文件编程(系统调用)2. Linux文件编程(库函数)3. Linux时间编程1. Linux 进程基础2. Linux多进程程序设计1. 进程间通讯概述2. 管道通讯3. 信号通讯4. 共享内存通讯1. 消息队列通讯2. 信号灯1. Linux线程基础2. Linux线程创建3. Linux线程等待4. Linux线程清除1. IP协议分析2. TCP协议分析3. UDP协议分析4. TCP通讯程序设计5. UDP通讯程序设计6. 并发服务器模型7. 多路复用第三阶段ARM程序设计1. ARM处理器概述2. ARM处理器工作模式3. ARM系统寄存器4. ARM寻址方式5. ARM 汇编指令集6. ARM环境C语言编程7. ADS集成开发环境1. LED程序设计2. ARM中断与异常3. S3c2440 GPIO4. 按键程序设计5. 串口程序设计第四阶段Linux内核开发1. Linux内核简介2. Linux内核源代码结构3. Linux内核配置与裁剪4. Linux内核模块开发5. Linux内核启动流程1. 嵌入式Linux产品开发流程2. 交叉工具链3. Bootloader介绍4. U-Boot介绍5. U-Boot命令6. U-Boot工作原理7. U-Boot移植1. 嵌入式Linux内核制作2. 根文件系统制作3. 嵌入式文件系统介绍1. Linux内存管理2. Linux进程地址空间3. Linux内核地址空间4. Linux内核链表5. Linux内核定时器1. Linux进程控制2. Linux进程调度3. Linux系统调用4. Proc文件系统5. Linux内核异常分析第五阶段Linux驱动程序设计1.Linux驱动简介2.字符设备驱动程序设计3.驱动调试技术4. 并发与竞态1.Ioctl型驱动2.内核等待队列3. 阻塞型驱动程序设计4.Poll 设备操作1.Mmap设备操作2. 硬件访问3. 混杂设备驱动4. LED驱动程序设计1. Linux总线、设备、驱动模型2. Linux platform驱动3. 中断处理4. 按键驱动程序1.Linux网络体系架构2. Linux网卡驱动程序设计3. Dm9000网卡驱动程序分析4. 触摸屏驱动程序设计1. PCI驱动程序设计2. 串口驱动程序设计深入专题—SUB系统开发1. USB简介2. USB系统架构3. USB设备逻辑结构4. USB描述符5. USB传输6. USB枚举1. Linux USB系统架构2. Mass Storage3. USB HID4. RNDIS5. CDC/ACM1. USB驱动程序模型2. Linux USB描述符3. URB4. USB鼠标驱动程序详解深入专题—H。
linux proc 程序例子
在Linux系统中,/proc目录是一个虚拟文件系统,它提供了关于系统内核和运行中进程的信息。
这个目录中包含了大量的文件和子目录,其中的每一个文件和子目录都代表了一个系统内核的属性或者一个正在运行的进程。
下面是一个关于/proc目录下的一些文件和子目录的例子:
1. /proc/cpuinfo,这个文件包含了关于CPU的信息,比如CPU型号、速度、缓存大小等。
可以使用cat命令来查看这个文件的内容。
2. /proc/meminfo,这个文件包含了关于内存的信息,比如总内存量、空闲内存量、内存使用情况等。
同样可以使用cat命令来查看这个文件的内容。
3. /proc/loadavg,这个文件包含了系统的负载平均值,可以通过查看这个文件来了解系统的负载情况。
4. /proc/PID目录,在这里,PID代表一个正在运行的进程的ID。
在这个目录下可以找到关于该进程的很多信息,比如进程的状
态、命令行参数、内存使用情况等。
这些只是/proc目录下的一小部分文件和子目录的例子。
通过查看这些文件和子目录,我们可以获取关于系统内核和正在运行的进程的各种信息,这对于系统管理和性能调优非常有帮助。
proc_create 例子乃开源社区被用于Linux 内核的标准的设备驱动模型。
'):def proc_create可创建proc文件,在/proc文件系统下,并允许用户通过读取和写入文件来与驱动进行通信。
进程创建时,通过调用proc_create来创建与其相关的文件。
该文件的创建在文件系统的代码块中执行,并且会触发open()和release()方法。
其格式如下:struct proc_dir_entry *proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops)下面,我们将详细了解如何使用proc_create函数来创建proc文件。
首先,让我们了解一下proc文件系统。
在Linux内核中,proc文件系统是一个虚拟文件系统,与其他文件系统(如ext4)不同,proc文件系统不存储在磁盘上。
它是在内存中创建的,并且只存在于内核的运行时环境中。
proc 文件系统提供了一种机制,通过读取和写入虚拟文件来与内核进行通信。
这些文件可以被用于访问和调整内核的状态和参数,或者用于获取关于系统和进程的信息。
接下来,让我们看一下如何使用proc_create函数来创建proc文件。
首先,我们需要定义一个file_operations结构体,其中包含了我们要定义的文件的操作。
这个结构体通常包含读取和写入文件的函数指针,以及其他与操作相关的函数指针。
下面是一个简单的示例:cstatic ssize_t myread(struct file *file, char __user *buffer, size_t count, loff_t *ppos){读取文件逻辑的实现}static ssize_t mywrite(struct file *file, const char __user *buffer, size_t count, loff_t *ppos){写入文件逻辑的实现}static const struct file_operations myops = {.owner = THIS_MODULE,.read = myread,.write = mywrite,};在上面的示例中,我们定义了一个名为myops的file_operations结构体,并将myread和mywrite函数分别指定为读取和写入文件的操作。
#if defined (CONFIG_RALINK_RT3052) || defined (CONFIG_RALINK_RT3352)static u32 raeth_sw_port_link = 0;static irqreturn_t esw_interrupt(int irq, void *dev_id){unsigned long flags;unsigned long reg_int_val;struct net_device *dev = (struct net_device *) dev_id;static u32 stat;u32 stat_curr;END_DEVICE *ei_local = netdev_priv(dev);spin_lock_irqsave(&(ei_local->page_lock), flags);reg_int_val = (*((volatile u32 *)(RALINK_ETH_SW_BASE))); //Interrupt Status Registerif (reg_int_val & PORT_ST_CHG) {printk("RT305x_ESW: Link Status Changed\n");stat_curr = *((volatile u32 *)(RALINK_ETH_SW_BASE+0x80));raeth_sw_port_link = (stat_curr>>25)&0x1f;#ifdef CONFIG_WAN_AT_P0//if Port0 link down --> link upif ((stat & (1<<25)) || !(stat_curr & (1<<25)))#else//if Port4 link down --> link upif ((stat & (1<<29)) || !(stat_curr & (1<<29)))#endifgoto out;schedule_work(&ei_local->kill_sig_wq);out:stat = stat_curr;}sysRegWrite(RALINK_ETH_SW_BASE, reg_int_val);spin_unlock_irqrestore(&(ei_local->page_lock), flags);return IRQ_HANDLED;}static int raeth_port_read_proc(char* page, char ** start, off_t off, int count, int* eof, void * data){int n;n = sprintf(page, "%d %d %d %d %d\n",(raeth_sw_port_link>>4)&1,(raeth_sw_port_link>>3)&1,(raeth_sw_port_link>>2)&1,(raeth_sw_port_link>>1)&1,(raeth_sw_port_link>>0)&1);*eof=1;return n;}/* Read in debug from userland */static int raeth_port_write_proc(struct file* file, const char* buffer, unsigned long count, void *data){return 0;}static void raeth_port_init_proc(void){struct proc_dir_entry* entry;entry = create_proc_entry("raeth_port", 0644, init_net.proc_net);entry->read_proc = raeth_port_read_proc;entry->write_proc = raeth_port_write_proc;}#endif#if defined (CONFIG_RALINK_RT3052) || defined (CONFIG_RALINK_RT3352) raeth_port_init_proc();#endif#if defined (CONFIG_RALINK_RT3052) || defined (CONFIG_RALINK_RT3352) remove_proc_entry("raeth_port", init_net.proc_net);#endif####################使用proc文件系统By: 潘云登Date: 2009-5-23Email: intrepyd@Homepage: /intrepydCopyright: 该文章版权由潘云登所有。
linux proc文件系统学习目录:/proc --- 一个虚拟文件系统加载 proc 文件系统察看 /proc 的文件得到有用的系统/内核信息有关运行中的进程的信息通过 /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 文件系统。
更多细节请阅读 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/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 6 cpu MHz : 1000.119 cache size : 256 KB fdiv_bug : no hlt_bug : no sep_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr xmm bogomips : 1998.85 processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 6 cpu MHz : 1000.119 cache size : 256 KB fdiv_bug : no hlt_bug : no sep_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr xmm bogomips : 1992.29这是一个从双 CPU 的系统中得到的结果,上述大部分的信息十分清楚地给出了这个系统的有用的硬件信息。
有些 /proc 的文件是经过编码的,不同的工具可以被用来解释这些编码过的信息并输出成可读的形式。
这样的工具包括:'top', 'ps', 'apm' 等。
四.得到有用的系统/内核信息proc 文件系统可以被用于收集有用的关于系统和运行中的内核的信息。
下面是一些重要的文件:/proc/cpuinfo - CPU 的信息(型号, 家族, 缓存大小等)/proc/meminfo - 物理内存、交换空间等的信息/proc/mounts - 已加载的文件系统的列表/proc/devices - 可用设备的列表/proc/filesystems - 被支持的文件系统/proc/modules - 已加载的模块/proc/version - 内核版本/proc/cmdline - 系统启动时输入的内核命令行参数proc 中的文件远不止上面列出的这么多。
想要进一步了解的读者可以对/proc 的每一个文件都'more'一下或读参考文献[1]获取更多的有关 /proc 目录中的文件的信息。
我建议使用'more'而不是'cat',除非你知道这个文件很小,因为有些文件(比如 kcore) 可能会非常长。
五.有关运行中的进程的信息/proc 文件系统可以用于获取运行中的进程的信息。
在 /proc 中有一些编号的子目录。
每个编号的目录对应一个进程 id (PID)。
这样,每一个运行中的进程/proc 中都有一个用它的 PID 命名的目录。
这些子目录中包含可以提供有关进程的状态和环境的重要细节信息的文件。
让我们试着查找一个运行中的进程。
$ ps -aef | grep mozilla root 32558 32425 8 22:53 pts/1 00:01:23 /usr/bin/mozilla 上述命令显示有一个正在运行的 mozilla 进程的 PID 是 32558。
相对应的,/proc中应该有一个名叫 32558 的目录$ ls -l /proc/32558 total 0 -r--r--r-- 1 root root 0 Dec 25 22:59 cmdline -r--r--r-- 1 root root 0 Dec 25 22:59 cpu lrwxrwxrwx 1 root root0 Dec 25 22:59 cwd -> /proc/ -r-------- 1 root root 0 Dec 25 22:59 environ lrwxrwxrwx 1 root root 0 Dec 25 22:59 exe -> /usr/bin/mozilla* dr-x------ 2 root root 0 Dec 25 22:59 fd/ -r--r--r-- 1 root root 0 Dec 25 22:59 maps -rw------- 1 root root0 Dec 25 22:59 mem -r--r--r-- 1 root root 0 Dec 25 22:59 mounts lrwxrwxrwx 1 root root 0 Dec 25 22:59 root -> // -r--r--r-- 1 root root 0 Dec 25 22:59 stat -r--r--r-- 1 root root 0 Dec 25 22:59 statm -r--r--r-- 1 root root 0 Dec 25 22:59 status 文件"cmdline" 包含启动进程时调用的命令行。
"envir" 进程的环境变量。
"status" 是进程的状态信息,包括启动进程的用户的用户ID (UID) 和组ID(GID) ,父进程ID (PPID),还有进程当前的状态,比如"Sleelping"和"Running"。
每个进程的目录都有几个符号链接,"cwd"是指向进程当前工作目录的符号链接,"exe"指向运行进程的可执行程序,"root"指向被这个进程看作是根目录的目录(通常是"/")。
目录"fd"包含指向进程使用的文件描述符的链接。
"cpu"仅在运行 SMP 内核时出现,里面是按 CPU 划分的进程时间。
/proc/self 是一个有趣的子目录,它使得程序可以方便地使用 /proc 查找本进程地信息。
/proc/self 是一个链接到 /proc 中访问 /proc 的进程所对应的 PID 的目录的符号链接。
六.通过 /proc 与内核交互上面讨论的大部分 /proc 的文件是只读的。
而实际上 /proc 文件系统通过/proc 中可读写的文件提供了对内核的交互机制。
写这些文件可以改变内核的状态,因而要慎重改动这些文件。
/proc/sys 目录存放所有可读写的文件的目录,可以被用于改变内核行为。
/proc/sys/kernel - 这个目录包含反通用内核行为的信息。
/proc/sys/kernel/{domainname, hostname} 存放着机器/网络的域名和主机名。