如果调用程序a,我将如何编写运行程序b的内核模块

时间:2012-05-03 00:50:50

标签: linux-kernel

我对linux很新,我对内核模块编程有一些疑问。我正在使用ubuntu和C来​​制作我的.ko文件。我正在尝试创建一个模块,只要调用program / a,就会执行program / b而不是/ a。任何提示?

另外,即使使用printk(KERN_EMERG ...),它也不会打印到终端。有没有我缺少的设置,或ubuntu不这样做?

非常感谢!

2 个答案:

答案 0 :(得分:1)

您可能需要调整/proc/sys/kernel/printk中的设置,该设置控制打印到控制台的级别。来自proc(5)

   /proc/sys/kernel/printk
          The four values in this file are console_loglevel,
          default_message_loglevel, minimum_console_level, and
          default_console_loglevel.  These values influence
          printk() behavior when printing or logging error
          messages.  See syslog(2) for more info on the
          different loglevels.  Messages with a higher priority
          than console_loglevel will be printed to the console.
          Messages without an explicit priority will be printed
          with priority default_message_level.
          minimum_console_loglevel is the minimum (highest)
          value to which console_loglevel can be set.
          default_console_loglevel is the default value for
          console_loglevel.

请注意,与nice(2)值类似,较低值的较高优先级。

让路径execve()执行/foo/a /foo/b的最简单方法是在/foo/b之上绑定/foo/a

mount -obind /foo/b /foo/a

不需要内核模块。

使用内核模块执行相同的任务将会显着增加工作量; LSM界面可以帮助您确定何时正在执行目标。如果您正在寻找起点,do_execve()中的fs/exec.c就是从哪里开始阅读的。请确保ctags已安装,运行并知道如何使用编辑器的ctags集成,以便更轻松地阅读代码。

答案 1 :(得分:0)

回答printk
它打印到控制台,而不是终端。但是控制台是什么? 您可以在/proc/cmdline中找到其TTY。通常它是tty0,这意味着屏幕连接到计算机 如果你通过SSH / TELNET连接,肯定你不会看到这个。
如果你在图形环境(Gnome / KDE)中工作,你可能需要像alt-F1 / F2那样切换到文本模式TTY。

您还可以使用dmesg命令查看消息。