12

What are the ways to communicate with a kernel module from user space? By communication i mean sending information and commands between the kernel module and a user space process.

I currently know of two way:

  1. open/close/read/write/ioctl on published device node.
  2. read/write on exported and hooked /proc file.

More specifically, can someone advice the best way to communicate with a kernel module that does not actually drives any hardware and therefore should not be littering /dev with stub nodes that exists solely for ioctl calls? I mostly need to check its various status variables and send it a block of data with a request type tag and see if the request succeeded.

Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985
Inso Reiges
  • 1,889
  • 3
  • 17
  • 30

6 Answers6

9

There's also the /sys filesystem (sysfs):

Sysfs exports information about devices and drivers from the kernel device model to userspace, and is also used for configuration.

(from Wikipedia)

UncleZeiv
  • 18,272
  • 7
  • 49
  • 77
9

Netlink sockets are designed for that kind of requirements, too...

Also see

filofel
  • 1,358
  • 7
  • 11
3

You could also read/write from /dev device nodes.

IMHO, /dev is already littered with stuff and adding your own nodes there isn't a big issue. Don't forget that you can have lots of ioctl codes for a single device node, and the ioctl paramters are passed by reference so can be as big as you like.

Artelius
  • 48,337
  • 13
  • 89
  • 105
2

Third one is add a new syscall, but the two you have written are the preferred ones, I think. I've found this document that might help, but I still think this option is unadvised: http://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_add_systemcall.html

Another acceptable option might be sharing memory.

fortran
  • 74,053
  • 25
  • 135
  • 175
  • I know about replacing a syscall by patching the table, but how do i add a new one? – Inso Reiges May 25 '10 at 09:59
  • I think I read about that in Linux Device Drivers book once, let me take a look... – fortran May 25 '10 at 10:02
  • 5
    Adding new syscalls is strongly discouraged by kernel developers. In newer kernels they have deliberately made it more difficult. – Eric Seppanen May 25 '10 at 15:54
  • @Eric yes, that's the idea I had... I just wanted to show that the option was still there, but remarking that the other options are better. – fortran May 26 '10 at 08:40
0

You could also use Shared Memory and IOCTL

Community
  • 1
  • 1
obayhan
  • 1,636
  • 18
  • 35
0

debugfs is another good possibility for APIs that are less stable than sysfs, but the API is basically the same. Here is a minimal runnable example.

configfs is another one. It allows easy dynamic creation of kernel objects from userspace through the filesystem: https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt

In any case, you will have to dirty some namespace... a filesystem entry in case of sysfs and debugfs. Just choose your poison.

Also, udev rules make /dev very similar to sysfs and debugfs: How to create a device in /dev automatically upon loading of the kernel module for a device driver?

Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985