c - 系统调用教程 - Hello World

标签 c linux linux-kernel operating-system kernel

我在更新内核消息时遇到问题。我想我可能已经损坏了我的内核,因为 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”更新为“为什么现在不工作???”我已经重新编译了。如果有人有任何想法,如果您能与我分享,我将不胜感激。谢谢!

最佳答案

你已经让它工作了,所以你的代码不是问题,问题要么是你的内核安装,要么是你的版本控制。如果版本不是较新,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 选项,以便您可以查看有关模块被拒绝原因的错误。

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

关于c - 系统调用教程 - Hello World,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28058267/

相关文章:

c - 在 STM32 上使用调试器时如何使用延迟?

linux - 无法在 redhat linux 服务器上安装 git

linux - percpu 指针在 Linux 内核中是如何实现的?

c - tx_buf 期望 spi_transfer 中的输入内容

linux - Yocto:为什么在构建外部内核模块期间未定义结构模块

sql - 如何(如果可能)独立使用 PostgreSQL 的解析器(C 语言)?

将每个碱基转换为另一个碱基(不起作用)

c - 程序在调用回调函数时因段错误而崩溃

javascript - HTML5/javascript X11 服务器?

linux - 庆典 : sudo: command not found on debian jessie