Linux kernel 实现mmap()的内核驱动程序是否必须创建字符设备?

Linux kernel 实现mmap()的内核驱动程序是否必须创建字符设备?,linux-kernel,buffer,driver,mmap,dma,Linux Kernel,Buffer,Driver,Mmap,Dma,我试图编写一个内核驱动程序来管理一些物理上连续的内存块和DMAable内存(我使用kmalloc(),因为它们只是DMA流)。为了将一些功能引入用户空间,该内存将使用自己的mmap()实现mmap()。我一直在使用Linux设备驱动程序和谷歌上的坏例子作为我的主要信息来源 我的mmap()(现在称之为My_mmap())需要向内核注册。使用struct file\u operations似乎是唯一有效的方法,但这需要为其创建字符设备和物理位置。我不想那样做。我只想为用户空间应用程序创建一个虚拟地

我试图编写一个内核驱动程序来管理一些物理上连续的内存块和DMAable内存(我使用
kmalloc()
,因为它们只是DMA流)。为了将一些功能引入用户空间,该内存将使用自己的
mmap()
实现
mmap()
。我一直在使用Linux设备驱动程序和谷歌上的坏例子作为我的主要信息来源

我的
mmap()
(现在称之为
My_mmap()
)需要向内核注册。使用
struct file\u operations
似乎是唯一有效的方法,但这需要为其创建字符设备和物理位置。我不想那样做。我只想为用户空间应用程序创建一个虚拟地址来访问内存缓冲区,而不是创建任何文件来映射内存缓冲区。这可能吗

我确实发现帧缓冲区也有一个与
mmap()
实现相当的结构,但这太麻烦了。这就增加了更多的未知数

据我所知,
my_mmap()
可以完成繁重的工作,并使用
remap\u pfn\u range()
,只要我对失去的灵活性感到满意。否则,我必须实现一个本地
nopage()
,并使用
struct vm\u operations\u struct
注册它。这是否正确?

操作是来自用户空间的请求,用于将某个源映射到其虚拟地址空间。用户空间程序识别它感兴趣的源的方法是提供一个文件描述符(它实际上只是内核已知资源的句柄)

这意味着您必须将设备表示为文件描述符,以便用户空间程序可以告诉内核它对它感兴趣(内核知道调用
mmap()
实现)-注册字符设备是典型的方法。请注意,帧缓冲区设备也是通过字符设备访问的


如果对您的设备没有意义,则不必执行其他字符设备操作,如
read()
write()
。字符设备只是用户空间程序打开设备内核管理句柄的一种方式。

我已经在使用Netlink进行一些通信。因此,我可以获取传递给netlink\u create的
struct socket*sock
,访问
ops
字段(a
struct-struct\u-proto\u-ops
)并修改
ops
中的
mmap
字段。这行吗?更正,Netlink使用
Netlink\u ops
变量来指向所有sock->ops。所以我必须复制
netlink\u ops
并修改
mmap
字段。@Joshua,你的建议可能行得通,但我不认为用普通方式来处理内核有什么意义。按照正常的方式,您有更好的机会避免不好的意外情况。@Joshua:向netlink套接字添加
mmap()
处理程序可能会有用,但这会有点奇怪。@Joshua,我不能说mmap()是否可以在没有任何文件的情况下使用,但完全创建字符设备是不必要的。在我的项目中,我在debugfs中创建了一个更简单的文件,并使用该文件将内核空间中的缓冲区映射到用户空间并通过它传递数据,请参见此处的
buffer\u mmap\u fault()
buffer\u file\u mmap()
。也许这会有帮助。