【问题标题】:System Call Tutorial - Hello World系统调用教程 - Hello World
【发布时间】:2015-03-19 10:39:30
【问题描述】:

我无法更新内核消息。我想我的内核可能已经损坏,因为 KERN ALERT 消息似乎没有更新。

我调用了“dmesg”命令,这是显示的内容:

Jan 20 18:18:59 cu-cs-vm kernel: [29194.126766] hello world

但是在更新了helloworld.c之后:

#include <linux/kernel.h>
#include <linux/linkage.h>

asmlinkage long sys_helloworld(void)
{
 printk(KERN_ALERT "Why isn't this working now???");
 return 0;
}

它仍然打印: 1 月 20 日 18:35:25 cu-cs-vm 内核:[30178.146268] hello world

这是我的测试脚本:

#include <unistd.h>
#include <stdio.h>

int main(){
    int id;
    id = syscall(318);
    printf("should print out zero: %d\n", id);
    return 0;
}

printf 确实打印 0 而不是 -1,这很好,但是为什么内核消息没有从“hello world”更新为“为什么现在这不起作用???”我已经重新编译了。如果有人有任何想法,如果你能与我分享,我将不胜感激。谢谢!

【问题讨论】:

  • 您是否使用 modprobe 重新加载了模块?
  • 我对 modprobe 不是很熟悉,但我的问题是我不知道是哪个模块导致了问题。不确定要重新加载哪一个。
  • 确保你已经使用rmmod卸载了之前加载的模块,然后使用insmod插入了最近编译的模块
  • 你是如何编译并安装你的helloworld.c的?
  • modprobe(如insmod/rmod,如果您提供.ko 文件的路径)是开发内核模块时的必须。你编写一个模块,编译它,然后使用modprobe/insmod注册它,重新加载时,必须调用modprobe -r(或rmmode)。

标签: c linux linux-kernel operating-system kernel


【解决方案1】:

你让它工作了,所以你的代码不是问题,问题要么是你的内核安装,要么是你的版本控制。如果版本不是较新,insmod 不会覆盖它。在安装新的 (insmod) 之前完全删除旧的安装 (rmmod) 或升级版本。

http://linux.die.net/man/8/rmmod

http://linux.die.net/man/8/insmod

甚至手册页也建议使用modprobe。也许你应该试一试,很简单。

http://linux.die.net/man/8/modprobe

当然,对于modprobe,您可以简单地给它一个--force 以忽略很多版本检查。但是,您需要的是 -v 选项,这样您就可以查看有关模块被拒绝原因的错误。

如果内核已经加载/缓存,系统可能还需要重新启动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多