Herramientas de usuario

Herramientas del sitio


wiki2:linux_drivers

¡Esta es una revisión vieja del documento!


Linux Drivers

Modules

Users can add or remove functionalities to the Linux kernel while the system is running. These “programs” that can be added to the kernel at runtime are called “module” and built into individual files with .ko (Kernel object) extension. A kernel module can be modified without need of recompiling the full kernel.

Linux driver modules can be found in: /lib/modules/<version>/kernel/drivers/ where <version> would be the output of the command uname -r on the system.

Commands to manage modules as root

  • lsmod - List the available loaded modules.
  • cat /proc/modules - List the available loaded modules.
  • lsmod | egrep -v “\s0” - List loaded modules.
  • insmod module - Load the module specified by module.
  • modprobe module - Load the module along with its dependencies.
  • rmmod module - Remove/Unload the module.
  • modprobe module - Install kernel module.
  • modprobe -rv module - Remove the module.
  • modinfo module - Gives information about the module.
  • modinfo -n module - Gives the path were the module files are located.

depmod

depmod command generates modules.dep and map files.

Linux kernel modules can provide services (called “symbols”) for other modules to useusing one of the EXPORT_SYMBOL variants in the code). If a second module uses thissymbol, that second module clearly depends on the first module. These dependencies can getquite complex.

depmod creates a list of module dependencies by reading each module underlib/modules/version and determining what symbols it exports and what symbols it needs. By default, this list is written to modules.dep, and a binary hashed version namedmodules.dep.bin, in the same directory.

Helper functions

  • printk() is the equivalent of printf() for kernel modules.

Structure

A device driver contains at least two functions:

  • A function for the module initialization (executed when the module is loaded with the command “insmod”)
  • A function to exit the module (executed when the module is removed with the command “rmmod”)

These are specified as the init and exit functions, respectively, by the macros module_init() and module_exit(), which are defined in the kernel header module.h.

# include <linux/module .h >
# include <linux/version .h >
# include <linux/kernel .h >
static int __init init_mod ( void ) /* Constructor */
{
printk ( KERN_INFO " Module1 started ...\ n ");
return 0;
}
static void __exit end_mod ( void ) /* Destructor */
{
printk ( KERN_INFO " Module1 ended ...\ n ");
}
module_init ( init_mod );
module_exit ( end_mod );
MODULE_LICENSE (" GPL ");
MODULE_AUTHOR (" Uppsala University ");
MODULE _DESCRIPTION (" Test Driver Module ");

It's required that the MODULE_LICENSE macro receives a GPL license.

Compilation

To build a module or driver, you need to have the kernel source (or, at least, the kernel headers) installed on your system. The kernel source is assumed to be installed at /usr/src/linux. If it’s at any other location on your system, specify the location in the KERNEL_SOURCE variable in the Makefile.

Example of Makefile:

MOD_NAME := veikk
BUILD_DIR := /lib/modules/$(shell uname -r)/build

obj-m := $(MOD_NAME).o

all:
	make -C $(BUILD_DIR) M=$(CURDIR) modules
	chmod +x ./config.sh

clean:
	make -C $(BUILD_DIR) M=$(CURDIR) clean

install:
	make -C $(BUILD_DIR) M=$(CURDIR) modules_install
	depmod
	modprobe veikk

uninstall:
	modprobe -r $(MOD_NAME)
	rm $(shell modinfo -n veikk)
	depmod

With this Makefile the commands would be:

For install:

make
sudo make install clean

For uninstall:

sudo make uninstall

USB

Manual binding & unbinding

Cuando enchufamos un dispositivo USB lo que nos aparece por pantall en la salida de dmesg es algo parecido a esto:

[24343.392476] input: VEIKK.INC A15 as /devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/0003:2FEB:0004.0007/input/input23
[24343.392675] hid-generic 0003:2FEB:0004.0007: input,hidraw3: USB HID v1.00 Mouse [VEIKK.INC A15] on usb-0000:00:14.0-2/input0
[24343.393665] input: VEIKK.INC A15 as /devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.1/0003:2FEB:0004.0008/input/input24
[24343.453812] hid-generic 0003:2FEB:0004.0008: input,hidraw4: USB HID v1.00 Keyboard [VEIKK.INC A15] on usb-0000:00:14.0-2/input1
[24343.454684] hid-generic 0003:2FEB:0004.0009: hiddev1,hidraw5: USB HID v1.00 Device [VEIKK.INC A15] on usb-0000:00:14.0-2/input2

Para desvincular el driver por defecto para este dispositivo, por ejemplo, escogeremos el “mouse” escribiendo en unbind:

echo -n "0003:2FEB:0004.0007" > /sys/bus/hid/drivers/hid-generic/unbind

Para vincularlo:

echo -n "0003:2FEB:0004.0007" > /sys/bus/hid/drivers/veikk/bind

Reference: https://lwn.net/Articles/143397/

Resources

Tutorial for creating a driver for a virtual char device. It creates that device using mknod command and accesses it using the driver.
https://s3.wasabisys.com/public-files/tutorial-DD.pdf

wiki2/linux_drivers.1569136513.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)