call a kernel module function from program at user space

29,459

Solution 1

There is complete overview of linux-kernel module and user-space program interacting http://wiki.tldp.org/kernel_user_space_howto "Kernel Space, User Space Interfaces" by Ariane Keller (it is from 2008-09-28, but about 2.6 kernels; only major new way is relayfs)

No ordinary function call from user space to kernel space is listed, only syscall (adding new syscall is not easy) and upcall (call in inverse direction).

One of easiest interface is ioctl; but you can't start to use ioctl before creating procfs, sysfs or similiar file.

Other is sysctl; but sysctl is more eligible to reading/writing to global variable. (It is hard to pass several parameters via sysctl interface).

Solution 2

You seem to be missing the point of kernel and userland separation. If your user program could modify data inside the kernel directly, that would quickly lead to disaster.

There's only one conventional way for a user program to explicitly request services from the kernel - make a system call.

There are also traps and some Linux-specific userland-kernel communication mechanisms, but those are not relevant here.

Solution 3

As other posters have mentioned, there is a clear distinction between kernel and user space. So no you can't call a kernel function directly from user space. I think the easiest way to send messages between userspace and kernel space is via netlink sockets. A netlink socket allows you to easily pass arbitrary data structures between user level and kernel level.

Yes ioctl, system calls are viable alternatives, they are not as flexible as the netlink socket for passing arbitrary information.

Solution 4

You'll need to install a new kernel to make use of the new call unless you already have some mechanism to update the kernel ... http://www.cyberciti.biz/tips/how-to-patch-running-linux-kernel.html

Share:
29,459

Related videos on Youtube

Ricardo
Author by

Ricardo

Updated on August 19, 2022

Comments

  • Ricardo
    Ricardo over 1 year

    I developed a kernel module and some functions on it. Now i need to develop a program in the user space and call some functions which are in the kernel module.

    I also need to access some global variable that are in the kernel module on my program at the user space.

  • lithiumhead
    lithiumhead about 10 years
    Just a note: The code needs the following minor change to make it run on the newer kernels: change the following line in gnKernel.c: rc = genlmsg_unicast(skb,info->snd_pid ); to rc = genlmsg_unicast(genl_info_net(info), skb,info->snd_pid ); The kernel I was testing this on was 2.6.35-22-generic
  • Cimbali
    Cimbali almost 8 years
    I'm afraid that link died, though it's still accessible through web.archive.org
  • osgx
    osgx almost 8 years
    Cimbali, thank you. Also here - wiki.tldp.org/kernel_user_space_howto, the "Kernel Space, User Space Interfaces" by Ariane Keller, 2008-10-04