标签: kernel-module

在Linux内核模块中读/写文件

我知道所有关于为什么不应该从内核读/写文件的讨论,而是如何使用/ procnetlink来做到这一点.无论如何我想读/写.我也读过" 驾驶我的坚果 - 你应该在内核中做的事情".

但问题是2.6.30不能导出sys_read().相反,它包含在内SYSCALL_DEFINE3.因此,如果我在我的模块中使用它,我会收到以下警告:

WARNING: "sys_read" [xxx.ko] undefined!
WARNING: "sys_open" [xxx.ko] undefined!
Run Code Online (Sandbox Code Playgroud)

显然insmod无法加载模块,因为链接没有正确发生.

问题:

  • 如何在2.6.22之后在内核中读/写(哪里sys_read()/ sys_open()不导出)?
  • 一般来说,如何使用SYSCALL_DEFINEn()内核中包含宏的系统调用?

c file-io kernel-module linux-kernel

89
推荐指数
2
解决办法
10万
查看次数

有没有办法弄清楚什么是使用Linux内核模块?

如果我加载内核模块并列出已加载的模块lsmod,我可以得到模块的"使用计数"(其他模块的数量与模块的引用).有没有办法弄清楚什么是使用模块?

问题是我正在开发的模块坚持它的使用计数为1,因此我不能用rmmod它来卸载它,但它的"by"列是空的.这意味着每次我想重新编译和重新加载模块时,我都必须重启机器(或者,至少,我无法找出任何其他方法来卸载它).

linux kernel kernel-module

69
推荐指数
3
解决办法
5万
查看次数

如何重新编译单个内核模块?

通常内核源存储在/usr/src/linux-2.6.x/.如果我修改模块的源代码,为了避免重新编译整个内核,我该如何重新编译该模块?

linux makefile gnu-make kernel-module linux-kernel

48
推荐指数
4
解决办法
4万
查看次数

如何配置modprobe来查找我的模块?

我正在尝试在启动时加载内核模块.

如果我跑insmod /path/to/module.ko,它运作正常.但每次重新启动时都必须重复此操作.

如果我跑modprobe /path/to/module.ko,它找不到模块.我知道modprobe使用配置文件,但即使将/path/to/module.ko添加到/ etc/modules之后我也无法加载模块.

什么是正确的配置?

kernel insmod kernel-module

46
推荐指数
3
解决办法
10万
查看次数

与`mknod`相反的是什么?

我正在学习从内核模块编程指南编写字符设备驱动程序,并用于mknod创建一个节点/dev以与我的驱动程序通信.

但是,在检查联机帮助页并观察这rmnod是一个不存在的命令之后,我找不到任何明显的删除方法.

什么是扭转效果mknod并正确删除创建的节点的正确方法/dev

command-line kernel-module linux-device-driver linux-kernel mknod

35
推荐指数
1
解决办法
2万
查看次数

交叉编译内核模块

我正在尝试在我的intel x86主机上为ARM体系结构交叉编译helloworld内核(2.6.x)模块.

ARM的代码源工具链位于:/ home/ravi/workspace/hawk/arm-2009q3

内核源代码位于:/ home/ravi/workspace/hawk/linux-omapl1

我的Makefile:

ARCH=arm
CROSS_COMPILE=arm-none-linux-gnueabi
obj-m := Hello.o
KDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(shell pwd)
default:
          $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
          $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

当我运行make时,.ko生成的是我的主机,这意味着makefile正在调用本机编译器而不是交叉编译器.我做错了什么?交叉编译器的二进制文件在我的路径中.

makefile cross-compiling kernel-module embedded-linux linux-toolchain

31
推荐指数
4
解决办法
7万
查看次数

kvm:模块验证失败:签名和/或必需的密钥丢失 - 污染内核

我正在使用Ubuntu 14.04 LTS和内核版本3.13.11.4.
我正在尝试加载修补的KVM模块kvm,kvm-intel并且我收到以下错误

kvm: module verification failed: signature and/or required key missing - tainting kernel
kvm: module has bad taint, not creating trace events.

使用的源与创建我当前正在运行的映像的源相同.
我检查了符号,并确保错误不是因为不包括EXPORT_SYMBOL_GPL()在我导出函数的修补文件中.

我也看到了一些关于不同内核版本的问题导致了这个错误,但我构建了我用我用来创建补丁kvm模块的相同源代码启动的内核.
一切都编译没有警告.任何帮助表示赞赏!

c linux kvm kernel-module linux-kernel

27
推荐指数
4
解决办法
6万
查看次数

什么是内核线程?

我刚刚开始编写设备驱动程序和新线程,编写了很多文档来了解线程.我还有一些疑惑.

  1. 什么是内核线程?
  2. 它与用户线程有何不同?
  3. 两个线程之间的关系是什么?
  4. 我该如何实现内核线程?
  5. 我在哪里可以看到实现的输出?

谁能帮我 ?.谢谢.

c operating-system kernel-module linux-kernel

25
推荐指数
3
解决办法
2万
查看次数

如何为Raspberry pi编译内核模块?

我在为raspberry pi编译内核模块时遇到了麻烦.我想使用raspberry pi本身编译一个"hello world"内核模块.

我正在使用raspbian wheezy 3.6.11+.

我尝试按照http://elinux.org/RPi_Kernel_Compilation上的说明进行操作.

这是我正在使用的Makefile:

obj-m += hello-1.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
Run Code Online (Sandbox Code Playgroud)

这是hello-1.c的源代码:

/*  
 *  hello-1.c - The simplest kernel module.
 */
#include <linux/module.h>   /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */

int init_module(void)
{
    printk(KERN_INFO "Hello world 1.\n");

    /* 
     * A non 0 return means init_module failed; module can't be loaded. 
     */
    return 0;
}

void …
Run Code Online (Sandbox Code Playgroud)

linux makefile kernel-module raspberry-pi raspbian

25
推荐指数
5
解决办法
7万
查看次数

如何在rmmod上停止Linux内核线程?

我编写了以下代码来创建内核线程:

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/kthread.h>
#include<linux/sched.h>

struct task_struct *task;
int data;
int ret;
int thread_function(void *data)
{
    int var;
    var = 10;
    return var;
}

static int kernel_init(void)
{
    data = 20;
    printk(KERN_INFO"--------------------------------------------");
    task = kthread_create(&thread_function,(void *)data,"pradeep");
    task = kthread_run(&thread_function,(void *)data,"pradeep");
    printk(KERN_INFO"Kernel Thread : %s\n",task->comm);
    return 0;
}

static void kernel_exit(void)
{
    ret = kthread_stop(task);
}

module_init(kernel_init);
module_exit(kernel_exit);
Run Code Online (Sandbox Code Playgroud)

在给出insmod命令后,我能够创建一个名为"pradeep"的内核线程,我可以使用以下ps -ef命令查看新线程 ,如下所示

root      6071     2  0 10:21 ?        00:00:00 [pradeep]
Run Code Online (Sandbox Code Playgroud)

并且它的父级是kthreadd,其PID是2.但是我无法在给出rmmod命令时停止此线程.它提供以下输出:

ERROR: Removing 'pradeep': Device or resource …
Run Code Online (Sandbox Code Playgroud)

c operating-system kernel module kernel-module

22
推荐指数
2
解决办法
4万
查看次数