proc文件系统

本文介绍了Proc文件系统的概念及其用途,包括如何通过Proc获取系统信息及修改内核参数。此外,还详细讲解了Proc文件系统的创建与删除过程以及相关的重要目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

proc文件系统
   proc文件系统是一个虚拟文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过 proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
   cpuinfo,它标识了处理器的类型和速度;pci,显示在 PCI 总线上找到的设备;modules,标识了当前加载到内核中的模块。三个很重要的目录:net,scsi和sys。Sys目录是可写的,可以通过它来访问或修改内核的参数(见下一部分),而net和scsi则依赖于内核配置。一些以数字命名的目录,它们是进程目录。
   
创建并删除 /proc项:要在 /proc 文件系统中创建一个虚拟文件,请使用 create_proc_entry 函数。要从 /proc 中删除一个文件,可以使用 remove_proc_entry 函数。
struct proc_dir_entry *create_proc_entry( const char *name, mode_t mode,
                                             struct proc_dir_entry *parent );
struct proc_dir_entry {
    const char *name;            // virtual file name
    mode_t mode;                // mode permissions
    uid_t uid;                // File's user id
    gid_t gid;                // File's group id
    struct inode_operations *proc_iops;    // Inode operations functions
    struct file_operations *proc_fops;    // File operations functions
    struct proc_dir_entry *parent;        // Parent directory
    ...
    read_proc_t *read_proc;            // /proc read function
    write_proc_t *write_proc;        // /proc write function
    void *data;                // Pointer to private data
    atomic_t count;                // use count
    ...
};
void remove_proc_entry( const char *name, struct proc_dir_entry *parent );

proc_dir_entry 快捷变量
proc_dir_entry            在文件系统中的位置
proc_root_fs            /proc
proc_net            /proc/net
proc_bus            /proc/bus
proc_root_driver    /proc/driver

回调函数
我们可以使用 write_proc 函数向 /proc 中写入一项。这个函数的原型如下:
int mod_write( struct file *filp, const char __user *buff,
               unsigned long len, void *data );
filp 参数实际上是一个打开文件结构(我们可以忽略这个参数)。buff 参数是传递给您的字符串数据。缓冲区地址实际上是一个用户空间的缓冲区,因此我们不能直接读取它。len 参数定义了在 buff 中有多少数据要被写入。data 参数是一个指向私有数据的指针。在这个模块中,我们声明了一个这种类型的函数来处理到达的数据。
Linux 提供了一组 API 来在用户空间和内核空间之间移动数据。对于 write_proc 的情况来说,我们使用了 copy_from_user 函数来维护用户空间的数据。

读回调函数
使用 read_proc 函数从一个 /proc 项中读取数据(从内核空间到用户空间)。这个函数的原型如下:
int mod_read( char *page, char **start, off_t off,
              int count, int *eof, void *data );
page 参数是这些数据写入到的位置,其中 count 定义了可以写入的最大字符数。在返回多页数据(通常一页是 4KB)时,我们需要使用 start 和 off 参数。当所有数据全部写入之后,就需要设置 eof(文件结束参数)。与 write 类似,data 表示的也是私有数据。此处提供的 page 缓冲区在内核空间中。因此,我们可以直接写入,而不用调用 copy_to_user。

其他有用的函数
我们还可以使用 proc_mkdir、symlinks 以及 proc_symlink 在 /proc 文件系统中创建目录。对于只需要一个 read 函数的简单 /proc 项来说,可以使用 create_proc_read_entry,这会创建一个 /proc 项,并在一个调用中对 read_proc 函数进行初始化。

/* Create a directory in the proc filesystem */
struct proc_dir_entry *proc_mkdir( const char *name,struct proc_dir_entry *parent );  /* Create a symlink in the proc filesystem */
struct proc_dir_entry *proc_symlink( const char *name,
                                       struct proc_dir_entry *parent,
                                       const char *dest );                /* Create a proc_dir_entry with a read_proc_t in one call */
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 );               /* Copy buffer to user-space from kernel-space */
unsigned long copy_to_user( void __user *to,
                              const void *from,
                              unsigned long n );     /* Copy buffer to kernel-space from user-space */
unsigned long copy_from_user( void *to,
                                const void __user *from,
                                unsigned long n );     /* Allocate a 'virtually' contiguous block of memory */
void *vmalloc( unsigned long size );    /* Free a vmalloc'd block of memory */
void vfree( void *addr );     /* Export a symbol to the kernel (make it visible to the kernel) */
EXPORT_SYMBOL( symbol );   /* Export all symbols in a file to the kernel (declare before module.h) */
EXPORT_SYMTAB

参考文献

    问题:   如何编译生成模块? 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值