开发者社区> 问答> 正文

在我的例子里,Linux的kernel与user space如何进行通信才好?

我的例子大概如下:
我想做一个简单的分布式文件系统。在client端,当某个用户态应用程序open()一个远程文件时,VFS会去通知另一个专用的用户态应用程序,然后这个专用的用户态应用程序会去server端把远程文件缓存到本地,然后通知VFS这个缓存文件的路径。然后VFS会去打开这个缓存文件,再把文件的描述符返回给最开始的用户态应用程序。
在这里,我要进行kernel和user space的通信。一方面,在kernel里的VFS要告诉专用的用户态应用程序,我要打开的远程文件的路径是什么;另一方面,专用的用户态应用程序要告诉VFS,缓存下来的文件的路径是什么。
我目前是使用netlink socket来实现这个功能。这是没有问题的。但是由于我对Linux kernel并不熟悉,所以我不知道是不是还有其它更加有效的方式来解决这个问题。
比如,我之前在想,能不能用mmap()的方式实现kernel和user space之间的通信。但是我在了解了一下之后发现,在我的这个例子里,好像我必须要写一个驱动程序,才能提供一个设备文件作为mmap()的后盾。这在用法上就有点像命名管道或者命名socket(或者叫Unix domain socket?),感觉没什么意思,而且似乎也不太容易整合进VFS去。
然后,我又在想,能不能让VFS和这个专用的用户态应用程序somehow约定一个user space的缓冲区地址,然后VFS直接copy_to_user()(专用的用户态应用程序就直接写这个缓冲区)。但是我又不知道要怎样约定这个缓冲区的地址才好,以及怎么通知对方说我写了新的数据进去。
所以在这里求教。有没有什么好的办法在我的这个例子里实现kernel与user space的通信?以及我对mmap()、命名管道、命名socket或者copy_to_user()的理解有没有问题?感谢。

展开
收起
杨冬芳 2016-07-11 11:12:09 2800 0
2 条回答
写回答
取消 提交回答
  • 你框架就没选对, 这类需求用fuse做最合适了. 它不光替你处理好了这些通信什么的, 更重要的是它替你搭好了一个基本的文件系统的架子

    2019-07-17 19:54:03
    赞同 展开评论 打赏
  • IT从业

    改写VFS驱动,只要是涉及到内核,都是需要写内核模块的,驱动也是内核模块的一种,理解上是没有错的,只是这样用的话,对你来说就转折了点

    2019-07-17 19:54:03
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载