问题标签 [chardev]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 使用 cudaHostRegister 注册映射的 Linux 字符设备内存会导致参数无效
我正在尝试通过以下方式提高 DMA<->CPU<->GPU 数据传输: 1. 将我的(专有)设备 Linux 内核分配的内存映射到用户空间 2. 使用 cudaHostRegister API 函数将后者(映射的内存)注册到 Cuda。
虽然映射用户空间分配的内存映射到我的设备 DMA,然后使用 cudaHostRegister 注册到 Cuda 工作得很好,但尝试注册“kmalloced”内存会导致 cudaHostRegister 返回“无效参数”错误。
首先,我认为问题在于对齐或我的设备驱动程序复杂的内存池管理,所以我编写了一个最简单的字符设备,它实现了 .mmap() ,其中 kzalloced 10Kb 缓冲区用 remap_pfn_range 重新映射,问题仍然存在。
不幸的是,我在网上没有找到任何类似的问题,所以我真诚地希望我能在这里找到答案。
一些系统信息和内核驱动程序 <-> 用户空间应用程序代码 + 运行时日志信息:
字符设备 mmap() 代码:
测试应用代码:
运行时调试信息:
用户空间:
内核空间(tail -f /var/log/syslog):
提前谢谢。
c - 字符设备:选择要读/写的设备
我找到了一个很好的代码作为字符设备模块的示例:https ://github.com/euspectre/kedr/blob/master/sources/examples/sample_target/cfake.c
我没有修改代码并对其进行了测试。我获得了两个设备(/dev/cfake0 和 /dev/cfake1),但我想了解一些东西。
导出了两个设备,但只有一个读取函数,如何指定每个设备使用哪个读取函数(如果实现了两个读取函数)?
最后我想在同一个模块上有两个字符设备(一个用于 I2C 通信,另一个用于 SPI),模块和用户空间需要通信,所以我需要将它们都导出。
c - 为什么在尝试“cat”我的 char 设备驱动程序时收到错误消息?
我为 Linux 编写了一个简单的字符设备驱动程序。
它是一个简单的消息存储/检索系统,其中消息存储在内核空间中。
我应该能够做这样的事情:
然后检索消息
消息存储在队列中。
当我尝试检索我硬编码用于测试的消息(消息是“hello”)时,我得到以下命令行输出:
所以我按预期收到了你好消息,但显然我做的事情不太正确。
这是处理设备读取的函数。
module - 字符设备读取命令无限打印(通过cat命令)
使用 cat 命令从设备文件中读取时,我会循环打印字符设备上的写入数据。我是新手,所以我可能做错了,希望能得到一些帮助来解决这个问题`
c - 用 `mmap` 替换 `chardev`
我正在寻找一种方法来同步内核驱动程序和一些用户级代码(没有任何 copy_to_user 或在 mmap 上轮询)
更多解释:
我的用户端代码在共享 mmap 中读取了一些数据,但它需要知道数据何时从驱动程序准备好我已经尝试使用信号来安排一切,但性能甚至低于使用常规 char 设备(使用 copy_to 用户)
(在 4.1.15 内核上工作)
任何想法 ?
[编辑] 我现在尝试使用 msync
linux - 当一次就足够了,为什么 cat 调用 read() 两次?
我是 Linux 内核模块的新手。我正在学习基于网络课程的字符驱动模块。我有一个非常简单的模块来创建一个/dev/chardevexample
,我有一个问题需要我理解:
当我这样做时,我会按预期echo "hello4" > /dev/chardevexample
看到执行一次。write
但是,当我这样做时cat /dev/chardevexample
,我看到读取执行了两次。
我在我的代码和课程材料中都看到了这一点。所有数据都在 first 中返回read()
,为什么cat
还要调用它呢?
到目前为止,我所做的所有事情如下:
insmod chardev.ko
加载我的模块echo "hello4" > /dev/chardevexample
. 这是写的,我看到它在 dmesg 中只发生过一次cat /dev/chardevexample
. 这是读取,并dmesg
显示它发生了两次。我做到了
/li>strace cat /dev/chardevexample
,我确实看到函数调用被调用两次以进行读取。中间也有写
/li>dmesg
读后(cat 命令)附加了读取、写入和文件操作的代码片段。任何指导都会有所帮助。我广泛搜索并无法理解。于是发帖。
/li>
c - 更改 IOctl cdev 的默认权限
我正在从 Android 设备上的本机 OpenGL 框架添加一个 IOctl 调用,以便我可以通过跟踪内核模块在内核中记录帧信息。在我的内核模块中,我正在cdev
为 IOctl 调用创建,但我的开发人员的默认权限为 6000,并且由于用户级 IOctl 调用来自非 root 进程,因此open
调用无法打开所需的文件描述符ioctl
通话。
我的 cdev 方法非常标准,如下所示(注意devnode
是尝试修复权限,请参阅this)。
同样使用 misc dev 和.mode=0666
我有同样的问题
这两种方法一旦运行就可以工作,chmod 666 /dev/$EGL_SYSLOGGER_NAME
但我希望找到一个不需要这种干预的解决方案。根据这篇文章,杂项开发方法应该可以解决我的问题,但我没有取得任何成功。
我不确定我错过了什么,非常感谢一些提示。
干杯
c++ - 系统调用是线程安全的吗?
我写了一个内核模块,它是一个类似于这个 Link的字符设备驱动程序。驱动程序的内部结构如下:
所以我有一个使用这个驱动程序的多线程应用程序,我目前以下列方式使用这个驱动程序:
所以,问题是我的应用程序中的 4 个线程是否调用这些函数来读取或写入它们自己的 ChannelId,像这样读取或写入驱动程序:
是否有数据竞赛或类似的事情发生?
module - 添加设备驱动程序后尝试启动时出现分段错误
添加我自己的内核模块(一个简单的乘法器模块)源文件后,我正在尝试编译和安装 linux 4.20.17。我能够成功地使用源文件编译和安装 linux-4.20.17。当我尝试启动系统时会出现问题。插入乘法器模块时出现分段错误。
当我尝试使用 insmod 自行插入模块时,一切正常。我什至可以创建一个设备文件,对其进行读写。
这是我的 module_init() 函数。
我读到“模块在启动时无法保留资源”。这是造成问题的原因吗?kmalloc 语句是否导致分段错误?
编辑:我通过恢复模式启动并尝试查看完整的错误跟踪。但我找不到分段错误。但这是加载乘法器模块的调用跟踪。
我对设备驱动程序很陌生,我似乎无法从这些日志中理解我尝试从日志中查找一些代码和短语,但无法得出任何可靠的结果。
c - 为什么模块加载失败?(/dev/scull0 : 没有这样的设备或地址)
从我之前的问题:如何在 ubuntu 中构建外部模块?我以为我无法加载模块,因为loading out-of-tree
or tainting kernel
,但是我的scull_init_module
(下面的来源)我已经添加了printk
,所以我知道我是从内核日志加载的。但我没有(日志中没有输出——日志与链接中的相同)。
uname -a
== 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2 (2020-04-29) x86_64 GNU/Linux
(不使用 ubuntu - 来自链接)。
scull_init_module
:
它基本上来自Linux 设备驱动程序,第三版,第 3 章。但我是手写的(没有复制/粘贴)。alloc_chrdev_region
被正确调用,所以是scull_setup_cdev
,那么哪里可能有问题?
编辑(dmesg 的输出):dmesg
看起来它确实加载了模块:
但是仍然/dev/scull0
给出的节点No such device or address
因此,如果设备已正确注册(请参阅 dmesg)并且我在 /dev 层次结构中创建节点,那么意味着no device or address
什么?为什么我会得到它?
EDIT2(函数 scull_setup_cdev):