标签: linux-device-driver

在Linux内核中分配超过4 MB的固定连续内存

对于与正在构建的PCI设备的某些交互,我们希望创建电路板可以访问的大量连续内存.就目前而言,我能够分配的最大内存大小为4兆字节.我想知道是否有任何方法可以创建更大的区域.

我知道我可以使用启动选项mem=来执行此操作,但出于numa原因,我宁愿不去这条路线.另一方面,如果有人知道这样做的方法,但是通过numa节点分发它,那就没问题了.

正如我最初所说,目前我限制在4兆字节.分配目前由完成__alloc_pages,受到限制MAX_ORDER.MAX_ORDER是一个编译时常量,我也担心编辑它可能会影响其他地方.

谢谢.

memory linux-device-driver linux-kernel

19
推荐指数
1
解决办法
8193
查看次数

在编写设备驱动程序时,linux中__iomem的用途是什么?

我已经看到它__iomem用于存储返回类型ioremap(),但我u32在ARM体系结构中使用它并且它运行良好.

那么__iomem这里有什么不同呢?在哪种情况下我应该使用它?

linux memory-management linux-device-driver linux-kernel

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

存储和网络设备驱动程序源代码为Nexus 6和三星Galaxy S6

出于大学研究的目的,我正在寻找Nexus 6和三星Galaxy S6源代码的特定部分.特别是,我对"网络"和"存储"驱动程序源代码感兴趣.我访问了三星(据说是开源的)和Motorolla的开发者资源,但无法找到所需的代码.

我在这个网站上也有纯Android源代码,但我想"网络"和"存储"的驱动程序可能是特定于硬件的.

我很难找到上述两个设备的"网络"和"存储"驱动程序.如果我正在寻找的代码是开源的,有人可以告诉我他们所在的位置吗?

android driver device-driver linux-device-driver android-source

19
推荐指数
1
解决办法
463
查看次数

使用Cpuset将内核模块隔离到特定的核心

从用户空间我们可以使用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,它在启动时设置.我想加载模块,然后发生隔离.

  • (更确切地说,我希望它的内核线程在隔离的内核中执行.我知道我可以使用affinity将线程绑定到特定的内核,但这并不能保证内核会被运行在其上的其他进程隔离. )

linux linux-device-driver linux-kernel cpuset

19
推荐指数
1
解决办法
4293
查看次数

在linux源代码中添加新的驱动程序代码

我开发了一个Linux设备驱动程序.截至目前,我正在Ubuntu 12.04上使用交叉编译器为arm编译它,然后在我的arm Linux映像中进行修改.但我想学习如何在Linux源代码中添加它,并通过配置arm Linux来添加/删除,以便我可以使用Linux源代码编译来编译它?

有任何想法吗?

linux-device-driver linux-kernel

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

如何在Linux内核v3.2中创建一个简单的sysfs类属性

我正在学习如何在我的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内核的过程吗?

c linux linux-device-driver linux-kernel sysfs

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

nvidia-smi进程挂起,也不能用SIGKILL杀死

我在Ubuntu 14.04,CUDA工具包8,驱动程序版本367.48.

当我发出nvidia-smi命令时,它会无限期地挂起.当我再次登录并试图杀死该nvidia-smi进程时,kill -9 <PID>例如,它就没有被杀死.如果我给另一个nvidia-smi命令,我发现两个进程都在运行 - 当然是从另一个shell登录时,因为它像以前一样被卡住了.

它可能是与驱动程序有关的问题吗?这不是最新的,但还是很新的......

linux nvidia linux-device-driver

18
推荐指数
1
解决办法
5943
查看次数

如何在不轮询内核的情况下监视C程序中的NIC状态(向上/向下)?

现在我需要实时获取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

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

17
推荐指数
1
解决办法
9291
查看次数

如何进行TRUE重新扫描PCIe总线

在我的Linux内核进行初始PCIe总线扫描和枚举之后,我有一个FPGA(就像大多数人问这个问题一样).您可以猜到,FPGA实现了PCIe端点.

我想让PCIe核心重新枚举整个PCIe总线,这样我的FPGA就会出现,我可以加载我的驱动模块.我还希望能够为不同的配置交换FPGA负载.我的意思是,我希望能够:

  1. 启动Linux
  2. 配置FPGA
  3. 枚举PCIe端点和加载模块
  4. 删除PCIe端点
  5. 重新配置FPGA
  6. 重新枚举PCIe端点

所有这些都没有重启Linux

以下是其他地方提出的解决方案,但没有解决问题.

echo 1 > /sys/bus/pci/rescan 这似乎有效(仅在某些情况下),如果我想在首次枚举后热插拔FPGA负载,它就无法工作.

这是一个相当侵入性的方法(我没有测试过),也有人在其他地方提出过.https://community.freescale.com/thread/305355

可以使用PCIe的Hotplug /电源管理设施来完成这项工作吗?如果是这样,有什么好的资源可以用于如何使用PCIe的Hotplug系统?(LDD并没有完全覆盖它)

linux-device-driver linux-kernel hotplugging pci-e

17
推荐指数
2
解决办法
5万
查看次数