我正在客户操作系统中编写内核模块,该模块将使用KVM在虚拟机上运行.在这里,我想在特定的物理地址上创建一个内存页面.kmalloc()给了我记忆但是在OS选择的物理地址.
背景:我正在qemu中编写一种设备仿真技术,当guest虚拟机与设备通信时它不会退出(例如,它在I/O映射以及端口映射设备中退出).基本思想如下:访客设备驱动程序将写入特定(访客)物理内存地址.qemu进程中的一个线程将连续轮询它以检查新数据(通过一些状态位等).并将采取相应的行动,而不会导致退出.由于客户端没有(现有)方式告诉主机设备驱动程序正在使用哪个地址,因此我希望为其分配预先指定的内存页面.
memory-management qemu device-driver kernel-module linux-kernel
我想在我的内核模块中获取文件系统的文件系统挂载点,这是一个可堆叠的文件系统.例如.如果/ home/ab/abc是一个文件,并且/ home安装在不同的文件系统上,我想要一个dentry或path结构到/ home.我想在模块中执行此操作而不修改内核代码.例如/ home/user /中有一个文件,现在我想知道这个文件在哪个分区.例如,此文件可能位于与"/"相同的分区中,或者此文件可能位于/ home或/ home/user上的另一个分区中.
我试图交叉编译具有规范的helloworld内核模块:
我正在使用makefile:
PWD := $(shell pwd)
obj-m := test.o
all:
$(MAKE) -C /path/to/kernel M=$(PWD) CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm modules
Run Code Online (Sandbox Code Playgroud)
arm-none-linux-gnueabi-arm工具链的前缀在哪里。
作为内核,我尝试使用来自git://github.com/CyanogenMod/cm-kernel.git内核的克隆。这是一个2.6内核派生。使用该内核,编译成功。尝试插入模块时,出现错误:
invalid module format
Run Code Online (Sandbox Code Playgroud)
可悲的是,这说得很少。
当其中一个sys文件被更改时,是否可以通知模块?我的任务是做一个控制模块内缓冲区大小的文件,我想在文件中的值改变时调整缓冲区的大小.我的另一个想法(如果我不能通知模块)是每次使用模块时检查前一个值,然后调整缓冲区的大小.
我正在使用一个小型防火墙,我必须从端口80(http)中的每个tcp数据包中检索数据以进行解析.这个代码适用于debian 32位虚拟机,我可以打印每个网页的标题,但是当我尝试加载我的内核模块并通过http端口传输一些数据时,它不打印任何数据.
当我编译时,它只在我的64位计算机上显示那些警告:
/home/dev3/C/FIREWALL/firewall.c: In function ‘hook_func’:
/home/dev3/C/FIREWALL/firewall.c:179: warning: cast from pointer to integer of different size
/home/dev3/C/FIREWALL/firewall.c:179: warning: cast to pointer from integer of different size
Run Code Online (Sandbox Code Playgroud)
有人有任何想法吗?
谢谢.
代码:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#undef __KERNEL__
#include <linux/netfilter_ipv4.h>
#define __KERNEL__
#include <linux/ip.h>
#include <linux/tcp.h>
static struct nf_hook_ops nfho;
unsigned int hook_func( unsigned int hooknum,
struct sk_buff * skb,
const struct net_device * in,
const struct net_device * out,
int (*okfn)(struct sk_buff *))
{
struct iphdr * iph;
struct …Run Code Online (Sandbox Code Playgroud) 最新的计算引擎内核是3.3.8变体,似乎没有配置AUFS支持.内核分布在主文件系统映像之外(我使用的是默认的Debian映像),Debian映像没有出现将AUFS作为一个模块.
在某个地方有可用于GCE的AUFS二进制模块吗?
如果没有,我将如何针对系统提供的内核编译模块?
我的最终目标是让Docker LXC管理器运行,而AUFS是一个依赖项.
切换到Ubuntu 13.10后,我需要为更新的内核编译设备驱动程序.调用make导致2个错误:
error: implicit declaration of function ‘kzalloc’
error: implicit declaration of function ‘kfree’
Run Code Online (Sandbox Code Playgroud)
相同的make命令在Ubuntu 13.04中运行正常,但现在失败了.我也检查过它的存在
KDIR := /lib/modules/$(shell uname -r)/build
Run Code Online (Sandbox Code Playgroud)
它在Makefile中使用,/lib/modules/3.11.0-18-generic/build在解析时变为.与此模块编译指南相比,Makefile似乎非常标准.
移动到13.10时我错过了什么?是否需要额外的包裹?build-essentials包已安装.在13.10中有其他变化吗?
在完整的错误消息的make是:
user1@pc:/etc/opt/elo-mt-usb/elo_mt_input_mod_src$ sudo make
make -C /lib/modules/3.11.0-18-generic/build SUBDIRS=/etc/opt/elo-mt-usb/elo_mt_input_mod_src modules
make[1]: Betrete Verzeichnis '/usr/src/linux-headers-3.11.0-18-generic'
CC [M] /etc/opt/elo-mt-usb/elo_mt_input_mod_src/elo_mt_input.o
/etc/opt/elo-mt-usb/elo_mt_input_mod_src/elo_mt_input.c: In function ‘elo_input_write’:
/etc/opt/elo-mt-usb/elo_mt_input_mod_src/elo_mt_input.c:79:2: error: implicit declaration of function ‘kzalloc’ [-Werror=implicit-function-declaration]
if(!(buffer = kzalloc(count, GFP_KERNEL)))
^
/etc/opt/elo-mt-usb/elo_mt_input_mod_src/elo_mt_input.c:79:14: warning: assignment makes pointer from integer without a cast [enabled by …Run Code Online (Sandbox Code Playgroud) 我有一个如下的程序.
test_module.c:
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
int init_module(void)
{
while(1) {
pr_info("hello 4 sec\n");
msleep(4 * 1000);
}
return 0;
}
void cleanup_module(void)
{
pr_info("module removed successful\n");
}
Run Code Online (Sandbox Code Playgroud)
当我加载此模块时,我的终端变得冻结/阻止.如何阻止这个程序.我试过了sudo rmmod test_module,但没用.所以我重启了我的系统.如何打破init_module?将来,如果出现问题,如果我init_module没有结束那么该怎么办?如果我们不停止会发生什么init_module?
设备地址,物理地址和虚拟地址有什么区别?
其实我mmap在司机中试图,我坚持这个概念.
我已经开发了一个内核模块来将nf4标签作为char设备进行管理。
我已经在内核外部开发了该模块,并在开发阶段对其进行了测试,将其编译为可加载的内核模块(即.ko)。
一旦驱动程序正常运行并足够稳定,我便使用补丁将其插入linux内核源代码(v4.9.30),以便将其构建为内核的一部分。
这是我在模块所在的情况 已加载 在内核引导时对其进行探测,因为它是内置的,并出现在设备树中。
现在,我想在驱动程序上进行一些改进,并且不想将这些更改直接实现到内核中。
因此,我想将驱动程序的代码集成到Linux内核中,但不要在启动时将其插入。为此,我刚刚将驱动程序的status字段更改status = "disable";为device-tree,实际上在启动时不再插入该模块。
但是我无法插入已修改的可加载模块。ENODEV由于在platform函数中找不到beeinging设备,我插入了at。
我不明白的是,为什么除了状态字段值之外,没有更改设备树,为什么找不到平台设备。
编辑:添加有关情况的精度
经过更多的探索之后,我必须弄清楚我什至没有进入回调nf4_probe。
将platform_driver_probe实现(参见此处)检查到v4.9.30内核源代码后,似乎错误来自此处:
if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
retval = -ENODEV;
Run Code Online (Sandbox Code Playgroud)
通过从命令行检查设备树,我可以看到该设备已定义为该目录/proc/device-tree/nf4tag存在,并用与设备树中对应的值填充。
编辑: @sawdust的答案后,添加有关问题的目标的精度
我显然被误解了,这status=disable意味着该设备在硬件配置上根本不存在。尽管只是描述了是否应该检测驱动程序。
为了使目标更清晰,我精确地确定了驱动程序已编码为适当的模块,并已编译为所用内核的可加载模块。
但是,我不想重新编译内核以测试我所做的每个更改。因此,我的目标是仅重新编译.ko,直到进行我的修改为止,然后,在完成所有操作后,使用补丁将这些修改添加到内置模块中。
通过这种工作方式,我可以重建.ko并将其插入到我的目标平台上,而不必为每次修改重新编译内核。
因此,恢复我的问题应该是:
如何用可加载模块替换内置模块而无需重新编译内核以禁用内置模块?
除了禁用内置模块编译到内核之外,也许没有针对此目标的解决方案。
kernel-module ×10
linux-kernel ×6
c ×3
kernel ×3
linux ×3
android ×1
arm ×1
device-tree ×1
docker ×1
filesystems ×1
netfilter ×1
qemu ×1
sysfs ×1
ubuntu ×1