当前位置:网站首页>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
边栏推荐
- 2022 年 Q2 加密市场投融资报告:GameFi 成为投资关键词
- Jarvis OJ webshell analysis
- The first EMQ in China joined Amazon cloud technology's "startup acceleration - global partner network program"
- Deep dive kotlin synergy (XXI): flow life cycle function
- C#(Winform) 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
- thinkphp3.2.3
- 国内首家 EMQ 加入亚马逊云科技「初创加速-全球合作伙伴网络计划」
- The first lesson of EasyX learning
- composer安装报错:No composer.lock file present.
- 一文了解MySQL事务隔离级别
猜你喜欢

High number | summary of calculation methods of volume of rotating body, double integral calculation of volume of rotating body

【729. 我的日程安排表 I】

Embedded UC (UNIX System Advanced Programming) -1

Rider 设置选中单词侧边高亮,去除警告建议高亮

ternary operator

Deeply cultivate 5g, and smart core continues to promote 5g applications

Deep dive kotlin synergy (XXI): flow life cycle function
![[729. My Schedule i]](/img/e3/32914227d00cf7595ee850e60f2b72.png)
[729. My Schedule i]

Etcd build a highly available etcd cluster

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)
Embedded-c Language-5
Is it safe to open an account for digging wealth stocks? How is it safe to open a stock account?
The third lesson of EasyX learning
winedt常用快捷键 修改快捷键latex编译按钮
Read the basic grammar of C language in one article
CMake教程Step2(添加库)
Thoughtworks 全球CTO:按需求构建架构,过度工程只会“劳民伤财”
麻烦问下,DMS中使用Redis语法是以云数据库Redis社区版的命令为参考的嘛
中国广电正式推出5G服务,中国移动赶紧推出免费服务挽留用户
NPM installation
张平安:加快云上数字创新,共建产业智慧生态
IDC报告:腾讯云数据库稳居关系型数据库市场TOP 2!
深耕5G,芯讯通持续推动5G应用百花齐放
Little knowledge about C language (array and string)
项目引入jar从私服Nexus 拉去遇到的一个问题
Games101 notes (I)
How to write a full score project document | acquisition technology
编译libssh2报错找不到openssl
Games101 notes (II)