关于内核中proc的学习
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的学习相关推荐
- linux中内核中machine_desc,Linux-内核-学习笔记(13):移植三星官方内核
Linux-内核-学习笔记(13):移植三星官方内核 一.移植前的准备 当拿到源代码时,首先要在window下利用SourceInsight创建一个工程,并将uboot源代码加载到SI中,方便修改和查 ...
- Linux内核中的proc文件系统
简介 procfs文件系统是内核中的一个特殊文件系统.它是一个虚拟文件系统: 它不是实际的存储设备中的文件,而是存在于内存中.procfs中的文件是用来允许用户空间的程序访问内核中的某些信息(比如进程 ...
- kptr_restrict 向用户空间内核中的指针(/proc/kallsyms-modules显示value全部为0)
CSDN GitHub kptr_restrict 向用户空间内核中的指针(/proc/kallsyms-modules显示value全部为0) LinuxDeviceDrivers/study/de ...
- Android有线IPV6总结(二):内核中RS与RA的一点学习
RS:Router Solicitation路由器请求 RA:Router Advertisement路由器公告 在Android系统中我们想要打开一个网络接口(比如eth0)的ipv6功能,用命令的 ...
- linux中proc文件系统 -- ldd3读书笔记
1./proc 文件系统概述 /proc 文件系统是由软件创建,被内核用来向外界报告信息的一个文件系统./proc 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生 ...
- 调皮的程序员:Linux之父雕刻在Linux内核中的故事
本文内容由公众号"格友"原创分享. 1.引言 (不羁的大神,连竖中指都这么帅) 因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人.虽然大家可能都听过钱钟书先生的 ...
- Linux中/proc目录下文件详解 /proc/devices文件 /proc/modules文件
http://blog.chinaunix.net/uid-10449864-id-2956854.html 原来对linux系统中的/proc目录不是很了解,只知道可以查看cpu,内存等相关的信息, ...
- Linux中/proc目录下文件详解
Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...
- 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定
众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对于TCP ...
最新文章
- oracle表中怎么去重复,Oracle里去掉表里组合字段重复的记录步骤是什么呢?
- apiCloud中api.ajax方法跨域传参获取数据
- Python操纵Mysql数据库的三种方法,实现增删改查
- 测试android兼容性测试工具,Android兼容性测试工具Spoon
- 不带头结点的单链表的建立
- git上传分支的原理_GIT分支,创建分支与合并分支的工作原理与教程
- (转)LIB和DLL的区别与使用
- Linux系统glibc库版本信息查看
- 2018, CHI CHI2016汇总all CHI
- MD5在线解密工具推荐
- Tasking编译器开发TC275(Tricore)中使用自定义段
- c语言排快速排序过程,C语言中快速排序法怎么排
- 网页贴便签, Chrome特色网页便签纸 OurStickys
- VPS融合怪测评脚本(主体已完善,历史遗留问题解决时间未知)(VPS fusion monster evaluation script)
- ubuntu出现有线已连接却无法上网的解决方法(ubuntu连不上网)
- Linux之代理服务器squid安装和使用
- PDF文件太大怎么压缩?用这个方法能够一键瘦身
- 录屏流程 - 安卓R
- Arduino—舵机控制
- c语言函数嵌套是啥,函数的嵌套是什么 函数的嵌套是什么意思
热门文章
- IOS 实现3D Touch在tableView的简单应用(swift版)
- R语言学习—添加回归模型拟合线(一)
- 如何用R语言进行云计算
- 2019 Google物体挑战赛结果正式揭晓 极链科技获得金牌
- 研究生坑导师行为大赏!导师为了让大弟子毕业,不得已自写论文...
- 基于python实现的迷宫游戏
- Spring的依赖注入(接口注入)
- livy使用样例_hue 集成spark+livy
- XDC约束技巧之CDC篇
- 计算机控制技术罗文广PPT,计算机控制技术罗文广计算机控制技术第3章课件教学.ppt...