【问题标题】:linux device driver and insmod [closed]linux设备驱动程序和insmod [关闭]
【发布时间】:2018-08-16 11:31:01
【问题描述】:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include "test.h"

MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void) {
     printk("DRIVER LOADED\n");
     printk("DRIVER INIT\n");
     printk("result : %d",add(12,234));
     return 0;
}
static void hello_exit(void) {
     printk("DRIVER REMOVED\n");
}

module_init(hello_init);
module_exit(hello_exit);

insmod 发出时 printk 不打印 add 函数输出 我是一个新的 ldd lerner,有人可以帮我理解为什么会这样吗?

我的 test.c 包含以下函数体

int add(int a , int b){

    return a+b;
}

和Makefile如下

obj-m = initial.o
all:
            make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
            make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean

我的输出显示:

Aug 16 11:15:44 beaglebone kernel: [13616.191741] DRIVER LOADED
Aug 16 11:15:44 beaglebone kernel: [13616.191758] DRIVER INIT
Aug 16 11:15:47 beaglebone kernel: [13616.191784] result : 246
Aug 16 11:15:47 beaglebone kernel: [13619.465555] DRIVER REMOVED

【问题讨论】:

  • 我不懂你。你能改写你的句子吗?怎么了?你发什么? dmesg 输出似乎没问题,您的函数将 12 与 236 相加并打印出来。您的标头test.h 文件是否包含函数定义,而不仅仅是函数声明?
  • add 函数结果为 246,这没关系,但它在我发出 rmmod 命令时执行,而不是在我插入 insmod 时执行。因为我已经在 module_init 函数中编写了这个函数,所以它应该在使用 insmod 插入时执行,不是吗? @KamilCuk
  • 是 /var/log/messages 文件中的时间戳吗?
  • 如引用问题中所述,您忘记在打印字符串的末尾添加换行符 (\n)。因此,打印的消息会延迟出现在日志中。

标签: c linux-device-driver


【解决方案1】:

printk 输出在行被刷新后出现。由于您在printk 的末尾缺少\n,因此在删除内核模块时将发生的下一次刷新时生成的字符串会打印出来。 所以printk("result : %d\n",add(12,234)); 应该可以工作。

【讨论】:

  • 感谢@jklmnn。我只是忘了放那个小东西。它现在工作了!
  • 值得注意的是这个缓冲的线索——内核时间戳远早于这一行的 syslog 时间戳。
猜你喜欢
  • 2013-03-26
  • 2012-12-10
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2013-04-13
相关资源
最近更新 更多