当前位置:网站首页>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

原网站

版权声明
本文为[pickled cabbage]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207051628209719.html