linux内核模块编程-proc文件系统

zhangyifei216 zhangyifei216     2022-12-03     525

关键词:

什么是proc

proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

来自于百度百科

使用proc在内核态和用户态传递数据

创建proc的条目

通过内核提供的API,可以很方便的在proc目录下创建一个文件

create_proc_entry
通过这个函数就可以创建一条proc文件或者目录,返回的是一个struct proc_dir_entry结构
这个函数有三个参数:
1.proc条目的名称
2.proc条目的权限
3.要创建的proc条目的根目录,如果为NULL,那么就是相对于/proc这个目录来创建

内核模块的初始化,创建proc entry

struct proc_dir_entry *Our_Proc_File;
int init_module(void)

    int rv = 0;
    //创建了一个形如/proc/test1 权限是0644
    Our_Proc_File = create_proc_entry("test1",0644,NULL);
    //设置对proc条目读取的方法和权限,uid,gid size等信息。
    Our_Proc_File->read_proc = procfile_read;
    Our_Proc_File->mode = S_IFREG | S_IRUGO;
    Our_Proc_File->uid = 0;
    Our_Proc_File->gid = 0;
    Our_Proc_File->size = 37; //大小可以随便设置,proc文件是不占用大小的
    printk(KERN_INFO "Trying to craete /proc/test1:\\n");
    if(Our_Proc_File == NULL) 
        rv = -ENOMEM;
        remove_proc_entry("test1",NULL);//移除proc条目
        printk(KERN_INFO "Error: Could not initialize /proc/test1\\n");
     else 
        printk(KERN_INFO "Success!\\n");
       
    return rv; 

注销内核模块,移除proc entry

void cleanup_module(void)

    remove_proc_entry("test1",NULL);
    printk(KERN_INFO "/proc/test1 removed\\n");

操作proc

在创建proc entry的时候,指定了读proc的方法,其实现如下:

//proc文件读,函数原型是固定的,参考proc_dir_entry这个结构体即可
int procfile_read(char *buffer,char** buffer_location,off_t offset,
                int buffer_length,int *eof,void *data)

    int len = 0;
    static int count = 1;
    printk(KERN_INFO "inside /proc/test1 :procfile_read\\n");

    if(offset > 0) 
        printk(KERN_INFO "offset %d: /proc/test1: profile_read,\\
            wrote %d Bytes\\n",(int)(offset),len);
        *eof = 1;
        return len;
    
    //填充buffer并获取其长度
    len = sprintf(buffer,
             "For the %d %s time,go away!\\n",count,
              (count % 100 > 10 && count % 100 < 14)?"th":
              (count % 10 == 1)?"st":
              (count % 10 == 2)?"nd":
              (count % 10 == 3)?"rd":"th");
    count++;
    printk(KERN_INFO "leasving /proc/test1: profile_read,wrote %d Bytes\\n",len);
    return len;

测试proc

编写Makefile进行编译,Makefile的编写可以参考我的Linux内核模块编程-HelloWorld

insmod procfs.ko //插入内核模块
[root@localhost kernel_module]# ls -al /proc/test1 
-r--r--r--. 1 root root 37 Apr 26 10:37 /proc/test1
[root@localhost kernel_module]# cat /proc/test1 
For the 1 st time,go away!

linux系统的/proc目录

1./proc目录Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作... 查看详情

linux文件管理之proc文件系统

...================================================================Linux 内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以... 查看详情

系统性能调优学习笔记03

...proc文件系统proc文件系统是一个伪文件系统,它提供了到内核数据结构的接口,内核在引导时将proc文件系统挂载到/proc目录上。/proc目录中的文件具有与它们所引用的参数相匹配的权限,例如对于静态信息是只读的,对于可配置... 查看详情

shell笔记3

...询当前系统被加载模块Linux系统包含的信息:文件系统,内核模块,硬件信息,启动参数等。proc文件系统:访问系统内核信息(1)proc 查看详情

linux下proc文件接口详解

...是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。​基于/pr... 查看详情

内核模块的配置文件

】内核模块的配置文件【英文标题】:configurationfileforkernelmodule【发布时间】:2019-05-1814:05:20【问题描述】:我学习如何编写linux内核驱动程序,现在我想给用户空间的用户改变我的模块(或任何其他子系统/模块)的行为的可能... 查看详情

linux操作系统中,加载和删除内核模块的命令是啥。

...odules文件中列出。使用lsmod命令也可显示相同内容。4、在内核中有一个“Automatickernelmoduleloading"功能被编译到了内核中。当用户尝试打开某类型的文件时,内核会根据需要尝试加载相应的模块。/etc/modules.conf或/etc/modprobe.conf文... 查看详情

详解linux系统下/proc文件夹目录

...件夹。详解linux系统下/proc文件夹目录内容1./proc目录Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结 查看详情

手机中proc文件夹的作用,能删吗

...这个文件夹走什么作用,能删除吗参考技术Aproc目录Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以... 查看详情

linux内核可加载模块编程简单入门(代码片段)

1.linux源代码结构fs:filesystem文件系统,usr/src/linux:linux内核头文件,mm:内存管理代码   2.下载linux内核代码 可自己选择版本,这里是比较老的版本适合小白入手(eg:我用的是0.1x,点击直接下载即可) http://oldlinux.org/Linux.ol... 查看详情

用户空间和内核空间通讯之proc文件系统

今天我们介绍还有一种用户内核空间通信的方法:proc文件系统。 proc文件系统作为linux提供的一种虚拟文件系统并不占用实际外围存储空间,它仅存在于内存中。系统断电即消失。proc文件系统最開始的设计主要是为满足内核向用... 查看详情

proc文件系统在内核中的表现

当Linux内核启动起来之后,我们可以通过proc虚拟文件系统来查看内的中的一些动态信息。例如:可以cat /proc/misc 来查看系统中装载的所有misc类设备cat /proc/devices 来查看系统中装载的字符设备和块设备 但是需要... 查看详情

用户空间和内核空间通讯之proc文件系统

今天我们介绍另一种用户内核空间通信的方法:proc文件系统。proc文件系统作为linux提供的一种虚拟文件系统并不占用实际外围存储空间,它仅存在于内存中,系统断电即消失。proc文件系统最开始的设计主要是为满足... 查看详情

linux学习-linux系统及编程基础笔记(代码片段)

...录:①/boot:存放系统引导时所需的文件,包括Linux内核以及引导装载程序(bootloader)等。②/bin(binary):存放可执行程序。③/dev(device):存放设备文件和特殊文件。④/etc:存放系统配置文件。⑤/home:普通用户的主目录所在位置。... 查看详情

linux目录--proc详解

...tdevetchomeliblib64mediamntoptprocrootrunsbinsrvsystmpusrvarproc简介Linux内核提供了一种进程信息虚拟文件系统(Processinformationvirtualfilesystem),简称proc,通过proc这个虚拟的文件系统,可以在运行时访问内核(core)内部数据结构、 查看详情

linux驱动开发-proc接口介绍(代码片段)

...件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行 查看详情

notes16proc文件系统,内存分配,数据类型(代码片段)

文章目录1.创建proc文件系统接口:之前调试内核时都是通过prink打印内核信息,通过dmesg查看输出的信息。新调试方法:利用proc文件系统在pro文件夹下创建接口,读写这个接口就可实现对内核的调试2.内核内存分配... 查看详情

linux系统重要的子目录

...oot登录/etc/login.defs所有用户登录的缺省配置/etc/modprobe.conf内核模块额外参数设定/etc/rsyslog.conf日志设置文件/var下的重要路径知识/var日志文件/var/log各种系统日志存放地/var/log/messages系统信息的默认日志文件,按周轮询/var/log/se... 查看详情