当前位置:网站首页>Debug kernel code through proc interface
Debug kernel code through proc interface
2022-07-05 17:12:00 【pickled cabbage】
according to linux Introduction to device drive , Except for the most basic printk Other than print debugging , just so so
By creating a proc Interface to debug kernel code .
In the specific driver , Can be read Functions are nested in a function , Choose your own content to print .
(1) adopt struct proc_ops
proc_create establish proc Interface ( The header file ,#include<linux/proc_fs.h>)
proc.c
#include<linux/module.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/proc_fs.h>
#include<linux/seq_file.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Tan xujia");
MODULE_VERSION("V1");
char *str = "hello proc\n";
int
hp_open(struct inode *inode, struct file *filp)
{
printk(KERN_INFO "open %ld\n", strlen(str));
return 0;
}
ssize_t
hp_read(struct file *filp, char __user *buff, size_t count, loff_t *f_pos)
{
ssize_t retval = 0;
int n = strlen(str);
if(*f_pos >= n)
goto out;
/* Return the remaining bytes */
if(*f_pos + count > n)
count = n - *f_pos;
/* Copy data to user space */
if(copy_to_user(buff, str, count)) {
retval = -EFAULT;
goto out;
}
/* Update offset */
*f_pos += count;
return count;
out:
return retval;
}
/* Only realize open and read function */
struct proc_ops hp_ops = {
.proc_open = hp_open,
.proc_read = hp_read,
};
static int
__init hello_init(void)
{
printk(KERN_INFO "hello_init\n");
/* Create this interface , adopt proc The directory can see this interface */
proc_create("hello_proc", 0, NULL, &hp_ops);
return 0;
}
static void
__exit hello_exit(void)
{
remove_proc_entry("hello_proc",NULL);
printk(KERN_INFO "hello_exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
obj-m :=proc.o
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.mod *.order *.symvers
(2) adopt
struct seq_operations
proc_create_seq() establish proc Interface ( The header file ,#include<linux/seq_file.h>)
proc.c
#include<linux/module.h>
#include<linux/init.h>
#include<linux/uaccess.h>
#include<linux/string.h>
#include<linux/proc_fs.h>
#include<linux/seq_file.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Tan xujia");
MODULE_VERSION("V1");
char *str = "hello proc\n";
void*
hp_seq_start(struct seq_file *m, loff_t *pos)
{
printk(KERN_INFO "seq start\n");
if(*pos >= strlen(str))
return NULL;
return &str[*pos];
}
/*stop Nothing is done in the function , If in start The function has For example, what kind of memory to apply for , Can be in stop Function to release */
void
hp_seq_stop(struct seq_file *m, void *v)
{
printk(KERN_INFO "seq stop\n");
}
void*
hp_seq_next(struct seq_file *m, void *v, loff_t *pos)
{
printk(KERN_INFO "seq next\n");
(*pos)++;
if(*pos >= strlen(str))
return NULL;
return &str[*pos]; /* This is usually passed to show Functional v Shape parameter */
}
int
hp_seq_show(struct seq_file *m, void *v)
{
printk(KERN_INFO "seq_show\n");
seq_putc(m,*(char*)v); /*cat when , Print string */
return 0;
}
/* Generally, these functions are implemented */
const struct seq_operations seq_ops={
.start = hp_seq_start,
.stop = hp_seq_stop,
.next = hp_seq_next,
.show = hp_seq_show,
};
static int
__init hello_init(void)
{
printk(KERN_INFO "hello_init\n");
proc_create_seq("seq_proc", 0, NULL, &seq_ops);
return 0;
}
static void
__exit hello_exit(void)
{
remove_proc_entry("seq_proc", NULL);
printk(KERN_INFO "hello_exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
obj-m :=proc.o
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.mod *.order *.symvers
边栏推荐
猜你喜欢
ternary operator
The survey shows that the failure rate of traditional data security tools in the face of blackmail software attacks is as high as 60%
Learnopongl notes (I)
mysql中取出json字段的小技巧
Application of threshold homomorphic encryption in privacy Computing: Interpretation
[729. My schedule I]
stirring! 2022 open atom global open source summit registration is hot!
ECU introduction
33:第三章:开发通行证服务:16:使用Redis缓存用户信息;(以减轻数据库的压力)
[Jianzhi offer] 63 Maximum profit of stock
随机推荐
阈值同态加密在隐私计算中的应用:解读
Twig数组合并的写法
mysql中取出json字段的小技巧
腾讯音乐上线新产品“曲易买”,提供音乐商用版权授权
机器学习01:绪论
【jmeter】jmeter脚本高级写法:接口自动化脚本内全部为变量,参数(参数可jenkins配置),函数等实现完整业务流测试
Is it safe to open futures accounts online? Will there be more liars online? Doesn't feel very reliable?
网上办理期货开户安全吗?网上会不会骗子比较多?感觉不太靠谱?
The survey shows that the failure rate of traditional data security tools in the face of blackmail software attacks is as high as 60%
How to write a full score project document | acquisition technology
Zhang Ping'an: accelerate cloud digital innovation and jointly build an industrial smart ecosystem
干货!半监督预训练对话模型 SPACE
First day of learning C language
Jarvis OJ shell traffic analysis
Allusions of King Xuan of Qi Dynasty
C#(Winform) 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
thinkphp模板的使用
【testlink】TestLink1.9.18常见问题解决方法
美国芯片傲不起来了,中国芯片成功在新兴领域夺得第一名
飞桨EasyDL实操范例:工业零件划痕自动识别