我有一个Linux内核驱动程序和一个与之交互的用户应用程序。内核驱动程序中有一个死锁。我在名为“
lockdep
” 的linux内核中遇到了这个功能。我能够对其进行配置并重新编译内核(并且我确实在/
proc中看到lockdep文件夹)。但是我不知道该如何推断该工具的输出或如何使用该工具调试驱动程序。任何帮助将不胜感激。谢谢!
要启用lockdep功能,请通过menuconfig编辑.config文件:
make menuconfig
并在“黑客选项”中启用以下功能:
1. [*] Detect Hard and Soft Lockups
2. [*] Detect Hung Tasks
3. [*] RT Mutex debugging, deadlock detection
4. -*- Spinlock and rw-lock debugging: basic checks
5. -*- Mutex debugging: basic checks
6. -*- Lock debugging: detect incorrect freeing of live locks
7. [*] Lock debugging: prove locking correctness
8. [*] Lock usage statistics
重新编译内核:
make ARCH=i386 -j4 //whatever your arch is
现在,启动新的内核映像,在/ proc下,您应该看到以下新文件夹:
/proc/lockdep
/proc/lockdep_chains
/proc/lockdep_stat
/proc/locks
/proc/lock_stats
现在,插入您认为导致该错误的模块,并使用您的用户应用程序(或您用于运行驱动程序模块的任何方式)进行访问。如果应用程序死锁(挂起),请执行以下操作:
ps -aux | grep <app_name>
您应该为您的应用看到+ D(不间断睡眠)状态,请执行以下操作:
dmesg
它打印的日志将包含导致死锁的功能/文件。
而已!
主要内容:分配矩阵,请求矩阵如果在资源分配图中形成一个循环,其中所有资源都有单个实例,则系统将死锁。 在具有多实例资源类型的资源分配图的情况下,周期是死锁的必要条件,但不是充分条件。 以下示例包含三个进程P1,P2,P3和三个资源R2,R2,R3。 所有资源都有单个实例。 如果我们分析图表,那么我们可以发现图表中存在一个循环,因为系统满足所有四种死锁条件。 分配矩阵 分配矩阵可以通过使用系统的资源分配图来形成。 在分配矩阵中
问题内容: 我正在测试内核异步io函数(不是posix aio),并试图弄清楚它是如何工作的。下面的代码是一个完整的程序,其中我简单地将一个数组重复写入使用O_DIRECT打开的文件中。我在回调函数中收到一个错误“写错的字节期望1024得到0”(请参阅work_done()中的fprintf语句)。 对于不熟悉内核aio的用户,以下代码将执行以下操作: 初始化一些结构 准备AIO(io_pre
问题内容: 在不深入了解 为什么 的细节的情况下,我正在寻找一种干净的(尽可能)的方法来替换可加载模块中的内核函数和系统调用。我最初的想法是编写一些代码来覆盖某些功能,这些功能将采用原始功能(可能的话, 调用 该功能),然后添加一些自己的代码。关键是我编写的函数必须具有原始函数的名称,因此其他代码在尝试访问它时将改为访问我的函数。 通过将代码放入适当的函数中,我可以轻松地(相对地)直接在内核中执行
问题内容: 在计算机上安装Linux系统时,我不太了解Linux内核的编译过程。 以下是使我感到困惑的一些事情: 内核是用C编写的,但是如何在未安装编译器的情况下编译内核? 如果在编译内核之前在我的机器上安装了C编译器,那么在没有安装编译器的情况下如何编译该编译器本身? 几天来我都很困惑,感谢您的回复。 问题答案: Linux盒的第一轮二进制文件建立在其他Linux盒上(可能)。 第一个Linux
问题内容: 我正在学习和编程。根据Jonathan Corbet的书,我们没有设备驱动程序中的功能。 在这里我有两个问题: 为什么我们不需要设备驱动程序中的功能? 内核有功能吗? 问题答案: 从根本上讲,例程的命名没有什么特别的。如上所述,它充当可执行加载模块的入口点。但是,您可以为装入模块定义不同的入口点。实际上,您可以定义多个入口点,例如,引用您喜欢的dll。 从操作系统(OS)的角度来看,它
问题内容: 在Linux中,当我在java.lang.Process对象上运行destroy函数(类型为true的java.lang.UNIXProcess)时,它会发送SIGTERM信号进行处理,有没有办法用SIGKILL杀死它? 问题答案: 不使用纯Java。 你最简单的选择是使用运行的外部进程的命令。 不幸的是,掌握PID并不是那么简单。您将需要使用反射黑魔法来访问该字段,或者弄乱该命令的输