linux 使用/proc文件系统 实现用户空间与内核模块之间通信
项目中可能会用到用户态和内核模块之间进行通信的功能。想到linux系统本身很多通信都是通过/proc文件系统来的,比如修改网络中连接跟踪表连接数限制/proc/sys/net/netfilter/nf_conntrack_max,这种通信方式比较简单,所以想研究下,下面是我自己写的测试代码:
myproc.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <linux/vmalloc.h>
#include <asm/uaccess.h> MODULE_LICENSE("GPL"); #define MY_MEM_SIZE PAGE_SIZE static const char *name = "sandals";
static struct proc_dir_entry *proc_entry;
static char *mymem;
static unsigned long mylen; int mywrite(struct file *filp, const char __user *buff,
unsigned long len, void *data)
{
if (len > MY_MEM_SIZE) {
printk(KERN_INFO "mywrite too large len.\n");
return -ENOSPC;
} if (copy_from_user(mymem, buff, len)) {
printk(KERN_INFO "mywrite copy_from_user failed.\n");
return -EFAULT;
} mylen = len;
mymem[mylen] = ; return len;
} int myread(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
int len; if (!mylen) {
return ;
} if (count < mylen || off > ) {
*eof = ;
return ;
} len = sprintf(page, "%s\n", mymem); return len;
} int my_module_init(void)
{
int ret = ; mylen = ;
mymem = NULL; mymem = (char *)vmalloc(MY_MEM_SIZE);
if (!mymem) {
printk(KERN_INFO "my_module vmalloc failed.\n");
ret = -ENOMEM;
}
else {
memset(mymem, , MY_MEM_SIZE); proc_entry = create_proc_entry(name, , NULL);
if (!proc_entry) {
ret = -ENOMEM;
vfree(mymem);
mymem = NULL;
printk(KERN_INFO "my_module create_proc_entry failed.\n");
}
else {
proc_entry->read_proc = myread;
proc_entry->write_proc = mywrite;
printk(KERN_INFO "my_module_init called. Module is now loaded.\n");
}
} return ret;
} void my_module_cleanup(void)
{
remove_proc_entry(name, NULL);
vfree(mymem);
mymem = NULL;
printk(KERN_INFO "my_module_cleanup called. Module is now unloaded.\n");
return;
} module_init(my_module_init);
module_exit(my_module_cleanup);
简单讲下思路,这段代码,会在/proc根目录下,创建一个sandals文件,你可以通过cat test > /proc/sandals来写入。然后用cat /proc/sandals就可以输出刚刚输入的内容。
/proc文件系统其实不是特别难,简单的讲就是分以下步骤就可以了。(前提是你已经会了如果创建自定义内核模块,如果不会,可以在网上搜一下,这个网上很多)
1、创建一个/proc文件(和创建普通文件很像,当然系统调用不同),通过调用 create_proc_entry 来创建。
2、注册对这个文件读写的回调函数,读取回调函数就是你cat /proc/sandals的时候会调用。写回调函数就是echo 的时候会调用 。注册的代码就是78、79两行代码。
3、读写的时候,传递过来的参数,就不多说了。可以自己在网查一下。
4、编译就可以运行了。
makefile文件,就一行:
obj-m += myproc.o
下面是编译的命令(我用的是centos 6.6的系统,如果是其他的系统,自己替换-C部分,这部分是指定的内核原码的位置):
make -C /usr/src/kernels/`uname -r` SUBDIRS=$PWD modules
下面是运行结果的截图:

linux 使用/proc文件系统 实现用户空间与内核模块之间通信的更多相关文章
- 全面了解Linux下Proc文件系统
全面了解Linux下Proc文件系统 Proc是一个虚拟文件系统,在Linux系统中它被挂载于/proc目录之上.Proc有多个功能 ,这其中包括用户可以通过它访问内核信息或用于排错,这其中一个非 ...
- <解说linux下proc文件系统>
proc文件系统的作用是访问系统内核信息 proc不是一个真实的文件系统,它不占系统的外存空间,只是以文件的形式为用户访问linux内核数据提供接口,因为系统内核总是动态的变化,所以我们所捕捉到的也只 ...
- linux中proc文件系统 -- ldd3读书笔记
1./proc 文件系统概述 /proc 文件系统是由软件创建,被内核用来向外界报告信息的一个文件系统./proc 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生 ...
- Linux的proc文件系统
proc,用户空间和内核空间能够通过该接口通信, 与普通文件不同的是.这些虚拟文件的内容都是动态创建的. proc文件系统是一个伪文件系统,它仅仅存在内存其中,而不占用外存空间. 它以文件系统的方式为 ...
- Linux启动时间优化-内核和用户空间启动优化实践
关键词:initcall.bootgraph.py.bootchartd.pybootchart等. 启动时间的优化,分为两大部分,分别是内核部分和用户空间两大部分. 从内核timestamp 0.0 ...
- Linux的proc文件系统 分类: linux 2014-06-02 10:21 623人阅读 评论(0) 收藏
proc为一个内核数据结构接口,用户空间和内核空间可以通过该接口通信, 与普通文件不同的是,这些虚拟文件的内容都是动态创建的. proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间. ...
- linux内存管理-内核用户空间 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4491362.html 1,linux内存管理中几个重要的结构体和数组 page unsigned long ...
- linux系统下,在用户空间应用程序中模拟发送系统键盘事件
Linux 有自己的 input 子系统,可以统一管理鼠标和键盘事件. 如果想模拟键盘事件,但是系统没有键盘设备该如何是好? 基于输入子系统实现的 input 可以方便的在用户空间模拟鼠标和键盘事件. ...
- linux 使用 /proc 文件系统
/proc 文件系统是一个特殊的软件创建的文件系统, 内核用来输出消息到外界. /proc 下 的每个文件都绑到一个内核函数上, 当文件被读的时候即时产生文件内容. 我们已经见到 一些这样的文件起作用 ...
随机推荐
- ArcEngine奇怪异常:HRESULT:0x80040351
错误如图 根据该博客,http://blog.csdn.net/u011609113/article/details/51155116, 显示该错误为Duplicate Field Names wit ...
- 2016huasacm暑假集训训练四 DP_B
题目链接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/M 题意:有N件物品和一个容量为V的背包.第i件物品的费用是体积c[i],价值是w[ ...
- 批量创建AD测试账号
在现场中,有时候客户会要求做一下AD压力测试,需要批量创建很多AD用户.奉献此代码供各位参考. 1: <# 2: 3: .DESCRIPTION 4: 批量创建AD测试账号 5: 6 ...
- Android学习笔记之 android:collapseColumns ,android:shrinkColumns 和stretchColumns
摘自:http://blog.csdn.net/sjf0115/article/details/7213565/ TableLayout是一个使用复杂的布局,最简单的用法就仅仅是拖拉控件做出个界面,但 ...
- javascript:算法之for循环
一.for中的表达式 ①短路表达式 a && b是表达式:当执行的时候如果表达式a结果不是0,就会执行表达式b.如果表达式a执行的结果是0,表达式b不执行 ②i++与++i的不同 ++ ...
- 在 Linux 下搭建 Git 服务器
环境: 服务器 CentOS6.6 + git(version 1.7.1)客户端 Windows10 + git(version 2.8.4.windows.1) ① 安装 Git Linux 做为 ...
- could not get lock /var/lib/dpkg/lock
这个问题的原因可能是有另外一个程序正在运行,导致资源被锁不可用.而导致资源被锁的原因,可能是上次安装时没正常完成,而导致出现此状况. 解决方法:输入以下命令 sudo rm /var/cache/ap ...
- 【LINUX】VI相关命令
任何用户最常做的事要数创建和编辑文件,包括文档.报告和文字,vi(Visual Editor)是一个有效而相对简单的全荧幕编辑,使用vi,只要记著少量基本指令,就可以开始起步,再学习其他更复杂的指令, ...
- Magento table rates表运费设置
在magento中集成了Table rate表运费,这种运输方式.表运费就是我们自己写个运费表,根据距离和商品重量设置运费,制做成一张csv格式的表,导入到magento中,来实现运费的控制. 在我的 ...
- ubuntu下的时间设定(硬件时间,系统时间,本地时间)
问题的来由是在这里: 在cron里设定任务是在凌晨6点执行,检查日志时发现时间总是不对,是在22点左右的时间执行的.研究发现,任务是在本地时间的6点执行了,但不知为什么syslog中的时间都是为utc ...