ホームページ > 運用・保守 > Linuxの運用と保守 > Linux驱动 | debugfs接口创建

Linux驱动 | debugfs接口创建

リリース: 2023-07-31 17:39:45
転載
1445 人が閲覧しました

点击上方“嵌入式Linux充电站”,选择“置顶/星标公众号”

福利干货,第一时间送达
Linux驱动 | debugfs接口创建

上篇介绍了procfs接口的创建,今天再介绍一种debugfs接口的创建。

实现效果

/sys/kernel/debug/目录下创建一个ion/test文件,通过catecho的方式进行读写操作:

Linux驱动 | debugfs接口创建
Linux驱动 | debugfs接口创建

前期准备

内核配置打开debugfs:

1

CONFIG_DEBUG_FS=y

ログイン後にコピー

挂载debugfs文件系统:

1

mount -t debugfs none /sys/kernel/debug

ログイン後にコピー

代码实现

读写变量:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

#include <linux/debugfs.h>

#include <linux/module.h>

#include <linux/types.h>

 

static struct dentry *ion_dir;

static u64 test_u64 = 0;

 

static int __init debugfs_init(void)

{

 

    //创建一个/sys/kernel/debug/ion目录

    ion_dir = debugfs_create_dir("ion", NULL);

    if (!ion_dir) {

        printk("ion_dir is null\n");

        return -1;

    }

 

    /* 创建/sys/kernel/debug/ion/test_u64文件 */

    debugfs_create_u64("test_u64", 0644,

                        ion_dir, &test_u64);

 

    return 0;

}

 

static void __exit debugfs_exit(void)

{

    debugfs_remove_recursive(ion_dir);

}

 

module_init(debugfs_init);

module_exit(debugfs_exit);

MODULE_LICENSE("GPL");

ログイン後にコピー

运行结果:

Linux驱动 | debugfs接口创建

读写字符串:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

#include <linux/debugfs.h>

#include <linux/module.h>

#include <linux/fs.h>

#include <linux/uaccess.h>

#include <linux/errno.h>

#include <linux/dcache.h>

#include <linux/types.h>

 

static char ion_buf[512] = "hello\n";

static struct dentry *ion_dir;

 

static int ion_open(struct inode *inode, struct file *filp)

{

    //printk("ion open\n");

    return 0;

}

 

ssize_t ion_read(struct file *filp, char __user *buf, size_t count, loff_t *offp)

{

    int retval = 0;

    if ((*offp + count) > 512)

        count = 512 - *offp;

 

    if (copy_to_user(buf, ion_buf+*offp, count)) {

        printk("copy to user failed, count:%ld\n", count);

        retval = -EFAULT;

        goto out;

    }

    *offp += count;

    retval = count;

out:

    return retval;

}

 

ssize_t ion_write(struct file *filp, const char __user *buff, size_t count, loff_t *offp)

{

    int retval;

 

    if (*offp > 512)

        return 0;

 

    if (*offp + count > 512)

        count = 512 - *offp;

 

    if (copy_from_user(ion_buf+*offp, buff, count)) {

        printk("copy from user failed, count:%ld\n", count);

        retval = -EFAULT;

        goto out;

    }

    *offp += count;

    retval = count;

out:

    return retval;

}

 

struct file_operations my_fops = {

    .owner = THIS_MODULE,

    .read = ion_read,

    .write = ion_write,

    .open = ion_open,

};

 

static int __init debugfs_init(void)

{

    printk("INIT MODULE\n");

 

    //创建一个/sys/kernel/debug/ion目录

    ion_dir = debugfs_create_dir("ion", NULL);

    if (!ion_dir) {

        printk("ion_dir is null\n");

        return -1;

    }

 

    /* 创建/sys/kernel/debug/ion/test文件 */

    struct dentry *filent = debugfs_create_file("test", 0644, ion_dir, NULL, &my_fops);

    if (!filent) {

        printk("test file is null\n");

        return -1;

    }

 

    return 0;

}

 

static void __exit debugfs_exit(void)

{

    debugfs_remove_recursive(ion_dir);

}

 

module_init(debugfs_init);

module_exit(debugfs_exit);

MODULE_LICENSE("GPL");

ログイン後にコピー

运行结果:

Linux驱动 | debugfs接口创建

函数接口说明

创建目录、文件函数:

1

2

3

4

5

6

7

/* 创建目录 */

struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);

 

/*创建节点 */

struct dentry *debugfs_create_file(const char *name, umode_t mode,

                                   struct dentry *parent, void *data,

                                   const struct file_operations *fops);

ログイン後にコピー

name:要创建的/sys/kernel/debug下的目录名

parent:父目录,用struct dentry结构体表示。如果直接在/sys/kernel/debug/下创建文件,则为NULL

创建不同大小的文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//创建十进制的无符号文件

void debugfs_create_u8(const char *name, umode_t mode,

                       struct dentry *parent, u8 *value);

void debugfs_create_u16(const char *name, umode_t mode,

                        struct dentry *parent, u16 *value);

void debugfs_create_u32(const char *name, umode_t mode,

                        struct dentry *parent, u32 *value);

void debugfs_create_u64(const char *name, umode_t mode,

                        struct dentry *parent, u64 *value);

//创建十六进制的无符号文件

void debugfs_create_x8(const char *name, umode_t mode,

                       struct dentry *parent, u8 *value);

void debugfs_create_x16(const char *name, umode_t mode,

                        struct dentry *parent, u16 *value);

void debugfs_create_x32(const char *name, umode_t mode,

                        struct dentry *parent, u32 *value);

void debugfs_create_x64(const char *name, umode_t mode,

                        struct dentry *parent, u64 *value);

ログイン後にコピー

更详细的debugfs用法请参考官方文档:Documentation/filesystems/debugfs.txt

以上がLinux驱动 | debugfs接口创建の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:嵌入式Linux充电站
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート