实现文件描述符

时间:2013-03-26 08:49:15

标签: c linux kernel kernel-module

我如何实现自己的文件描述符? 假如我有一个内核模块控制某些硬件,我想通过read()和write()公开与这个硬件通信的能力。不想使用IOCTL或netlink或其他用户空间 - 内核空间方法。我是否需要重新编译内核,或者我可以通过编写内核模块来完成。

我理解创建文件描述符需要一种机制,让用户空间告诉内核空间在任务的文件结构中创建一个条目(即一个等同于open(),eventfd()timerfd(),socket()的函数) 。我可以通过IOCTL实现(这样我就不用重新编译内核了),但是我如何入侵read()和write() - 我之前使用LD_PRELOAD修补它们,这是唯一的方法吗?不想重新编译内核!

2 个答案:

答案 0 :(得分:0)

我不确定我理解你的所有问题。尽管如此:

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

请查看此book的第三章(及其他内容)。

答案 1 :(得分:0)

konrad.kruczynski是对的!

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

然后编译&&将模块加载到内核中,如果所有代码都正常,那么内核将在/ dev /中创建一个名为/ dev / hardware_type_A的字符设备。

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

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