返回顶部
首页 > 资讯 > 操作系统 >Linux内核里的DebugFS有什么用
  • 194
分享到

Linux内核里的DebugFS有什么用

2023-06-16 14:06:51 194人浏览 薄情痞子
摘要

本篇内容主要讲解“linux内核里的DebugFS有什么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内核里的DebugFS有什么用”吧!DebugFS,顾名思义,是一种用于内核调试

本篇内容主要讲解“linux内核里的DebugFS有什么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内核里的DebugFS有什么用”吧!

DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据。类似的虚拟文件系统还有procfs和sysfs等,这几种虚拟文件系统都并不实际存储在硬盘上,而是Linux内核运行起来后才建立起来。

通常情况下,最常用的内核调试手段是printk。但printk并不是所有情况都好用,比如打印的数据可能过多,我们真正关心的数据在大量的输出里不是那么一目了然;或者我们在调试时可能需要修改某些内核变量,这种情况下printk就无能为力,而如果为了修改某个值重新编译内核或者驱动又过于低效,此时就需要一个临时的文件系统可以把我们需要关心的数据映射到用户空间。在过去,procfs可以实现这个目的,到了2.6时代,新引入的sysfs也同样可以实现,但不论是procfs或是sysfs,用它们来实现某些debug的需求,似乎偏离了它们创建的本意。比如procfs,其目的是反映进程的状态信息;而sysfs主要用于Linux设备模型。不论是procfs或是sysfs的接口应该保持相对稳定,因为用户态程序很可能会依赖它们。当然,如果我们只是临时借用procfs或者sysfs来作debug之用,在代码发布之前将相关调试代码删除也无不可。但如果相关的调试借口要在相当长的一段时间内存在于内核之中,就不太适合放在procfs和sysfs里了。故此,debugfs应运而生。

默认情况下,debugfs会被挂载在目录/sys/kernel/debug之下,如果您的发行版里没有自动挂载,可以用如下命令手动完成:

# mount -t debugfs none /your/debugfs/dir

Linux内核为debugfs提供了非常简洁的api,本文接下来将以一个实作为例来介绍,sample code可以从这里下载。

这个实作会在debugfs中建立如下的目录结构:

Linux内核里的DebugFS有什么用

其中,a对应模块中的一个u8类型的变量,b和subdir下面的c都是对应模块里的一个字符数组,只是它们的实现方式不同。

在module_init里,我们首先要建立根目录mydebug:

my_debugfs_root = debugfs_create_dir("mydebug", NULL);

***个参数是目录的名称,第二个参数用来指定这个目录的上级目录,如果是NULL,则表示是放在debugfs的根目录里。

子目录也是用debugfs_create_dir来实现:

sub_dir = debugfs_create_dir("subdir", my_debugfs_root);

建立文件a的代码非常简单:

debugfs_create_u8("a", 0644, my_debugfs_root, &a);

这表示文件名为“a”,文件属性是0644,父目录是上面建立的“mydebug”,对应的变量是模块中的a。

Linux内核还提供了其他一些创建debugfs文件的API,请参考本文的附录。

b是一个32-bytes的字符数组,在debugfs里,数组可以用blob wrapper来实现。

char hello[32] = "Hello world!\n"; struct debugfs_blob_wrapper b;   b.data = (void *)hello; b.size = strlen(hello) + 1; debugfs_create_blob("b", 0644, my_debugfs_root, &b);

这里需要注意的是,blob  wrapper定义的数据只能是只读的。在本例中,虽然我们把文件b的权限设定为0644,但实际这个文件还是只读的,如果试图改写这个文件,系统将提示出错。

如果需要对内核数组进行写的动作,blob  wrapper就无法满足要求,我们只能通过自己定义文件操作来实现。在这个实作里,可以参考文件c的实现。c和b在模块里对应着同一块字符数组,不同的是,b是只读的,而c通过自定义的文件操作同时实现了读和写。

static int c_open(struct inode *inode, struct file *filp) {     filp->private_data = inode->i_private;     return 0; }   static ssize_t c_read(struct file *filp, char __user *buffer,         size_t count, loff_t *ppos) {     if (*ppos >= 32)         return 0;     if (*ppos + count > 32)         count = 32 - *ppos;       if (copy_to_user(buffer, hello + *ppos, count))         return -EFAULT;       *ppos += count;       return count; }   static ssize_t c_write(struct file *filp, const char __user *buffer,         size_t count, loff_t *ppos) {     if (*ppos >= 32)         return 0;     if (*ppos + count > 32)         count = 32 - *ppos;       if (copy_from_user(hello + *ppos, buffer, count))         return -EFAULT;       *ppos += count;       return count; }   struct file_operations c_fops = {     .owner = THIS_MODULE,     .open = c_open,     .read = c_read,     .write = c_write, };     debugfs_create_file("c", 0644, sub_dir, NULL, &c_fops);

注:代码里,c_open其实并没有任何用处,因为c_read和c_write直接引用了全局变量hello。这里,我们也可以换一种写法,在read/write函数里用filp->private_data来引用字符数组hello。

到这里,三个文件和子目录已经创建完毕。在module_exit中,我们要记得释放创建的数据。

debugfs_remove_recursive(my_debugfs_root);

debugfs_remove_recursive可以帮我们逐步移除每个分配 

到此,相信大家对“Linux内核里的DebugFS有什么用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Linux内核里的DebugFS有什么用

本文链接: https://lsjlt.com/news/283850.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux内核里的DebugFS有什么用
    本篇内容主要讲解“Linux内核里的DebugFS有什么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内核里的DebugFS有什么用”吧!DebugFS,顾名思义,是一种用于内核调试...
    99+
    2023-06-16
  • ​Linux内核中的container_of有什么用
    container_of是用于在数据结构中获取包含该数据结构的容器的指针的宏。在Linux内核中,container_of通常用于实...
    99+
    2023-10-22
    ​Linux
  • Linux内核 vs Windows内核有什么区别
    这篇文章给大家分享的是有关Linux内核 vs Windows内核有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Windows 和 Linux 可以说是我们比较常见的两款操作系统的。Windows 基本...
    99+
    2023-06-15
  • Linux内核的作用是什么
    Linux内核是操作系统的核心组件,它负责管理计算机的硬件资源,并提供给应用程序访问这些资源的接口。它的主要作用包括以下几点: ...
    99+
    2024-03-06
    Linux
  • Linux内核指的是什么
    今天就跟大家聊聊有关Linux内核指的是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。内核属于操作系统的核心部分,它具有操作系统基本的功能,主要负责管理系统的内存、进程、设备驱动...
    99+
    2023-06-28
  • linux内核的作用有哪些
    这篇文章主要介绍了linux内核的作用有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux内核的作用有哪些文章都会有所收获,下面我们一起来看看吧。linux内核的功能:1、管理进程,内核负责创建和销毁...
    99+
    2023-06-30
  • Linux下keepalive的内核参数有什么含义
    小编给大家分享一下Linux下keepalive的内核参数有什么含义,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!tcp_keepalive_time - INT...
    99+
    2023-06-13
  • Linux系统的内核是什么
    Linux系统的内核是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。相信接触过Linux的人或多或少都知道内核这个东西,下面就和大家聊一下Linux内核到底是什么东西?...
    99+
    2023-06-28
  • linux内核有哪些作用
    本文小编为大家详细介绍“linux内核有哪些作用”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux内核有哪些作用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。linux内核的作用:1、负责进程的创建和销毁...
    99+
    2023-06-29
  • Linux内核EXPORT_SYMBOL函数的作用是什么
    Linux内核的EXPORT_SYMBOL函数的作用是将一个函数或者符号导出,使得其他模块能够使用这个函数或者符号。当一个函数或者符...
    99+
    2023-10-24
    Linux
  • linux常用内核参数指的是什么
    本篇文章给大家分享的是有关linux常用内核参数指的是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 常用参数如下:1)    &n...
    99+
    2023-06-06
  • 什么是Linux内核抢占
    这篇文章主要讲解了“什么是Linux内核抢占”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是Linux内核抢占”吧!环境:处理器架构:arm64内核源码:linux-5.11ubuntu...
    99+
    2023-06-15
  • linux的内核锁有哪些
    linux中的内核锁有:1.互斥锁,在原子操作API的基础上实现的信号量行为;2.自旋锁,为SMP系统设计;linux中的内核锁有以下两种互斥锁linux中互斥锁是在原子操作API的基础上实现的信号量行为,其访问的规则是同一时间只能有一个任...
    99+
    2024-04-02
  • linux内核移植指的是什么
    这篇“linux内核移植指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux内核移植指的是什么”文章吧。在li...
    99+
    2023-06-29
  • 常用的linux内核函数有哪些
    常用的Linux内核函数有很多,以下是一些常见的内核函数:1. kmalloc():用于在内核中分配内存。2. kfree():用于...
    99+
    2023-09-25
    linux
  • Linux内核gpio的具体使用用法是什么
    这篇文章主要为大家分析了Linux内核gpio的具体使用用法是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux内核gpio的具体使用用法是什么”...
    99+
    2023-06-28
  • Linux内核模块中的module_init和init_module有什么区别
    module_init和init_module都是Linux内核模块中用来初始化模块的函数,但是它们的用法和执行顺序有所不同。1. ...
    99+
    2023-09-27
    解决
  • Linux 内核代码中的 EXPORT_SYMBOL_GPL 是什么
    EXPORT_SYMBOL_GPL 是一个宏,用于将符号(函数、变量、结构体等)导出为 Linux 内核模块的全局符号。在 Linu...
    99+
    2023-09-27
    解决
  • linux编译内核的步骤是什么
    编译Linux内核的步骤如下:1. 获取内核源代码:从官方网站或开源社区下载最新版本的Linux内核源代码。2. 安装编译工具:确保...
    99+
    2023-10-07
    linux
  • linux中内核模块指的是什么
    本文小编为大家详细介绍“linux中内核模块指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux中内核模块指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在linux中,内核模块是linu...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作