当前位置:网站首页>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
边栏推荐
猜你喜欢

采用药丸屏的iPhone14或引发中国消费者的热烈抢购

Wsl2.0 installation

Games101 notes (III)

一个满分的项目文档是如何书写的|得物技术

机器学习编译第2讲:张量程序抽象

Keras crash Guide

深耕5G,芯讯通持续推动5G应用百花齐放

阈值同态加密在隐私计算中的应用:解读

DenseNet

Use JDBC technology and MySQL database management system to realize the function of course management, including adding, modifying, querying and deleting course information.
随机推荐
Detailed explanation of printf() and scanf() functions of C language
外盘期货平台如何辨别正规安全?
Jarvis OJ Flag
国内首家 EMQ 加入亚马逊云科技「初创加速-全球合作伙伴网络计划」
flask解决CORS ERR 问题
[Web attack and Defense] WAF detection technology map
Games101 notes (I)
Use JDBC technology and MySQL database management system to realize the function of course management, including adding, modifying, querying and deleting course information.
Allusions of King Xuan of Qi Dynasty
腾讯音乐上线新产品“曲易买”,提供音乐商用版权授权
C#实现水晶报表绑定数据并实现打印3-二维码条形码
CMake教程Step6(添加自定义命令和生成文件)
【性能测试】jmeter+Grafana+influxdb部署实战
Is it safe for qiniu business school to open a stock account? Is it reliable?
composer安装报错:No composer.lock file present.
通过proc接口调试内核代码
mysql如何使用JSON_EXTRACT()取json值
机器学习01:绪论
Wsl2.0 installation
机器学习02:模型评估