Linux: how do i know the module that exports a device node?
Short answer :
cd /sys/dev/char/major:minor/device/driver/
ls -al | grep module
Each device is generally associated with a driver, and this is all what the "device model" is about. The sysfs
filesystem contains a representation of this devices and their associated driver. Unfortuantely, it seems not all sysfs have a representation of the device nodes, so this applyd only if your /sys directory contains a /dev directory.
Let's take an example, with /dev/video0
On my board, ls -al /dev/video0
output is
crw------- 1 root root 81, 0 Jan 1 00:00 video0
So major number is 81 and minor number is 0.
Let's dive into sysfs :
# cd /sys
# ls
block class devices fs module
bus dev firmware kernel
The sys/dev
directory contains entry for the char and block devices of the system :
# cd dev
# cd char
# ls
10:61 13:64 1:3 1:8 249:0 252:0 29:0 4:65 81:0 89:1
10:62 1:1 1:5 1:9 250:0 253:0 29:1 5:0 81:2
10:63 1:11 1:7 248:0 251:0 254:0 4:64 5:1 81:3
What the hell are this links with strange names ?
Remember the major and minor number, 81 and 0 ?
Let's follow this link :
#cd major:minor (ie 81:0)
#ls -al
drwxr-xr-x 2 root root 0 Jan 1 01:56 .
drwxr-xr-x 3 root root 0 Jan 1 01:56 ..
-r--r--r-- 1 root root 4096 Jan 1 01:56 dev
lrwxrwxrwx 1 root root 0 Jan 1 01:56 device -> ../../../vpfe-capture
-r--r--r-- 1 root root 4096 Jan 1 01:56 index
-r--r--r-- 1 root root 4096 Jan 1 01:56 name
lrwxrwxrwx 1 root root 0 Jan 1 01:56 subsystem -> ../../../../../class/video4linux
-rw-r--r-- 1 root root 4096 Jan 1 01:56 uevent
Now we can see that this device nod, which is how the device is presented to userspace, is associated with a kernel device. This association is made through a link. If we follow this link, we end up in a directory, with a driver link. The name of the driver is usually the name of the module :
# ls -al
drwxr-xr-x 3 root root 0 Jan 1 01:56 .
drwxr-xr-x 25 root root 0 Jan 1 00:00 ..
lrwxrwxrwx 1 root root 0 Jan 1 01:56 driver -> ../../../bus/platform/drivers/vpfe-capture
-r--r--r-- 1 root root 4096 Jan 1 01:56 modalias
lrwxrwxrwx 1 root root 0 Jan 1 01:56 subsystem -> ../../../bus/platform
-rw-r--r-- 1 root root 4096 Jan 1 01:56 uevent
drwxr-xr-x 3 root root 0 Jan 1 01:56 video4linux
So here the name of the module is vpfe_capture
How to create a device node from the init_module code of a Linux kernel module?
To have more control over the device numbers and the device creation you could do the following steps (instead of register_chrdev()
):
- Call
alloc_chrdev_region()
to get a major number and a range of minor numbers to work with. - Create device class for your devices with
class_create()
. - For each device, call
cdev_init()
andcdev_add()
to add the character device to the system. - For each device, call
device_create()
. As a result, among other things, Udev will create device nodes for your devices. No need formknod
or the like.device_create()
also allows you to control the names of the devices.
There are probably many examples of this on the Net, one of them is here.
How to call exported kernel module functions from another module?
From my research, it seems that those are the only three ways to handle this situation, and I've gotten each of them to work, so I think I'll just pick my favorite out of those.
Creation of pseudo device-node under /dev
From your question I'm guessing your talking about Linux (since you are talking about kernel modules). In that case I'd strongly recommend reading Linux Device Driver. I'd recommend looking at chapter 14 to understand better how device work.
It should also be noted that in most current desktop and server distribution of Linux, udev is responsible for creating entries in /dev. You can configure udev with rules that allow you to create your the device node with a specific name and location. In the embedded world it might be mdev with busybox that's responsible for populating /dev or even it could simply be the deprecated devfs.
Related Topics
Bash Variable Assignment Not Working Expected
How to Grep One String Occuring Multiple Times from Same File
Using a Remote Host's Usb Port as Local Usb (Linux and Windows)
Difference Between Unix Domain Stream and Datagram Sockets
Managing User Configuration Files Across Multiple Computers
New to Linux Kernel/Driver Development
In Linux, What Do All the Values in the "Top" Command Mean
How to Find from Where a Job Is Submitted in Slurm
"Docker Images" Shows Image, "Docker Rmi" Says "No Such Image" or "Reference Does Not Exist"
How to Clear the Scrollback in the Screen Command
I Want to Remove Multiple Line of Text on Linux
Linux Script Extract Information from Excel to Create Users
Custom Linux Gui: Where to Begin
Preserve Colouring After Piping Grep to Grep
Linux: Set Permission Only to Directories
How I Should Run My Golang Process in Background
How Does Epoll's Epollexclusive Mode Interact with Level-Triggering