问题标签 [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.

0 投票
1 回答
180 浏览

c - chardev 的主要和次要模式有多稳定?

我正在开发一个串口库,我正在考虑使用字符设备的主要/次要模式来检查给定的文件是平台串口,pty还是usb串口,以补充使用其他Linux 或 OSX 下存在的框架。

实际上,要确定文件是 USB 串口还是平台串口,有一些方法可以使用可用的框架,例如libudev在 linux 或IOKit OSX 上。但我认为要检查PTY文件,唯一的方法是使用 good old stat()

到目前为止,我在我的 debian linux 上发现PTSchardev 的主要模式都是 . 136,而在我的 OSX 上,所有 PTS 的模式都是16. 在ddg上爬,我发现Solaris可能使用主要模式24.

我可以在网上找到很多关于 PTY/PTS 及其历史的资源。openptyptypts的联机帮助页- 尽管给出了主要和次要的/dev/ptmx- 没有谈论PTS设备的主要/次要模式。并且没有资源列出跨单元的主要模式。

所以这是我的问题:

  • 对于给定的 Unix 风格,主要模式PTS(以及扩展的其他串行 chardev)是否稳定?(我正在寻找稳定在±2年的东西)
  • 那些定义在哪里?我想这是一个处理这个问题的内核驱动程序,不是吗?
  • 依靠 chardev 的主要模式来检测这是什么设备是个好主意吗?

注意:我一直犹豫在unix.SE上发帖,但由于我在代码中使用它,我认为这更像是一个在这里问的问题,关于 SO。

编辑:我在 unix.SE 上发布了一个相关问题,寻求帮助以查找其他主要模式,并查看它们在整个系统中的稳定性。我的猜测是,如果没有人有答案,至少我们可以查询系统并查看来源。

0 投票
1 回答
730 浏览

c - 在 Linux 内核空间中读取字符设备

在我的项目中,我必须用来自指定输入的数据(默认为 /dev/urandom)填充我的缓冲区。我用谷歌搜索了如何从字符设备打开和读取内核空间中的数据,但是论坛是关于如何实现我自己的字符设备的读取功能,或者如何读取(常规?)文件(根据this不推荐)文章)。我的问题是,是否有任何更简单的方法可以从指定的 chardev 读取数据,或者我必须使用这个 sysfs 文件系统?对我来说这很令人困惑,我决定在写数百行之前先问清楚。

0 投票
4 回答
7160 浏览

linux - Linux 内核:为通过 create_device() 创建的 /dev 文件设置权限

我正在制作一个小型 linux 模块,它是 char 设备的驱动程序。在我的代码中,我创建了设备类,而不是它自己的设备,因此在我的系统中创建了 /dev 文件。问题是 /dev 文件只有 root 权限,并且用户对该文件既没有读、写也没有执行权限,我想更改 /dev 文件的权限。

我在网上搜索了答案,我发现是更改 udev 文件,但这个解决方案在我的情况下不起作用,因为我需要在模块加载到内核时动态更改权限。我正在编写的模块不会总是在我的机器上运行,因此我需要它来“即时”更改权限。

有更改权限的功能吗?

0 投票
1 回答
886 浏览

linux-device-driver - 使用 remap_pfn_range 将引导时的保留内存映射到用户空间

我正在尝试使用remap_pfn_range在启动时(启动内核参数mem = 2G memmap = 30M $ 2G)将保留内存(30M,偏移量为2G)映射到用户空间,下面是我的驱动程序代码:

我的用户空间应用程序在下面

当我插入模块时它返回

但是当我执行用户空间应用程序时它返回错误

0 投票
1 回答
379 浏览

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 不再支持卸载。结果相同

(我发现了几个使用OSKextRetainKextWithLoadTagand的通用 kext 示例OSKextReleaseKextWithLoadTag ,但它们非常旧,不知道它们是否适用于最新版本的 OS X。)

知道我做错了什么吗?

谢谢你。

0 投票
1 回答
13101 浏览

c - 由于没有这样的设备或地址,打开设备文件失败

我正在尝试创建一个字符设备驱动程序(内核模块)。模块被加载,创建字符设备,如下所示:

但是当我尝试使用测试应用程序打开设备时(驱动程序中的 open 函数除了打印调试消息之外没有做任何特别的事情),我得到一个错误:

以下是 /proc/devices 的内容:

该设备存在,主要编号为 246。

这是我尝试打开设备的方式:

这是 LKM 的一个片段:

谁能帮我找出错误?如有必要,我将发布完整的代码。

0 投票
2 回答
538 浏览

linux - Linux 字符设备是否应该用换行符终止 read()

POSIX 将文本文件定义为:

包含组织成一行或多行的字符的文件。

POSIX 将一行定义为

零个或多个非换行符加上终止换行符的序列。

鉴于此,Linux字符设备驱动程序的功能是否应该在到达EOF/没有更多数据时read()附加到用户缓冲区?'\n'

0 投票
1 回答
4209 浏览

linux - 在 ioctl 上为 Linux 内核模块获取 ENOTTY

我定义了以下 chardev:

。H

模块.c

我的用户代码

总是失败并出现相同的错误:ENOTTY

设备的 ioctl 不合适

我见过类似的问题:即

Linux 内核模块 - IOCTL 使用返回 ENOTTY

Linux 内核模块/IOCTL:设备的 ioctl 不合适

但是他们的解决方案对我不起作用

0 投票
1 回答
2031 浏览

c - 从 Linux 内核模块写入 debugfs

我已经成功地dentry在匹配路径中创建了一个,但现在我该如何实际写在那里?

0 投票
0 回答
492 浏览

linux-kernel - 当文件已经存在时,为什么 device_create 不返回错误?

我正在为接口(Linux 4.9.13)编写带有字符设备的 PCI 驱动程序。这是困扰我的场景:

  1. 运行touch /dev/foo0在目录中创建一个普通文件/dev
  2. 加载驱动模块。这是一个伪代码,代表那里发生的事情(非常标准的字符设备注册):

    细节:

    • index只是另一个免费索引

对我来说似乎很奇怪的是,没有什么会引发错误,即已经有一个/dev/foo0不是字符设备的文件。我确实检查了所有错误(我认为是这样),但为了简洁起见,我省略了相关代码。如果我不运行,一切都会按预期工作touch /dev/foo0。否则,我既不能读取也不能写入设备。

为什么会这样?不应该device_create返回错误或至少创建/dev/foo1而不是?