对于与正在构建的PCI设备的某些交互,我们希望创建电路板可以访问的大量连续内存.就目前而言,我能够分配的最大内存大小为4兆字节.我想知道是否有任何方法可以创建更大的区域.
我知道我可以使用启动选项mem=来执行此操作,但出于numa原因,我宁愿不去这条路线.另一方面,如果有人知道这样做的方法,但是通过numa节点分发它,那就没问题了.
正如我最初所说,目前我限制在4兆字节.分配目前由完成__alloc_pages,受到限制MAX_ORDER.MAX_ORDER是一个编译时常量,我也担心编辑它可能会影响其他地方.
谢谢.
我已经看到它__iomem用于存储返回类型ioremap(),但我u32在ARM体系结构中使用它并且它运行良好.
那么__iomem这里有什么不同呢?在哪种情况下我应该使用它?
出于大学研究的目的,我正在寻找Nexus 6和三星Galaxy S6源代码的特定部分.特别是,我对"网络"和"存储"驱动程序源代码感兴趣.我访问了三星(据说是开源的)和Motorolla的开发者资源,但无法找到所需的代码.
我在这个网站上也有纯Android源代码,但我想"网络"和"存储"的驱动程序可能是特定于硬件的.
我很难找到上述两个设备的"网络"和"存储"驱动程序.如果我正在寻找的代码是开源的,有人可以告诉我他们所在的位置吗?
android driver device-driver linux-device-driver android-source
从用户空间我们可以使用cpuset实际隔离系统中的特定核心,并只执行一个特定的核心进程.
我正在尝试使用内核模块做同样的事情.所以我希望模块在一个孤立的核心中执行.换句话说:我如何cpuset在内核模块中使用?*
在我的内核模块中使用linux/cpuset.h不起作用.所以,我有一个这样的模块:
#include <linux/module.h>
#include <linux/cpuset.h>
...
#ifdef CONFIG_CPUSETS
printk(KERN_INFO, "cpusets is enabled!");
#endif
cpuset_init(); // this function is declared in cpuset.h
...
Run Code Online (Sandbox Code Playgroud)
尝试加载此模块时,我收到dmesg以下消息cpusets is enabled!.但我也收到了这条消息Unknown symbol cpu_init (err 0).
类似地,我尝试使用sched_setaffinityfrom linux/sched.h来将所有正在运行的procceses移动到特定的核心,然后将我的模块运行到一个隔离的核心.我得到了相同的错误消息:Unknown symbol sched_setaffinity (err 0).我想我得到了"未知符号",因为这些函数EXPORT_SYMBOL在内核中没有.所以我去尝试调用sys_sched_setaffinity 系统调用(基于这个问题),但又得到了这个消息:Unknown symbol sys_sched_setaffinity (err 0)!
此外,我不是在寻找一个使用的解决方案isolcpus,它在启动时设置.我想加载模块,然后发生隔离.
我开发了一个Linux设备驱动程序.截至目前,我正在Ubuntu 12.04上使用交叉编译器为arm编译它,然后在我的arm Linux映像中进行修改.但我想学习如何在Linux源代码中添加它,并通过配置arm Linux来添加/删除,以便我可以使用Linux源代码编译来编译它?
有任何想法吗?
我正在学习如何在我的Linux模块中使用sysfs,但我最难找到有关这些主题的当前文档.我一直在使用的Linux设备驱动程序第3版书似乎在这个领域相当过时(例如,class_device在当前的Linux版本中,结构似乎完全消失了).
我只是试图在我的模块的相应sysfs类下获得一个属性,这将允许我从内核空间读取模块变量的值.
在我的代码中,我创建了一个类,允许udev在/ dev/foo为我的模块创建一个设备节点:
dev_t foo_dev;
alloc_chrdev_region(&foo_dev, 0, 1, "bar");
struct class *bar = class_create(THIS_MODULE, "bar");
device_create(bar, NULL, foo_dev, NULL, "foo");
struct cdev foo_dev_file;
cdev_init(&foo_dev_file, &fops); /* fops defined earlier */
cdev_add(&foo_dev_file, foo_dev, 1);
Run Code Online (Sandbox Code Playgroud)
当我插入模块时,我得到了一个sysfs类目录,并在/ sys/class/bar/foo /中填充了一些默认属性.如何创建显示在此新目录下的属性?
我相信我的概念非常好 - 创建属性结构,定义sysfs_ops函数等 - 我的问题是我不知道使用哪个特定的内核结构(class_attribute?),也不知道如何使这些属性出现在右边sysfs目录.
有人会指点我的教程或文章详细介绍当前Linux内核的过程吗?
我在Ubuntu 14.04,CUDA工具包8,驱动程序版本367.48.
当我发出nvidia-smi命令时,它会无限期地挂起.当我再次登录并试图杀死该nvidia-smi进程时,kill -9 <PID>例如,它就没有被杀死.如果我给另一个nvidia-smi命令,我发现两个进程都在运行 - 当然是从另一个shell登录时,因为它像以前一样被卡住了.
它可能是与驱动程序有关的问题吗?这不是最新的,但还是很新的......
现在我需要实时获取NIC的状态(向上或向下).这意味着当NIC在阻塞循环中上升或下降时,我必须捕获内核中断.
我的第一个愚蠢的方法是检查/ sys/class/net/eth0/operstate或使用ioctl在循环中每100ms获取一次ifflag.但是100ms太长了,应用程序无法重新路由流量,并且每隔100ms轮询内核也不是一个好主意.
一旦我注意到inotify函数可以在块模式下监视文件.但不幸的是,它无法监视/ sys/class/net/eth0/operstate文件,因为/ sys位于RAM而非磁盘中.
那么,除了编写内核模块以使用块模式捕获C程序中的NIC中断(向上/向下)之外,是否有任何方法?
linux networking network-programming linux-device-driver linux-kernel
是什么区别module_init,并subsys_initcall在初始化的驱动程序?
在我的Linux内核进行初始PCIe总线扫描和枚举之后,我有一个FPGA(就像大多数人问这个问题一样).您可以猜到,FPGA实现了PCIe端点.
我想让PCIe核心重新枚举整个PCIe总线,这样我的FPGA就会出现,我可以加载我的驱动模块.我还希望能够为不同的配置交换FPGA负载.我的意思是,我希望能够:
所有这些都没有重启Linux
以下是其他地方提出的解决方案,但没有解决问题.
echo 1 > /sys/bus/pci/rescan 这似乎有效(仅在某些情况下),如果我想在首次枚举后热插拔FPGA负载,它就无法工作.
这是一个相当侵入性的方法(我没有测试过),也有人在其他地方提出过.https://community.freescale.com/thread/305355
可以使用PCIe的Hotplug /电源管理设施来完成这项工作吗?如果是这样,有什么好的资源可以用于如何使用PCIe的Hotplug系统?(LDD并没有完全覆盖它)
linux-kernel ×8
linux ×5
android ×1
c ×1
cpuset ×1
driver ×1
hotplugging ×1
memory ×1
networking ×1
nvidia ×1
pci-e ×1
sysfs ×1