深入Linux内核--无持久存储的文件系统

proc文件系统是Linux内核提供的一种虚拟文件系统,用于动态生成系统信息。它包括内存管理、进程数据、系统信息、网络详情、控制参数等。文章详细介绍了/proc目录的内容,如进程状态、系统控制参数、网络信息,并探讨了数据结构、inode、文件系统初始化、读写操作等。同时,简要概述了简单的文件系统、sysfs文件系统及其在系统控制和设备管理中的作用。
摘要由CSDN通过智能技术生成

proc文件系统

proc文件系统是一种虚拟的文件系统,其信息不能从块设备读取。只有在读取文件内容时,才动态生成相应的信息。

/proc的内容

内存管理

系统进程的特征数据

文件系统

设备驱动程序

系统总线

电源管理

终端

系统控制参数

特定于进程的数据

cmdline:用于启动进程的命令行(用0作为分隔符,而不是空格)

environ表示为该程序设置的所有环境变量

maps以文本形式,列出了进程使用的所有库的内存映射。

status包含了有关进程状态的一般信息(不仅提供了有关UID/GID及进程其他信息,还包括内存分配,进程能力,各个信号掩码的状态)

stat和statm以一连串数字的形式,提供了进程及其内存消耗的更多状态信息。

fd:各个文件描述符,可以通过(ls -l),查看其文件的位置

cwd指向进程当前工作目录

exe指向包含了应用程序代码的二进制文件。

root指向进程的根目录。(不见得是全局的根目录)

一般性系统信息

与特定的内核子系统无关的一般性信息,一般存放在/proc下的文件中。

kcore是一个动态的内核文件,包含了运行中的内核的所有数据,即主内存的全部内容。与用户应用程序发生致命错误时内存转存所产生的普通内核文件相比,该文件没什么不同之处。可以将调试器用于该二进制文件,来查看运行中系统的当前状态。

网络信息

/proc/net子目录提供了内核的各种网络选项的有关数据

系统控制参数

/proc/sys/

数据结构

proc数据项的表示

proc文件系统中的每个数据项都由proc_dir_entry的一个实例描述,该结构定义了如下:

struct proc_dir_entry {
    unsigned int low_ino;//inode编号
    unsigned short namelen;
    const char *name;
    mode_t mode;
    nlink_t nlink;
    uid_t uid;//指定了目录中子目录和符号链接的数目
    gid_t gid;
    loff_t size;
    const struct inode_operations *proc_iops;
    /*
     * NULL ->proc_fops means "PDE is going away RSN" or
     * "PDE is just created". In either case, e.g. ->read_proc won't be
     * called because it's too late or too early, respectively.
     *
     * If you're allocating ->proc_fops dynamically, save a pointer
     * somewhere.
     */
    const struct file_operations *proc_fops;
    get_info_t *get_info;//指向相关子系统返回所需数据的例程
    struct module *owner;
    struct proc_dir_entry *next, *parent, *subdir;//parent:指向父目录的指针,subdir:指向一个目录中的第一个子数据项,next:将目录下的所有常见数据项都集成到一个单链表中
    void *data;//作为read_proc,write_proc的参数传递
    read_proc_t *read_proc;//指向的函数支持从内核读取数据
    write_proc_t *write_proc;//指向的函数支持向内核写入数据
    atomic_t count;     /* use count */
    int pde_users;  /* number of callers into module in progress */
    spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
    struct completion *pde_unload_completion;
    shadow_proc_t *shadow_proc;
};
typedef int (read_proc_t)(char *page, char **start, off_t off,
              int count, int *eof, void *data);
typedef int (write_proc_t)(struct file *file, const char __user *buffer,
               unsigned long count, void *data);

proc inode

内核提供了一个数据结构,称之为proc_inode,支持以面向inode的方式来查看proc文件系统的数据项。

<linux/proc_fs.h>
union proc_op {
    int (*proc_get_link)(struct inode *, struct dentry **, struct vfsmount **);//获得特定于进程的信息
    int (*proc_read)(struct task_struct *task, char *page);//在虚拟文件系统中建立链接
};
struct proc_inode {
    struct pid *pid;
    int fd;
    union proc_op op;
    struct proc_dir_entry *pde;
    struct inode vfs_inode;
};

初始化

<fs/proc/root.c>
void __init proc_root_init(void)
{
    int err = proc_init_inodecache();//为proc_inode对象创建一个slab缓存
    if (err)
        return;
    err = register_filesystem(&proc_fs_type);//注册文件系统
    if (err)
        return;
    proc_mnt = kern_mount_data(&proc_fs_type, &init_pid_ns);//挂载文件系统
    err = PTR_ERR(proc_mnt);
    if (IS_ERR(proc_mnt)) {
        unregister_filesystem(&proc_fs_type);
        return;
    }
    proc_misc_init();//创建proc主目录中的各种文件项
    proc_net_init();
#ifdef CONFIG_SYSVIPC
    proc_mkdir("sysvipc", NULL);
#endif
    proc_root_fs = proc_mkdir("fs", NULL);
    proc_root_driver = proc_mkdir("driver", NULL);
    proc_mkdir("fs/nfsd", NULL); /* somewhere for the nfsd filesystem to be mounted */
#if defined(CONFIG_SUN_OPENPROMFS) || defined(CONFIG_SUN_OPENPROMFS_MODULE)
    /* just give it a mountpoint */
    proc_mkdir("openprom", NULL);
#endif
    proc_tty_init();
#ifdef CONFIG_PROC_DEVICETREE
    proc_device_tree_init();
#endif
    proc_bus = proc_mkdir("bus", NULL);
    proc_sys_init();
}

装载proc文件系统

将特定于proc文件系统的超级块数据填充到一个vfsmount结构的实例中,使得新的文件系统能够集成到VFS树中。

<fs/proc/inode.c>
int proc_fill_super(struct super_block *s)
{
    struct inode * root_inode;
    s->s_flags |= MS_NODIRATIME | MS_NOSUID | MS_NOEXEC;
    s->s_blocksize = 1024;
    s->s_blocksize_bits = 10;
    s->s_magic = PROC_SUPER_MAGIC;
    s->s_op = &proc_sops;
    s->s_time_gran = 1;
    de_get(&proc_root);
    root_inode = proc_get_inode(s, PROC_ROOT_I
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值