我知道所有关于为什么不应该从内核读/写文件的讨论,而是如何使用/ proc或netlink来做到这一点.无论如何我想读/写.我也读过" 驾驶我的坚果 - 你应该在内核中做的事情".
但问题是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无法加载模块,因为链接没有正确发生.
问题:
sys_read()/ sys_open()不导出)?SYSCALL_DEFINEn()内核中包含宏的系统调用?如果我加载内核模块并列出已加载的模块lsmod,我可以得到模块的"使用计数"(其他模块的数量与模块的引用).有没有办法弄清楚什么是使用模块?
问题是我正在开发的模块坚持它的使用计数为1,因此我不能用rmmod它来卸载它,但它的"by"列是空的.这意味着每次我想重新编译和重新加载模块时,我都必须重启机器(或者,至少,我无法找出任何其他方法来卸载它).
通常内核源存储在/usr/src/linux-2.6.x/.如果我修改模块的源代码,为了避免重新编译整个内核,我该如何重新编译该模块?
我正在尝试在启动时加载内核模块.
如果我跑insmod /path/to/module.ko,它运作正常.但每次重新启动时都必须重复此操作.
如果我跑modprobe /path/to/module.ko,它找不到模块.我知道modprobe使用配置文件,但即使将/path/to/module.ko添加到/ etc/modules之后我也无法加载模块.
什么是正确的配置?
我正在学习从内核模块编程指南编写字符设备驱动程序,并用于mknod创建一个节点/dev以与我的驱动程序通信.
但是,在检查联机帮助页并观察这rmnod是一个不存在的命令之后,我找不到任何明显的删除方法.
什么是扭转效果mknod并正确删除创建的节点的正确方法/dev?
command-line kernel-module linux-device-driver linux-kernel mknod
我正在尝试在我的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
我正在使用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模块的相同源代码启动的内核.
一切都编译没有警告.任何帮助表示赞赏!
我刚刚开始编写设备驱动程序和新线程,编写了很多文档来了解线程.我还有一些疑惑.
- 什么是内核线程?
- 它与用户线程有何不同?
- 两个线程之间的关系是什么?
- 我该如何实现内核线程?
- 我在哪里可以看到实现的输出?
谁能帮我 ?.谢谢.
我在为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) 我编写了以下代码来创建内核线程:
#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) kernel-module ×10
linux-kernel ×5
c ×4
linux ×4
kernel ×3
makefile ×3
command-line ×1
file-io ×1
gnu-make ×1
insmod ×1
kvm ×1
mknod ×1
module ×1
raspberry-pi ×1
raspbian ×1