hebothu 2015-03-03 00:43 采纳率: 0%
浏览 1787

在我的例子里,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()的理解有没有问题?感谢。

  • 写回答

3条回答 默认 最新

  • kof98765 2015-03-03 00:51
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 github训练的模型参数无法下载
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题