linux内核5.8中proc编程的学习

对着proc_fs.h的头文件,一点点学习

看到头文件里第一个结构体,/proc 目录的操作结构体

struct proc_ops {unsigned int proc_flags;int     (*proc_open)(struct inode *, struct file *);ssize_t (*proc_read)(struct file *, char __user *, size_t, loff_t *);ssize_t (*proc_write)(struct file *, const char __user *, size_t, loff_t *);loff_t  (*proc_lseek)(struct file *, loff_t, int);int     (*proc_release)(struct inode *, struct file *);__poll_t (*proc_poll)(struct file *, struct poll_table_struct *);long    (*proc_ioctl)(struct file *, unsigned int, unsigned long);
#ifdef CONFIG_COMPATlong    (*proc_compat_ioctl)(struct file *, unsigned int, unsigned long);
#endifint     (*proc_mmap)(struct file *, struct vm_area_struct *);unsigned long (*proc_get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
} __randomize_layout;

再看头文件中重要的函数

extern struct proc_dir_entry *proc_create_data(const char *, umode_t,struct proc_dir_entry *,const struct proc_ops *,void *);

好了写下第一个demo

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/uaccess.h> /* copy_*_user */
#include <linux/slab.h>int our_proc_open(struct inode *, struct file *);
ssize_t our_proc_read(struct file *, char __user *, size_t, loff_t *);struct proc_ops ops = {.proc_open = our_proc_open,.proc_read = our_proc_read
};int our_proc_open(struct inode *inode, struct file *file)
{return 0;
};ssize_t our_proc_read(struct file *file, char __user * buffer, size_t size, loff_t *off_t)
{printk(KERN_ALERT "HELLO,our_proc_read\n");return 0;
};static int __init our_proc_init(void)
{printk(KERN_ALERT "HELLO,KERNEL\n");//挂载procproc_create_data("our_proc", 0644, NULL, &ops, NULL);return 0;
}static void __exit our_proc_exit(void)
{printk(KERN_ALERT "HELLO,KERNEL BYE BYE\n");remove_proc_entry("our_proc", NULL);
}module_init(our_proc_init);
module_exit(our_proc_exit);

Makefile

obj-m:=proc.oKERNELBUILD := /lib/modules/$(shell uname -r)/build
default:make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:rm -rf *.o *.ko

执行命令

sudo make
sudo insmod proc.ko
sudo rmmod proc.ko

好了整个proc目录崩了

ls /proc

电脑整个命令行崩溃,点击关机按钮,机器卡死。。。。。。

这是什么原因呢?引起了我的思考

vim prc_fs.h的头文件,我想我找到了原因

#define remove_proc_entry(name, parent) do {} while (0)

这个函数被注释掉了,也就是说不再起作用了,然后在源码中找到了proc_remove 这个函数
但是看实现好像不会有作用,因为实现代码中什么也没有

static inline void proc_remove(struct proc_dir_entry *de) {}

然后再次修正demo

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/uaccess.h> /* copy_*_user */
#include <linux/slab.h>#define MODULE_NAME "our_proc"struct proc_dir_entry* proc_handle = NULL;int our_proc_open(struct inode *, struct file *);
ssize_t our_proc_read(struct file *, char __user *, size_t, loff_t *);struct proc_ops ops = {.proc_open = our_proc_open,.proc_read = our_proc_read
};int our_proc_open(struct inode *inode, struct file *file)
{return 0;
};ssize_t our_proc_read(struct file *file, char __user * buffer, size_t size, loff_t *off_t)
{printk(KERN_ALERT "HELLO,our_proc_read\n");return 0;
};static int __init our_proc_init(void)
{printk(KERN_ALERT "HELLO,KERNEL\n");//挂载procproc_handle = proc_create_data(MODULE_NAME, 0644, NULL, &ops, NULL);return 0;
}static void __exit our_proc_exit(void)
{printk(KERN_ALERT "HELLO,KERNEL BYE BYE\n");if (proc_handle) {proc_remove(proc_handle);}
}module_init(our_proc_init);
module_exit(our_proc_exit);

再次执行命令

sudo make
sudo insmod proc.ko
cat /proc/our_proc
dmesg

在调试的环形缓冲区中看到了

[ 1212.214871] HELLO,KERNEL
[ 1227.271966] HELLO,our_proc_read
[ 1250.484078] HELLO,KERNEL BYE BYE
[ 1305.898772] HELLO,KERNEL
[ 1342.722686] HELLO,KERNEL BYE BYE
[ 1649.965351] HELLO,KERNEL
[ 1656.079254] HELLO,our_proc_read
[ 1657.011422] HELLO,our_proc_read

卸载驱动

sudo rmmod proc.ko

看到/proc/our_proc没了,一切恢复了正常

这就是proc新的函数api,主要是用来动态查询驱动信息的,当然我们调用
glibc 经典的api read write ioctl lseek等等都会触发相应的钩子

关于内核中proc的学习相关推荐

  1. linux中内核中machine_desc,Linux-内核-学习笔记(13):移植三星官方内核

    Linux-内核-学习笔记(13):移植三星官方内核 一.移植前的准备 当拿到源代码时,首先要在window下利用SourceInsight创建一个工程,并将uboot源代码加载到SI中,方便修改和查 ...

  2. Linux内核中的proc文件系统

    简介 procfs文件系统是内核中的一个特殊文件系统.它是一个虚拟文件系统: 它不是实际的存储设备中的文件,而是存在于内存中.procfs中的文件是用来允许用户空间的程序访问内核中的某些信息(比如进程 ...

  3. kptr_restrict 向用户空间内核中的指针(/proc/kallsyms-modules显示value全部为0)

    CSDN GitHub kptr_restrict 向用户空间内核中的指针(/proc/kallsyms-modules显示value全部为0) LinuxDeviceDrivers/study/de ...

  4. Android有线IPV6总结(二):内核中RS与RA的一点学习

    RS:Router Solicitation路由器请求 RA:Router Advertisement路由器公告 在Android系统中我们想要打开一个网络接口(比如eth0)的ipv6功能,用命令的 ...

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

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

  6. 调皮的程序员:Linux之父雕刻在Linux内核中的故事

    本文内容由公众号"格友"原创分享. 1.引言 (不羁的大神,连竖中指都这么帅) 因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人.虽然大家可能都听过钱钟书先生的 ...

  7. Linux中/proc目录下文件详解 /proc/devices文件 /proc/modules文件

    http://blog.chinaunix.net/uid-10449864-id-2956854.html 原来对linux系统中的/proc目录不是很了解,只知道可以查看cpu,内存等相关的信息, ...

  8. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  9. 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定

    众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对于TCP ...

最新文章

  1. oracle表中怎么去重复,Oracle里去掉表里组合字段重复的记录步骤是什么呢?
  2. apiCloud中api.ajax方法跨域传参获取数据
  3. Python操纵Mysql数据库的三种方法,实现增删改查
  4. 测试android兼容性测试工具,Android兼容性测试工具Spoon
  5. 不带头结点的单链表的建立
  6. git上传分支的原理_GIT分支,创建分支与合并分支的工作原理与教程
  7. (转)LIB和DLL的区别与使用
  8. Linux系统glibc库版本信息查看
  9. 2018, CHI CHI2016汇总all CHI
  10. MD5在线解密工具推荐
  11. Tasking编译器开发TC275(Tricore)中使用自定义段
  12. c语言排快速排序过程,C语言中快速排序法怎么排
  13. 网页贴便签, Chrome特色网页便签纸 OurStickys
  14. VPS融合怪测评脚本(主体已完善,历史遗留问题解决时间未知)(VPS fusion monster evaluation script)
  15. ubuntu出现有线已连接却无法上网的解决方法(ubuntu连不上网)
  16. Linux之代理服务器squid安装和使用
  17. PDF文件太大怎么压缩?用这个方法能够一键瘦身
  18. 录屏流程 - 安卓R
  19. Arduino—舵机控制
  20. c语言函数嵌套是啥,函数的嵌套是什么 函数的嵌套是什么意思

热门文章

  1. IOS 实现3D Touch在tableView的简单应用(swift版)
  2. R语言学习—添加回归模型拟合线(一)
  3. 如何用R语言进行云计算
  4. 2019 Google物体挑战赛结果正式揭晓 极链科技获得金牌
  5. 研究生坑导师行为大赏!导师为了让大弟子毕业,不得已自写论文...
  6. 基于python实现的迷宫游戏
  7. Spring的依赖注入(接口注入)
  8. livy使用样例_hue 集成spark+livy
  9. XDC约束技巧之CDC篇
  10. 计算机控制技术罗文广PPT,计算机控制技术罗文广计算机控制技术第3章课件教学.ppt...