项目中可能会用到用户态和内核模块之间进行通信的功能。想到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文件系统 实现用户空间与内核模块之间通信的更多相关文章

  1. 全面了解Linux下Proc文件系统

    全面了解Linux下Proc文件系统   Proc是一个虚拟文件系统,在Linux系统中它被挂载于/proc目录之上.Proc有多个功能 ,这其中包括用户可以通过它访问内核信息或用于排错,这其中一个非 ...

  2. <解说linux下proc文件系统>

    proc文件系统的作用是访问系统内核信息 proc不是一个真实的文件系统,它不占系统的外存空间,只是以文件的形式为用户访问linux内核数据提供接口,因为系统内核总是动态的变化,所以我们所捕捉到的也只 ...

  3. linux中proc文件系统 -- ldd3读书笔记

    1./proc 文件系统概述 /proc 文件系统是由软件创建,被内核用来向外界报告信息的一个文件系统./proc 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生 ...

  4. Linux的proc文件系统

    proc,用户空间和内核空间能够通过该接口通信, 与普通文件不同的是.这些虚拟文件的内容都是动态创建的. proc文件系统是一个伪文件系统,它仅仅存在内存其中,而不占用外存空间. 它以文件系统的方式为 ...

  5. Linux启动时间优化-内核和用户空间启动优化实践

    关键词:initcall.bootgraph.py.bootchartd.pybootchart等. 启动时间的优化,分为两大部分,分别是内核部分和用户空间两大部分. 从内核timestamp 0.0 ...

  6. Linux的proc文件系统 分类: linux 2014-06-02 10:21 623人阅读 评论(0) 收藏

    proc为一个内核数据结构接口,用户空间和内核空间可以通过该接口通信, 与普通文件不同的是,这些虚拟文件的内容都是动态创建的. proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间. ...

  7. linux内存管理-内核用户空间 【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-4491362.html 1,linux内存管理中几个重要的结构体和数组 page unsigned long ...

  8. linux系统下,在用户空间应用程序中模拟发送系统键盘事件

    Linux 有自己的 input 子系统,可以统一管理鼠标和键盘事件. 如果想模拟键盘事件,但是系统没有键盘设备该如何是好? 基于输入子系统实现的 input 可以方便的在用户空间模拟鼠标和键盘事件. ...

  9. linux 使用 /proc 文件系统

    /proc 文件系统是一个特殊的软件创建的文件系统, 内核用来输出消息到外界. /proc 下 的每个文件都绑到一个内核函数上, 当文件被读的时候即时产生文件内容. 我们已经见到 一些这样的文件起作用 ...

随机推荐

  1. 新手程序员随笔2——初识html、css和javascript

    翻看博客,发现好久木有发blog了.纠其原因,一则是近来工作上卡到了一个编程难题,我是一个单线程的小猿,当我手头有事情做的时候,我不想分心去做其它事情,如写blog.二则是我个人的写作能力不佳,想到写 ...

  2. java类,接口浅谈

    一般类,抽象类,接口的使用场景: 类;共同的特征和行为的抽取和封装 接口:标准,规范(功能的扩展)         需要对某个类进行功能的扩展,就让某个类实现这个接口,抽取出来称为接口   内部类: ...

  3. 推荐轻量高效无依赖的开源JS插件和库

    目录 图片 布局 音频视频 编辑器 轮播图 弹出层 表单 存储 动画 时间 其它 CDN 图片 baguetteBox.js - 是一个简单易用的响应式图像灯箱效果脚本.demo Lightgalle ...

  4. <把时间当做朋友>读书笔记

    这本书我早就看过,还想再来一遍 开始这一行动是看李萌在朋友圈晒101计划,每天健身,读书半小时之类的,我也想做点啥,那就每天睡前读书半小时吧,怎么坚持下去呢? 我不想晒到朋友圈里,那就晒给玉玉看吧, ...

  5. js滚动条滚动到某个元素位置

    scrollTo(0,document.getElementById('xxx').offset().top);

  6. js中的 || && !!

    a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回aa || b : 将a, b转换为Boolean类型, 再执行逻辑或, tru ...

  7. asp.net mvc中ViewData、ViewBag和TempData的详解

    一.ViewData和ViewBag 1.ViewData和ViewBag都是从Action向View传递数据的方式,当然还有其他方式如向View传递Model. 2.ViewData页面查询数据时需 ...

  8. web app上传图片

    很就很久以前,web app上传图片需要通过cordova插件,那时候好像还叫phonegap. 后来一个html标签就可以了 <input type="file" clas ...

  9. Java语言程序设计(基础篇)第一章

    第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...

  10. 查看https是否支持ATS

    nscurl --ats-diagnostics --verbose https://我的域名