嗨,我已经编写了一个内核模块,它使用2 MB kmalloc(用于物理连续内存)并将其虚拟地址转换为总线地址,然后将其virt_to_bus()发送回应用程序.
我需要总线地址,因为我必须将它传输到另一个运行linux的系统并使用pcie-link连接到主机系统.现在另一个系统将能够使用该总线地址启动DMA传输.
问题是:virt_to_bus()已弃用并导致警告,还有其他方法将此地址转换为总线地址吗?
我是内核编程的新手。当我浏览时module_param,我对权限值 0 感到困惑。有人解释说,它不会在 sysfs 中获得条目,而其他人S_IRUGO会获得条目。我无法理解这个概念。
perm 值 0 表示什么?我们什么时候需要 sysfs 条目?有什么必要呢?
请指导我。提前致谢。
我在内核模块中创建了WRITE_IOCTL,并在用户模式下调用它:
ioctl(fd, WRITE_IOCTL, "Hello, Kernel!");
Run Code Online (Sandbox Code Playgroud)
在内核模式中,我有:
static int device_ioctl(struct file *filp,
unsigned int cmd, unsigned long args) {
char buff[14];
switch (cmd) {
case WRITE_IOCTL:
copy_from_user( buff,(char *)args, 14);
printk("This message received from User Space: %s\n", buff);
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个ioctl时,我在/var/log/kern.log中有类似的东西:
This message received from User Space: Hello, Kernel!vE?
This message received from User Space: Hello, Kernel!M?
This message received from User Space: Hello, Kernel!M?
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题??
我正在尝试编译Linux设备驱动程序(内核模块),但该模块最后一次更新于2013年4月,当然它不再编译在最近的(3.13)内核上,这是错误:
als_sys.c:99:2: error: unknown field ‘dev_attrs’ specified in initializer
Run Code Online (Sandbox Code Playgroud)
我已经搜索了但是我发现的所有内容都是补丁,没有关于更新旧模块的明确"教程",我唯一理解的是我需要使用dev_groups它,但它不接受相同的值dev_attrs和我不知道如何调整现有代码.
代码(其中一些,整个代码可以在这里找到):
# als_sys.c
static ssize_t
illuminance_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct als_device *als = to_als_device(dev);
int illuminance;
int result;
result = als->ops->get_illuminance(als, &illuminance);
if (result)
return result;
if (!illuminance)
return sprintf(buf, "0\n");
else if (illuminance == -1)
return sprintf(buf, "-1\n");
else if (illuminance < -1)
return -ERANGE;
else
return sprintf(buf, "%d\n", illuminance);
}
# truncated - also "adjustment_show" is similar …Run Code Online (Sandbox Code Playgroud) 由于libc在用户空间下运行,因此内核模块无法调用libc.
还有一些其他内核指定的API就像printk()一样使模块正常工作.
据我所知,libc是几个标准c函数obj(s)的集合.
它应该存在一个集合(或库)来包含几个内核标准函数对象.
所以我可以将我的内核模块与这些内核标准库链接起来,对吧?
简而言之,我的问题如下......
在用户空间:
aaa.o链接bbb.o调用myfunc()
aaa.o链接libc.so以调用printf()
在内核空间:
aaa.ko链接bbb.ko调用myfunc()?这是Question1
aaa.ko链接xxx来调用printk()?什么是xxx,问题2
谢谢 !
我想在我的驱动程序(调试)输出前加上它的名字,即[myDriver] Actual message. 因为printk(level NAMEMACRO "Actual message\n")每次我想覆盖printk/pr_*实际包含该[myDriver]部分时都写起来很烦人。但是我想不出办法来做到这一点。在最好的情况下,解决方案不会强迫我更改代码中的printk/pr_*调用(更改调用后,这变得微不足道)。
这可能吗?(由于我包含了其他标题,而这些printk标题又包含标题,因此将始终定义此规则,因此不会按照不同的 so 答案中的建议链接到原始内容)
现在的司机有什么理由不注意这个文本吗?(还有另一种方法可以按驱动程序过滤 dmesg 吗?)
我有点意识到,dev_dbg但我还没有发现任何针对一般警告的开发人员,所以我将使用printk/ pr_err。
我正在从事学术项目,修改一些Kernel Networking代码并包含一个新的Kernel module.
我正在使用 QEMU 加载修改后的内核并进行测试。
但是,我发现某些系统需要完整的操作系统.img才能进行调试。
没有它可能吗?
或者,这是可以与 Kernel 2.6 系统一起使用的发行版。除了运行程序的能力(包括网络支持)之外,发行版不需要具有任何功能。
如果在模块内置到内核中或者不允许模块卸载的情况下不会进行任何内存分配,那么为什么首先要使用它呢?如果我错了/假设有任何错误,请纠正我。
编辑-我也无法理解它的用途是什么__exit。module_exit()应该够还是不够?
所以我正在尝试编写一个简单的 hello 模块,无需说新手:)
但是,在执行创建 make 文件的步骤时 - 我看到的是我在 uname -r/ build处没有 build 文件夹, 所以我创建了一个 - 如果我想下载,我不确定它本身应该是问题,而不是创建 build 文件夹一些包裹?
也在网上看有解决方案说我需要做以下步骤
prepare-kernel-sources cd /usr/src/linux - 现在我也没有 linux 文件夹 cp -rf include/generated/* include/linux/
make: Entering directory `/lib/modules/2.6.32-5-amd64/build'
make: *** No rule to make target `modules'. Stop.
make: Leaving directory `/lib/modules/2.6.32-5-amd64/build'
Run Code Online (Sandbox Code Playgroud)
我尝试安装以下软件包 - 只有突出显示的软件包才会出现错误
**apt-get install linux-headers-$(uname -r)** goes through
apt-get install Linux-headers-generic
apt-get install build-essentials
apt-cache search linux-headers-$(uname -r)
apt-get install kernel-source-$(uname -r)
**apt-get source linux-image-$(uname -r)** goes through
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
我正在尝试在我的CentOS7服务器上加载nbd网络块设备.但是,我得到了:
modprobe nbd
modprobe: FATAL: Module nbd not found.
Run Code Online (Sandbox Code Playgroud)
如果有人能告诉我nbd加载模块的最佳方法,我们将非常感激.最后,我希望我可以通过ansible自动完成这项任务.
这是我的内核版本:
$ uname -r
3.10.0-327.28.3.el7.x86_64
Run Code Online (Sandbox Code Playgroud)
谢谢!
linux kernel-module linux-kernel network-block-device centos7
kernel-module ×10
linux-kernel ×8
linux ×5
c ×4
kernel ×4
centos7 ×1
init ×1
makefile ×1
module ×1
qemu ×1