debugfs를 사용하여 디버그 정보 내보내기 - 간단한 예

참조:
Documentation/filesystems/debugfs.txt
이 모듈은 디버그 정보를 사용자 공간에 내보내기 위해 debugfs를 사용하는 방법을 보여 줍니다.
이 모듈은 debugfs 루트에 다음과 같은 파일을 생성합니다.
dbgfs_demon/
├── data
└── tracing_on
작업 논리는tracingon의 값은 Y입니다. 데이터에서 유용한 디버깅 정보를 읽을 수 있습니다.
N이면 데이터 읽기 작업은 데이터를 반환하지 않습니다.
다음은 구체적인 실현 코드다.
컴파일 및 사용:
#echo "obj-m:= dbgfs.o"> Makefile
#make -C/path/to/kernel/tree M=`pwd` modules
#insmod dbgfs.ko
마운트 해제 모듈
#rmmod dbgfs
debugfs 마운트
#mkdir/mnt/debug
#mount -t debugfs nodev/mnt/debug
#cd/mnt/debug/dbgfs_demon
...
// dbgfs.c 
/*
 * (C) 05-07-2012 Yang Honggang (Joseph), Dslab <[email protected]>
 */
#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <asm/uaccess.h> 

struct dentry *parent, *sw, *inf;
u32 tr_on = 0;

struct my_data_struct {
	void* data;
	unsigned long size;
} mds;

struct page* pg;

static ssize_t data_read(struct file *file, char __user *user_buf,
				         size_t count, loff_t *ppos)
{
	unsigned long i;
    size_t cnt;
   
	printk("tr_on:%d
", tr_on); /* If the tracing_on is Y, fill the data buffer with debug info */ if (tr_on) { tr_on = 0; /* Automaticlly clear the 'tracing_on' flag */ for (i = 0; i < (mds.size - 11) / 11; i ++) { sprintf((char*)((char*)mds.data + i * 11 ), "%ld
", i + 1000000000); } /* Copy debug info to userspace */ cnt = copy_to_user(user_buf, (const void *)mds.data, mds.size); return (mds.size - cnt); } return 0; } const struct file_operations fops = { .read = data_read, }; static int __init dbgfs_demon_init(void) { printk("dbgfs init
"); /* Create dbgfs_demon directory in the debugfs root */ parent = debugfs_create_dir("dbgfs_demon", NULL); if (!parent) return -1; /* Create a output switch in dbgfs_demon */ sw = debugfs_create_bool("tracing_on", S_IRWXU, parent, &tr_on); if (!sw) goto p_out; /* Create a file for debug information exporting */ mds.size = 4 * 1024; /* Allocate one page for info. storing */ pg = alloc_pages(__GFP_HIGHMEM | __GFP_ZERO, 0); /* Covert to Memory address */ mds.data = (void*) page_address(pg); if (!pg) goto p_out; inf = debugfs_create_file("data", S_IRUSR, parent, &mds, &fops); if (!inf) goto sw_out; return 0; sw_out: debugfs_remove(sw); __free_pages(pg, 0); p_out: debugfs_remove(parent); return -1; } static void __exit dbgfs_demon_exit(void) { if (pg) __free_pages(pg, 0); debugfs_remove(inf); debugfs_remove(sw); debugfs_remove(parent); printk("dbgfs exit
"); return; } module_init(dbgfs_demon_init); module_exit(dbgfs_demon_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Yang Honggang (Joseph) <[email protected]>");

좋은 웹페이지 즐겨찾기