嵌入式linux 驱动中建立进程,Tiny6410学习ing—(四)、嵌入式Linux内核驱动进阶—(5)、Linux进程控制(Proc文件系统)—③...

感觉 proc

文件系统挺简单的,这倒是省了不少事,呵呵了~~

(四)、嵌入式Linux内核驱动进阶

(5)、Linux进程控制(Proc文件系统)—③

Proc

文件系统

1、定义

Proc 文件系统,是一个特殊的文件系统,内核通过 Proc 文件系统将内核的一些信息输出给用户,/proc

目录下的每个文件都可以绑定到一个内核函数上;文件被读写时,被绑定的相应内核函数就会被触发,有这些函数处理文件的输出和输入。

简单的说,Proc 文件并不是真正意义上的文件,只有调用的时候才会由系统即时的生成以供读取!

2、Proc

的目录结构

和普通文件一样,Proc 文件系统目录结构由目录和文件组成。不同的是,Proc

文件系统中的文件都是有特定用途的,分别反映出不同的内核信息。

然后列出 Proc 文件系统中的主要功能文件:

子目录/文件名 内容描述

Apm 高级电源管理信息

Bus bus 总线相关信息

Cmdline 内核引导命令行参数

Cpuinfo cpu 信息

Devices 当前可用设备(包含所有的块设备和字符设备)

Dma DMA 通道使用情况

Filesystems 当前内核支持的文件系统

Ide IDE 子系统相关信息的子目录

Interrupt 终端使用情况

Ioports I/O 端口使用情况

Ksyms 内核符号表

Kmsg 内核信息

Locks 内核锁信息

Meminfo 内存信息

Modules 已加载内核模块列表

Mounts 已加载的文件系统

Net 网络子系统信息

Partitions 已识别的本地系统分区表

Slabinfo slab 内存分配池信息

Stat 内存状态总览

Sys 内核系统参数

Tty TTY 驱动信息

Uptime 系统 uptime

Version 内核版本

3、特点

▲:每个文件都规定了严格的权限

可读?可写?那个用户可读?哪个用户可写?

▲:可以用文本编辑程序读取(more、cat、vi 命令等)

▲:不仅可以有文件,还可以有子目录

▲:可以自己编写程序添加一个 /proc 目录下的文件

▲:文件的内容都是动态创建的,并不存在于磁盘上

4、Proc

编程接口

1)creat_proc_entry

函数功能:

创建 proc 文件

头文件:

#include

函数原型:

Struct proc_dir_entry *creat_proc_entry(const char *name,mode_t

mode,struct proc_dir_entry *parent)

参数说明:

Name:要创建的文件名

Mode:要创建文件的属性,默认 0755

Parent:这个文件的父目录,填写 NULL 为 proc 文件系统顶层目录

返回值:

成功返回 proc_dir_entry 结构体指针,失败返回 NULL。

该结构体的主要成员:

Struct proc_dir_entry

{

Const char

*name // 文件名

Mode_t

mode; // 文件权限

Uid_t

uid; // 文件的 uid

Gid_t

gid; // 文件的 gid

Struct inode_operations

*proc_iops; // 节电操作结构指针

Struct file_operations

*proc_fops; // 文件操作结构指针

Struct proc_dir_entry

*parent; // 父目录

Read_proc_t

*read_proc; // proc 读操作函数

Write_proc_t *

write_proc; // proc 写操作函数

Void

*data; // 指向私有数据

Stomic_t

count; // 使用计数

}

2)proc_mkdir

函数功能:

创建 proc 目录

头文件:

#include

函数原型:

Struct proc_dir_entry *proc_mkdir(const char *name,struct

proc_dir_entry *parent)

参数说明:

name:要创建的目录名

parent:该目录为父目录,填写 NULL 为 proc 文件系统顶层目录

返回值:

成功返回 proc_dir_entry 结构体指针,失败返回 NULL

3)remove_proc_entry

函数功能:

删除 proc 目录或者文件

头文件:

#include

函数原型:

Void remove_prco_entry(const *name,struct proc_dir_entry

*parent)

参数说明:

Name:要删除的文件或者目录名

Parent:所在的父目录

返回值:

4)read_prco 成员对应的读回调函数

函数原型:

Int read_func(char *page,char **stat,off_t off,int count,int

*peof,void *data)

参数说明:

Page:把要返回给用户的信息写在 buffer 里,最大不超过 PAGE_SIZE。

Stat:一般不使用

Off:偏移量

Count:用户要取的字节数

Peof:读到文件尾时,需要把 *peof 置 1

Data:指向私有数据,一般不使用

5)write_proc 成员对应的写回函数

函数原型:

Int write_func(struct file *file,const char *buffer,unsigned

long count,voide *data)

参数说明:

File:该 proc 文件对应的 file 结构,现在暂时还是用不到的!

Buffer:待写的数据所在饿位置

Count:待写数据的大小

Data:指向私有数据,一般不使用

然后就是实现代码:

#include

#include

#include

#define procfs_name "protest" //

proc 的名字

struct proc_dir_entry *our_proc_file;

/*

* read_proc 成员对应的读回调函数

*~/

int procfile_read(char *page,char **stat,off_t off,int count,

int

*peof,void *data)

{

int ret;

ret = sprintf(page,"Hello,_Justin!\n");

return(ret);

}

int __init proc_init()

{

/*

* 创建 proc 文件

*~/

our_proc_file =

create_proc_entry(procfs_name,0644,NULL);

if(our_proc_file == NULL)

{

remove_proc_entry(procfs_name,NULL);

printk("<1>Error:

Could not initialize /proc/%s\n",

procfs_name);

return(-ENOMEM);

}

/*

* 给 proc_dir_entry 结构体赋值

*~/

our_proc_file->read_proc =

procfile_read;

our_proc_file->uid = 0;

our_proc_file->gid = 0;

our_proc_file->size = 37;

printk("<1>/proc/%s

created\n",procfs_name);

return(0);

}

void __exit proc_exit()

{

/*

* 删除 proc 目录或者文件

*~/

remove_proc_entry(procfs_name,NULL);

printk("<1>/proc/%s

removed!\n",procfs_name);

}

module_init(proc_init);

module_exit(proc_exit);

再然后就是通过

NFS 起根文件系统了,安装内核模块,查看其运行状态:

a4c26d1e5885305701be709a3d33442f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值