当前位置:网站首页>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
边栏推荐
- 【beanshell】数据写入本地多种方法
- Deep learning plus
- Cs231n notes (bottom) - applicable to 0 Foundation
- How to write a full score project document | acquisition technology
- Zhang Ping'an: accélérer l'innovation numérique dans le cloud et construire conjointement un écosystème industriel intelligent
- Judge whether a string is a full letter sentence
- mysql中取出json字段的小技巧
- Rider 设置选中单词侧边高亮,去除警告建议高亮
- How does the outer disk futures platform distinguish formal security?
- [Jianzhi offer] 62 The last remaining number in the circle
猜你喜欢
随机推荐
Learnopongl notes (II) - Lighting
【性能测试】jmeter+Grafana+influxdb部署实战
美国芯片傲不起来了,中国芯片成功在新兴领域夺得第一名
DenseNet
Rider 设置选中单词侧边高亮,去除警告建议高亮
EasyX second lesson
高数 | 旋转体体积计算方法汇总、二重积分计算旋转体体积
Deeply cultivate 5g, and smart core continues to promote 5g applications
腾讯音乐上线新产品“曲易买”,提供音乐商用版权授权
CMake教程Step5(添加系统自检)
How can C TCP set heartbeat packets to be elegant?
编译libssh2报错找不到openssl
Learnopongl notes (I)
Practical example of propeller easydl: automatic scratch recognition of industrial parts
Embedded UC (UNIX System Advanced Programming) -2
ternary operator
【二叉树】根到叶路径上的不足节点
阈值同态加密在隐私计算中的应用:解读
Detailed explanation of printf() and scanf() functions of C language
[61dctf]fm
![[729. My schedule I]](/img/e3/32914227d00cf7595ee850e60f2b72.png)








