1

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

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

4

2 回答 2

0

konrad.kruczynski 是对的!

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

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

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

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

于 2013-03-31T18:00:04.823 回答
0

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

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

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

于 2013-03-26T08:59:13.997 回答