2013-03-26 249 views
1

我将如何去实现我自己的文件描述符? 说如果我有一个内核模块控制某些硬件,并且我想通过read()和write()将这个硬件与用户空间进行通信的能力。不想使用IOCTL或netlink或其他用户空间内核空间方法。我是否需要重新编译内核,或者我可以通过编写内核模块来完成。我知道创建文件描述符将需要一个用户空间机制来告诉内核空间在任务的文件结构中创建一个条目(即等效于open(),eventfd(),timerfd(),socket() )。我可以通过IOCTL实现(这样我就不必重新编译内核),但是我怎样才能破解成read()和write() - 我已经用LD_PRELOAD补丁过了,是唯一的方法吗?不想重新编译内核!实现文件描述符

回答

0

我不知道我是否理解你的所有问题。尽管如此:

  • 你绝对可以拥有这个作为内核模块;
  • 你可能想要创建一个字符设备(问题的第二部分);
  • 对于char设备,您可以实现您需要的系统调用;如果你只想要有readwrite - 没问题;

看看这book的第三章(和其他)。

0

konrad.kruczynski是对的!

使用字符设备作为用户空间机制与硬件进行通信,并在/ dev/hardware_type_A等/ dev文件系统中创建设备。

然后编译& &加载模块在内核中,那么如果所有的代码是好的,那么内核将建立在/ dev目录下的字符设备/用名/ dev/hardware_type_A。

然后,您可以像使用其他设备或文件来控制硬件一样使用读取,写入,打开,关闭调用。

如果你真的说你不想通过ioctl来控制它,那么你必须需要一个新的协议,使用写入发送数据,并且驱动程序解包该数据并代表用户的程序控制硬件。

+0

谢谢你的回答,@ konrad.kruczynski&John。目前字符设备/ ioctl是我实现用户空间和内核空间之间通信的方式。我使用ioctl将指向数据结构的指针传递给KS,并且内核端模块从该结构中提取数据。但事情是我需要一个在我可以使用select()的用户空间中的实体。我需要一种方式在内核方发生事件时向美国发出信号。我知道还有其他的方式可以向美国发送信号,但美国可以用select()等待一些方法吗?我可以使用select()和字符设备吗? – lithiumhead 2013-04-02 04:51:14

+0

这真的可能由内核使用民意调查apis。参见linux/poll.h,当请求来自用户空间时,将它添加到waitqueue中,并在来自驱动程序的数据中唤醒它。在内核源文件的drivers/char /文件夹中搜索wake_up_interruptible。这最终会通过减少等待中的CPU使用来改善您的驱动程序...... – John 2013-04-02 07:14:32