问题标签 [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.
c - chardev 的主要和次要模式有多稳定?
我正在开发一个串口库,我正在考虑使用字符设备的主要/次要模式来检查给定的文件是平台串口,pty还是usb串口,以补充使用其他Linux 或 OSX 下存在的框架。
实际上,要确定文件是 USB 串口还是平台串口,有一些方法可以使用可用的框架,例如libudev
在 linux 或IOKit
OSX 上。但我认为要检查PTY
文件,唯一的方法是使用 good old
stat()
:
到目前为止,我在我的 debian linux 上发现PTS
chardev 的主要模式都是 .
136
,而在我的 OSX 上,所有 PTS 的模式都是16
. 在ddg上爬,我发现Solaris可能使用主要模式24.
我可以在网上找到很多关于 PTY/PTS 及其历史的资源。openpty、pty或pts的联机帮助页- 尽管给出了主要和次要的/dev/ptmx
- 没有谈论PTS
设备的主要/次要模式。并且没有资源列出跨单元的主要模式。
所以这是我的问题:
- 对于给定的 Unix 风格,主要模式
PTS
(以及扩展的其他串行 chardev)是否稳定?(我正在寻找稳定在±2年的东西) - 那些定义在哪里?我想这是一个处理这个问题的内核驱动程序,不是吗?
- 依靠 chardev 的主要模式来检测这是什么设备是个好主意吗?
注意:我一直犹豫在unix.SE上发帖,但由于我在代码中使用它,我认为这更像是一个在这里问的问题,关于 SO。
编辑:我在 unix.SE 上发布了一个相关问题,寻求帮助以查找其他主要模式,并查看它们在整个系统中的稳定性。我的猜测是,如果没有人有答案,至少我们可以查询系统并查看来源。
c - 在 Linux 内核空间中读取字符设备
在我的项目中,我必须用来自指定输入的数据(默认为 /dev/urandom)填充我的缓冲区。我用谷歌搜索了如何从字符设备打开和读取内核空间中的数据,但是论坛是关于如何实现我自己的字符设备的读取功能,或者如何读取(常规?)文件(根据this不推荐)文章)。我的问题是,是否有任何更简单的方法可以从指定的 chardev 读取数据,或者我必须使用这个 sysfs 文件系统?对我来说这很令人困惑,我决定在写数百行之前先问清楚。
linux - Linux 内核:为通过 create_device() 创建的 /dev 文件设置权限
我正在制作一个小型 linux 模块,它是 char 设备的驱动程序。在我的代码中,我创建了设备类,而不是它自己的设备,因此在我的系统中创建了 /dev 文件。问题是 /dev 文件只有 root 权限,并且用户对该文件既没有读、写也没有执行权限,我想更改 /dev 文件的权限。
我在网上搜索了答案,我发现是更改 udev 文件,但这个解决方案在我的情况下不起作用,因为我需要在模块加载到内核时动态更改权限。我正在编写的模块不会总是在我的机器上运行,因此我需要它来“即时”更改权限。
有更改权限的功能吗?
linux-device-driver - 使用 remap_pfn_range 将引导时的保留内存映射到用户空间
我正在尝试使用remap_pfn_range在启动时(启动内核参数mem = 2G memmap = 30M $ 2G)将保留内存(30M,偏移量为2G)映射到用户空间,下面是我的驱动程序代码:
我的用户空间应用程序在下面
当我插入模块时它返回
但是当我执行用户空间应用程序时它返回错误
c++ - 自动卸载 OS X 驱动程序
这是我的第一个问题:)
我目前正在编写一个通用的 kext,它提供了一个字符设备并以 OSX 10.7+ 为目标。它是纯 C,IOKit/C++ 为零。(如果这很重要,我正在 10.11 上测试驱动程序。)
我希望在所有引用字符设备的文件描述符都关闭后卸载驱动程序,但这似乎不起作用。
根据Apple的文档OSKextRetainKextWithLoadTag
:
启用自动卸载后,在删除 kext 的最后一个引用后不久,如果没有对它的未完成引用并且没有其 Libkern C++ 子类的实例(如果有),它将被卸载。
...
定义 IOService 子类的 Kexts 会自动启用 autounload。其他 kexts 可以使用引用计数来管理自动卸载,而无需定义和创建 Libkern C++ 对象。
如上所述,我的 kext 没有任何子IOService
类(或任何类,就此而言),所以我应该能够使用OSKextRetainKextWithLoadTag
.
但是,在关闭所有文件描述符之后,kext 将永远保持加载:
此外,我编写了我的 kext 的“混合”版本,其中我使用提供IOService
子类(IOResources
作为提供者)的薄 C++ 包装器包装了启动和停止例程,以防通用 kext 不再支持卸载。结果相同。
(我发现了几个使用OSKextRetainKextWithLoadTag
and的通用 kext 示例OSKextReleaseKextWithLoadTag
,但它们非常旧,不知道它们是否适用于最新版本的 OS X。)
知道我做错了什么吗?
谢谢你。
c - 由于没有这样的设备或地址,打开设备文件失败
我正在尝试创建一个字符设备驱动程序(内核模块)。模块被加载,创建字符设备,如下所示:
但是当我尝试使用测试应用程序打开设备时(驱动程序中的 open 函数除了打印调试消息之外没有做任何特别的事情),我得到一个错误:
以下是 /proc/devices 的内容:
该设备存在,主要编号为 246。
这是我尝试打开设备的方式:
这是 LKM 的一个片段:
谁能帮我找出错误?如有必要,我将发布完整的代码。
linux - 在 ioctl 上为 Linux 内核模块获取 ENOTTY
我定义了以下 chardev:
。H
模块.c
我的用户代码
总是失败并出现相同的错误:ENOTTY
设备的 ioctl 不合适
我见过类似的问题:即
Linux 内核模块 - IOCTL 使用返回 ENOTTY
Linux 内核模块/IOCTL:设备的 ioctl 不合适
但是他们的解决方案对我不起作用
c - 从 Linux 内核模块写入 debugfs
我已经成功地dentry
在匹配路径中创建了一个,但现在我该如何实际写在那里?
linux-kernel - 当文件已经存在时,为什么 device_create 不返回错误?
我正在为接口(Linux 4.9.13)编写带有字符设备的 PCI 驱动程序。这是困扰我的场景:
- 运行
touch /dev/foo0
在目录中创建一个普通文件/dev
。 加载驱动模块。这是一个伪代码,代表那里发生的事情(非常标准的字符设备注册):
细节:
index
只是另一个免费索引
对我来说似乎很奇怪的是,没有什么会引发错误,即已经有一个/dev/foo0
不是字符设备的文件。我确实检查了所有错误(我认为是这样),但为了简洁起见,我省略了相关代码。如果我不运行,一切都会按预期工作touch /dev/foo0
。否则,我既不能读取也不能写入设备。
为什么会这样?不应该device_create
返回错误或至少创建/dev/foo1
而不是?