Linux kernel 如何为Linux字符设备获取结构设备

Linux kernel 如何为Linux字符设备获取结构设备,linux-kernel,linux-device-driver,embedded-linux,Linux Kernel,Linux Device Driver,Embedded Linux,我有一个Linux内核模块,它实现了一个字符设备驱动程序。我已经阅读并遵循了一些教程。现在,我有了一个简单的模块,它提供了open、release和write文件操作 我正在尝试使用通用DMA层来创建流式DMA映射。我对LDD的以下摘录感到困惑: 下面的许多函数都需要结构设备。这个结构 是Linux设备中设备的低级表示 模型这不是司机们经常要处理的事情 直接,但在使用通用DMA层时确实需要ot。 通常,您可以在特定的总线中找到这种结构 这描述了您的设备。例如,它可以作为dev struct pc

我有一个Linux内核模块,它实现了一个字符设备驱动程序。我已经阅读并遵循了一些教程。现在,我有了一个简单的模块,它提供了
open
release
write
文件操作

我正在尝试使用通用DMA层来创建流式DMA映射。我对LDD的以下摘录感到困惑:

下面的许多函数都需要
结构设备
。这个结构 是Linux设备中设备的低级表示 模型这不是司机们经常要处理的事情 直接,但在使用通用DMA层时确实需要ot。 通常,您可以在特定的总线中找到这种结构 这描述了您的设备。例如,它可以作为
dev
struct pci_设备
struct usb_设备
中的字段

我进一步阅读了Linux设备模型,遇到了以下问题:

在最低级别,Linux系统中的每个设备都由 结构设备的实例

如何获取角色设备的
结构设备
?在幕后是否有人为我创建了一个,还是我需要创建它

我尝试用
class\u create()
手动创建一个类,然后用它来创建一个带有
device\u create()
的设备,但是当我使用该设备设置DMA映射时,我想我只是得到了一个伪造的地址。这是正确的方法吗

关于我的平台的更多信息,我正在使用Altera SoCFPGA平台(ARM),因此我的设备不像USB或PCI设备那样是真正的硬件设备,而是在FPGA中实现的逻辑


我发现了很多我认为可能相关的信息(公交车、设备、司机等),但我不确定何时或如何使用它。对我来说,这一章似乎讨论了所有设备和驱动程序都使用的许多数据结构,但我感到困惑,因为我没有使用任何数据结构。

这取决于具体情况。在一种情况下,您可能会得到由core创建的设备,而在另一种情况下,您必须这样做。(我想你是第一组)

用于DMA的设备指针应表示在硬件中执行实际DMA的设备。因此,你的方法是错误的


预先订购LDD4可能会更好。

我也遇到了同样的问题。这并不是一个完整的答案,但在大多数文档中,基本假设是基本字符设备(不是由某个更高级别的总线驱动程序等实例化的)不需要访问DMA。我找到了另一种快捷方式来获取我所需要的东西,而无需使用
struct设备
,但看起来您可以使用或类似的工具创建自己的设备。

我最终创建了一个平台驱动程序和平台设备。平台设备结构有它自己的
struct device
与平台总线相关联,这是一个“伪总线”,专为类似的事情而设计。站台司机的官员在这里很有帮助


最后,我的模块实现了平台驱动程序和字符设备驱动程序。给我带来最大麻烦的部分是创建平台设备并将其与我的平台驱动程序关联。首先,我使用
platform\u device\u alloc
platform\u device\u register
手动创建设备(在模块安装时)。一旦我完成了这项工作,我就取消了手动设备创建,而是依靠设备树条目来创建我的设备。

你能详细介绍一下让core创建设备吗?谢谢你的回答-它提醒我回到这里并发布更新!