07 - Debugfs

probe.c

probe.c
#include <linux/module.h>
#include <linux/kernel.h>
/* Api debugfs */
#include <linux/debugfs.h>
/* Przekazywanie danych do/z przestrzeni użytkownika */
#include <linux/uaccess.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Marcin Bis");
MODULE_DESCRIPTION("Przyklad uzycia debugfs");
 
/* Bufor i jego rozmiar */
static char *probe_buf;
static unsigned long probe_bufsize = 0;
/* Struktury opisujące katalog i plik opakowujący bufor. */
static struct debugfs_blob_wrapper probe_blob;
static struct dentry *probe_debug_buf;
 
static int __init probe_init(void)
{
  /* Przygotowanie bufora */
  probe_blob.data = probe_buf;
  probe_blob.size = probe_bufsize;
  /* prosty plik eksportujący zmienną tylko do odczytu */
  probe_debug_buf = debugfs_create_blob("probe_buf", 0644,
                                     NULL, &probe_blob);
  if (!probe_debug_buf) return -ENOENT;
 
  return 0;
}
module_init(probe_init);
 
static void __exit probe_exit(void)
{
  debugfs_remove(probe_debug_buf);
}
module_exit(probe_exit);

probe_fops.c

probe_fops.c
#include <linux/module.h>
#include <linux/kernel.h>
/* Api debugfs */
#include <linux/debugfs.h>
/* Przekazywanie danych do/z przestrzeni użytkownika */
#include <linux/uaccess.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Marcin Bis");
MODULE_DESCRIPTION("Przyklad uzycia debugfs");
 
#define MAX 0xff
static u8 s;
static char fbuf[MAX];
 
/* Struktury opisujące katalog i pliki. */
static struct dentry *probe_debug_root;
static struct dentry *probe_debug_file;
static struct dentry *probe_debug_s;
 
/* Funkcje implementujące operacje na pliku */
static ssize_t probe_read_file(struct file *file, char __user *userbuf,
                                   size_t count, loff_t *ppos)
{
  return simple_read_from_buffer(userbuf, count, ppos, fbuf, s);
}
 
static ssize_t probe_write_file(struct file *file, const char __user *buf,
                                   size_t count, loff_t *ppos)
{
  int res;
  if (count > MAX) return -EINVAL;
  res = copy_from_user(fbuf, buf, count);
  s = count;
  return count;
}
 
/* Struktura opisująca operacje na pliku
   uwaga na przecinek po ostatniej funkcji */
static const struct file_operations probe_fops = {
  .read = probe_read_file,
  .write = probe_write_file,
};
 
static int __init probe_init(void)
{
  printk(KERN_INFO "Probe start.\n");
  /* tworzenie katalgu */
  probe_debug_root = debugfs_create_dir("probe", NULL);
  if (!probe_debug_root) return -ENOENT;
 
  /* prosty plik eksportujący zmienną tylko do odczytu */
  probe_debug_s = debugfs_create_u8("file_size", 0444,
                                     probe_debug_root, &s);
  if (!probe_debug_s) goto cleanup_root;
 
  /* plik obsługujący odczyt i zapis */
  probe_debug_file = debugfs_create_file("file", 0644,
                                         probe_debug_root, NULL,
                                         &probe_fops);
  if (!probe_debug_file) goto cleanup_filesize;
 
  return 0;
 
  /* przykład korzystania z goto do obsługi błędów 
     jest to typowy sposób wykorzystywany w kodzie jądra */
 
  cleanup_filesize:
    debugfs_remove(probe_debug_s);
 
  cleanup_root:
    debugfs_remove(probe_debug_root);
    probe_debug_root = NULL;  
    return -ENOENT;
}
module_init(probe_init);
 
static void __exit probe_exit(void)
{
  debugfs_remove(probe_debug_file);
  debugfs_remove(probe_debug_s);
  debugfs_remove(probe_debug_root);
  printk(KERN_INFO "Probe stop.\n");
}
module_exit(probe_exit);

Makefile

Makefile
obj-m += probe.o
obj-m += probe_fops.o
 
all:
	make -C /lib/modules/$(shell uname -r)/build \
		SUBDIRS=$(shell pwd) modules
 
clean:
	make -C /lib/modules/$(shell uname -r)/build \
		SUBDIRS=$(shell pwd) clean
ostatnio zmienione: 2011/06/16 15:52