linux内核探索--基于proc实现内核和用户态通信

简介: 基于proc实现内核和用户态通信

目录

1、编写proc文件

2、编写配套的Makefile

3、测试


要求:实现一个proc文件,一个只读文件output,一个可写文件input;功能是:向input文件写入字符串后,可以从output文件中,读出input文件中反转后的字符串


1、编写proc文件

vim my_proc.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h> 
#include <linux/proc_fs.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
#define BUFSIZE  1024
static struct proc_dir_entry *input, *output;
static char *buf;
static unsigned int len;
void reverse(void)
{
  int i = 0;
  int j = len - 2;
  printk("in reverse = %u\n", len);
  while(i < j)
  {
    char c;
    c = buf[i];
    buf[i++] = buf[j];
    buf[j--] = c;
  }
}
static ssize_t mywrite(struct file *file, const char __user *ubuf,size_t count, loff_t *ppos) 
{
  if(count <= 0)
    return -EFAULT;
  printk("---start write---\n");
  len = count > BUFSIZE ? BUFSIZE : count;
  // kfree memory by kmalloc before
  if(buf != NULL)
    kfree(buf);
  buf = (char*)kmalloc(len+1, GFP_KERNEL);
  if(buf == NULL)
  {
    printk("kmalloc failure\n");
    return -EFAULT;
  }
  //memset(buf, 0, sizeof(buf));
  memset(buf, 0, len+1);
  if(copy_from_user(buf, ubuf, len))
    return -EFAULT;
  printk("writing :%s",buf);
  return len;
}
static ssize_t myread(struct file *file, char __user *ubuf,size_t count, loff_t *ppos) 
{
  if(*ppos > 0)
    return 0;
  printk("---start read---\n");
  printk("origin = %s\n", buf);
  reverse();
  printk("after = %s\n", buf);
  if(copy_to_user(ubuf, buf, len))
    return -EFAULT;
  *ppos = *ppos + len;
  return len;
}
static struct file_operations fo_input = 
{
  .owner = THIS_MODULE,
  .write = mywrite,
};
static struct file_operations fo_output = 
{
  .owner = THIS_MODULE,
  .read = myread,
};
static int proc_init(void)
{
  input=proc_create("input",0660,NULL,&fo_input);
  if(input == NULL)
    return -ENOMEM;
  output=proc_create("output",0660,NULL,&fo_output);
  if(output == NULL)
    return -ENOMEM;
  printk("input & ouput init success!\n");
  return 0;
}
static void proc_cleanup(void)
{
  proc_remove(input);
  proc_remove(output);
  printk("input & output cleanup\n");
}
module_init(proc_init);
module_exit(proc_cleanup);
MODULE_LICENSE("GPL");

image.gif

2、编写配套的Makefile

vim Makefile:

obj-m += my_proc.o
all:
  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

image.gif

3、测试

make 编译一下

如下

make -C /lib/modules/4.18.11/build M=/home/zj/neihe/proc_module_making/my_proc clean

make[1]: 正在进入目录 `/usr/src/linux-4.18.11'

 CLEAN   /home/zj/neihe/proc_module_making/my_proc/.tmp_versions

 CLEAN   /home/zj/neihe/proc_module_making/my_proc/Module.symvers

make[1]:正在离开目录 `/usr/src/linux-4.18.11'

如果觉得文章对你有帮助,欢迎关注微信公众号:小牛呼噜噜

然后sudo su 切换的root用户下

ls /proc/

发现多了2个文件:input ,output

ehco "test" >> /proc/input

cat /proc/input

打印:tset

ps:dmesg

image.png

内核探索暂时先到这里,先告一段落= =

相关文章
|
2月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
97 0
|
5月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
223 67
|
3月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
90 0
|
5月前
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
196 11
|
6月前
|
自然语言处理 监控 Linux
Linux 内核源码分析---proc 文件系统
`proc`文件系统是Linux内核中一个灵活而强大的工具,提供了一个与内核数据结构交互的接口。通过本文的分析,我们深入探讨了 `proc`文件系统的实现原理,包括其初始化、文件的创建与操作、动态内容生成等方面。通过对这些内容的理解,开发者可以更好地利用 `proc`文件系统来监控和调试内核,同时也为系统管理提供了便利的工具。
237 16
|
7月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
239 48
|
7月前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
143 16
|
2月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
587 13
|
3月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
358 21
|
3月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
linux命令—tree