Human interfaces
| human interfaces |
|---|
| text interfaces |
| security |
| debugging |
| multimedia subsystems |
| human interface devices, input devices |
| HI drivers |
Welcome to the first article of this book. The article is named after the USB class and the Linux facility for Human Interface Devices (HID). The HID subsystem in Linux supports keyboards, mice, and other input devices. In addition to input handling, this article also explores topics related to the console, multimedia (or simply media), sound (audio), video, and graphics—key areas of user interaction. Security and debugging are also covered, as they are closely tied to human interaction and user-facing functionality.
Text interfaces
[edit | edit source]In the world of Linux, text terminal emulators and consoles are essential components of the operating system that allow users to interact with applications through the kernel. A text terminal is a device that provides a text-based interface for communicating with the kernel, while the console is the physical device that houses the terminal and displays the output of the kernel.
The Linux kernel includes a built-in console driver that provides a basic interface for communicating with the console and controlling the terminal. The console driver also supports various input and output devices, such as keyboards and displays, to enable users to interact with the system through a terminal.
The use of text terminals and system consoles in Linux can be traced back to the early days of computing, when graphical user interfaces were not yet widely available. Despite the widespread adoption of graphical user interfaces, text-based interfaces and consoles remain popular among Linux users and developers for their simplicity, efficiency, and flexibility. Overall, the text terminal and console play a crucial role in the Linux kernel, providing users with a powerful interface for managing and interacting with the operating system.
Char devices
[edit | edit source]cdev id – "character device" is a type of device driver that provides an implementation for character device file in the /dev directory. The word "device" here means abstract interface, proxy to a usually peripheral physical device. A character device is a type of device that can be accessed as a stream of bytes, rather than as a block of data like a block device. Cdev drivers are commonly used for devices that provide a stream of data, such as keyboards, mice, terminals, serial ports, and printers. They are also used for devices that provide access to memory-mapped I/O regions, such as frame buffers and network devices. A cdev driver typically consists of a set of functions that implement the low-level I/O operations for the device, such as open, read and write. These functions are called by the kernel when a user space program accesses the character device file. To create a cdev driver, a kernel developer must first initialize a cdev structure using cdev_init id or cdev_alloc id. The cdev structure contains information about the device, such as its major and minor numbers and the set of I/O functions that the driver implements. Once the cdev structure has been initialized, it can be registered with the kernel using the cdev_add id function. This function creates the character device file in the /dev directory and associates it with the cdev driver.
You can find a list of registered char devices on the beginning the listing of /proc/devices. Input devices keyboard and mouse are examples of char devices.
Tip: Browse the cross-referencing site to explore nearby API and use cases
💾 Historical: It is one of the most simple, fundamental and oldest concepts derived from UNIX.
⚲ API
- linux/cdev.h inc
- dev_t id - device id consists of MAJOR id and MINOR id numbers
- cdev id - core char device struct
- cdev_init id or cdev_alloc id
- cdev_device_add id - helper function, uses
- cdev_add id - common key function to add a char device to the system.
- register_chrdev id - obviously registers char device by major number, name and file operations
- unregister_chrdev id
- alloc_chrdev_region id / register_chrdev_region id,
- unregister_chrdev_region id
- uapi/linux/major.h inc - static definitions of many major numbers, including obsolete.
⚙️ Internals
- fs/char_dev.c src – character device registration
- chrdevs id
📖 References
- Char devices doc
- Character device drivers, linux-kernel-labs
- Character device files, on opensourceforu
📚 Further reading
💾 Historical
Text terminals and console
[edit | edit source]🗝️ Acronyms
- tty - 💾 historically TeleTYpewriter, means just terminal
- pty - pseudoterminal
- pts - pseudoterminal slave
- ptmx - pseudoterminal master
⚲ API
- To find out current terminal:
- linux/tty.h inc
- register_console id obviously registers console id
- 👁 example virtio_console id
- linux/console.h inc
- man 2 ioctl_console
⚙️ Internals
- drivers/tty src – TTY layer
- fs/devpts src – devpts pseudo-filesystem for PTY slaves
- fs/proc/proc_tty.c src – /proc/tty information
- drivers/tty/vt/vt.c src – virtual terminal console
📖 References
- man 4 tty – controlling terminal
- man 4 ptmx and pts – pseudoterminal master and slave
- man 7 pty – pseudoterminal interfaces
- console doc
💾 Historical
Security
[edit | edit source]The goal of security is to restrict access through interfaces. From access control and authentication mechanisms to secure boot and memory protection, the Linux kernel employs a variety of techniques to safeguard the system and its users. Basic Linux security is quite simple. It consists of three ownership classes and three access modes. One of the most frequently executed functions is may_open id. It rejects access of unauthorized users to open a file.
See article Security for advanced features.
Authorization
[edit | edit source]Authorization is the function of specifying access rights/privileges to system resources. The main goal of authorization is prevention of privilege escalation under any circumstances.
🔧 TODO. Keywords: permission, capabilities, ownership, mitigation.
⚲ API
Basic classic UNIX authorization is based on ownership and tree access modes: reading, writing and execution.
Ownership is encoded by owning user id uid_t id and owning group id gid_t id.
umode_t id - just typedef used for encoding access mode. S_IRUSR id - minimal "read only by user/owner" access mode. S_IALLUGO id - full access mode. Please read the source for details for other modes.
Binary Access Control Matrix of access modes:
| modes | bits | Read | Write | Execute |
|---|---|---|---|---|
| bit offset | 2 | 1 | 0 | |
| Others | 0-2 | or | ow | ox |
| Group | 3-5 | gr | gw | gx |
| User | 6-8 | ur | uw | ux |
- man 2 chown ↪ do_fchownat id changes ownership for file or directory
- man 2 chmod ↪ do_fchmodat id changes access mode for file or directory
- man 2 access, man 2 faccessat ↪ do_faccessat id checks access rights
Common authorization errors
🚀 Advanced features
- man 5 acl posix_acl id
- man 1 setpriv – run a program with different privilege settings
⚙️ Internals
- may_open id rejects unauthorized file opening
- inode_permission id checks for access rights to a given inode
📖 References
Capabilities
[edit | edit source]POSIX capabilities split the traditional root privilege into distinct units, so a process can hold only the capabilities it needs.
⚲ API:
- man 7 capabilities
- uapi/linux/capability.h inc
- man 2 capset, man 2 capget – set/get capabilities of thread(s)
- man 3 libcap
⚙️ Internals:
Credentials
[edit | edit source]🔧 TODO. Keywords: authentication, user IDs, group IDs, Process group ID, session ID.
⚲ API
- uapi/asm-generic/stat.h inc
- arch/x86/include/uapi/asm/stat.h src – x86 stat structure definitions
- linux/cred.h inc
- struct cred id - the security context of a task
- man 1 id, man 1 test - shell utilities
- man 2 getuid ↪ current_uid id
- man 2 getgid
- man 2 geteuid is used by utility man 1 whoami
- Real, effective, and saved user/group IDs:
- man 2 getresuid, getresgid
- man 2 setreuid, setregid
- man 2 setfsuid - set user identity used for filesystem checks
- man 2 umask - sets file mode creation mask
- man 1 stat, man 2 stat ↪ vfs_fstat id, vfs_fstatat id
- man 2 statx ↪ do_statx id
⚙️ Internals
- kernel/cred.c src – credentials management and transitions
- kstat id
- make_kuid id etc
- from_kuid_munged id etc
📖 References
- Credentials in Linux doc
- man 7 credentials
- https://www.geeksforgeeks.org/real-effective-and-saved-userid-in-linux/
Cryptography
[edit | edit source]🔧 TODO
🗝️ Acronyms
⚲ API
- AF_ALG id - User Space Interface doc
- linux/crypto.h inc - Scatterlist Cryptographic API.
- man 2 getrandom – obtain random bytes
- linux/random.h inc – kernel random number generation
- crypto inc
⚙️ Internals
- crypto src – cryptographic API core
- drivers/crypto src – hardware crypto accelerator drivers
- lib/crypto src – crypto library helpers
- arch/x86/crypto src – x86 optimized crypto implementations
- fs/crypto src - per-file encryption
- fs/ecryptfs src eCrypt FS - Encrypted filesystem that operates on the VFS layer.
- dm-crypt, drivers/md/dm-crypt.c src
📖 References
Audit
[edit | edit source]The Linux audit framework records security-relevant events such as system calls, file access, and authentication attempts. The audit daemon (auditd) collects records from the kernel via a netlink socket.
⚲ API
- man 8 auditctl – configure audit rules
- man 8 auditd – audit daemon
- man 7 audit.rules
- linux/audit.h inc
⚙️ Internals
- kernel/audit.h src – audit internal definitions
- kernel/audit.c src – audit gateway between kernel and user-space daemon
- kernel/auditsc.c src – system-call auditing
- kernel/audit_tree.c src – audit directory tree watches
- kernel/audit_watch.c src – audit filesystem path watches
- kernel/audit_fsnotify.c src – audit fsnotify integration
- kernel/auditfilter.c src – audit rule filtering
📖 References
See also eBPF and BPF
Security subsystems
[edit | edit source]Seccomp
[edit | edit source]Seccomp (Secure Computing) restricts which system calls a process can make. Seccomp-BPF attaches a BPF program that inspects each syscall number and arguments, returning allow, kill, trap, or errno. Used by runc (OCI container runtime), browsers (Chrome, Firefox), and systemd to reduce the kernel attack surface of sandboxed processes.
⚲ API:
- man 2 seccomp ↪ do_seccomp id
- man 2 prctl with PR_SET_SECCOMP id
- linux/seccomp.h inc
- uapi/linux/seccomp.h inc – SECCOMP_MODE_FILTER id, SECCOMP_RET_ALLOW id, SECCOMP_RET_KILL id
⚙️ Internals:
- kernel/seccomp.c src
- seccomp_filter id – container for seccomp BPF programs
📖 References:
File sealing
[edit | edit source]File sealing restricts operations on anonymous files created with man 2 memfd_create. Once sealed, a file cannot be modified in ways forbidden by its seals, providing integrity guarantees for shared memory. Used by Wayland for safe buffer handoff, systemd for sealed service binaries, and kdbus for immutable message payloads.
⚲ API:
- man 2 memfd_create – create anonymous sealable file
- man 2 fcntl with F_ADD_SEALS id, F_GET_SEALS id
- F_SEAL_SEAL id, F_SEAL_SHRINK id, F_SEAL_GROW id, F_SEAL_WRITE id
⚙️ Internals:
Keyrings
[edit | edit source]The kernel keyring service manages cryptographic keys, authentication tokens, and other security data. Keyrings are hierarchical and per-process, used by filesystems (fscrypt), networking (Kerberos, TLS), and module signature verification.
⚲ API:
⚙️ Internals:
📖 References:
LSM
[edit | edit source]Linux Security Modules (LSM) is a framework providing hooks for access control implementations. SELinux, AppArmor, Landlock, Yama, and Lockdown are LSM modules. Keyrings (security/keys) and IMA/EVM (security/integrity) are separate subsystems that share the security/ tree but are not LSMs.
⚲ API:
- linux/security.h inc
- rust/kernel/security.rs src – Rust bindings
⚙️ Internals:
- security src
- security/security.c src – LSM framework core, hook dispatch
- security/selinux src – SELinux, https://selinuxproject.github.io/
- security/apparmor src – AppArmor
- security/landlock src – Landlock unprivileged sandboxing (since 5.13)
- security/integrity src – IMA integrity measurement and EVM extended verification
- security/lockdown src – kernel lockdown, restricts access to kernel features
- security/yama src – Yama, ptrace scope restrictions
- linux/verification.h inc
- certs src – module signing certificates
📖 References:
...
[edit | edit source]Appendix for Security:
🔧 TODO
📖 References
Debugging
[edit | edit source]See Debugging the Linux kernel
Multimedia subsystems
[edit | edit source]⚙️ Internals
- drivers/media src – media subsystem (V4L2, DVB, etc.)
Graphics
[edit | edit source]Old graphics (not to be confused with v4l):
⚲ API
⚙️ Internals
- drivers/video src – framebuffer and video drivers
Direct Rendering Manager (DRM) / KMS
[edit | edit source]🗝️ Acronyms
- DRM – Direct Rendering Manager
- KMS – Kernel Mode Setting, display output configuration (resolution, refresh rate, connectors, CRTCs)
- GEM – Graphics Execution Manager (GPU memory management)
- CRTC – CRT Controller (legacy name for display scanout engine)
- TTM – Translation Table Manager (older GPU memory manager)
DRM is responsible for interfacing with GPUs of modern video cards.
DRM exposes an API that user-space programs can use to send commands and data to the GPU and perform operations such as configuring the mode setting of the display.
User-space programs can use the DRM API to command the GPU to do hardware-accelerated 3D rendering and video decoding, as well as GPGPU computing.
⚲ API
- /dev/dri/card*, /dev/dri/renderD* – DRM device nodes
- /sys/class/drm/
- uapi/drm inc
- uapi/drm/drm_mode.h inc – KMS mode setting ioctls
- rust/kernel/gpu.rs src – Rust bindings
⚙️ Internals
Key abstractions:
- drm_device id – represents a GPU, drm/drm_device.h inc
- drm_driver id – driver callbacks, drm/drm_drv.h inc
- drm_dev_register id – register a DRM device
- drm_crtc id – display controller (scanout engine)
- drm_connector id – output port (HDMI, DP, etc.)
- drm_encoder id – signal format converter
- drm_plane id – image layer composited by CRTC
- drm_framebuffer id – pixel buffer
- drm_gem_object id – GPU memory object
- drm_display_mode id – resolution and timing descriptor
- drm_bridge id – chain between encoder and connector (panels, converters)
- drm_panel id – display panel abstraction
- drm_edid id – EDID monitor identification
- drm_atomic_commit id – submit atomic mode set
- drm_sched_job id – GPU job scheduler
- drivers/gpu/drm src – DRM core and drivers
- drivers/gpu/drm/drm_drv.c src – driver registration
- drivers/gpu/drm/drm_atomic.c src – atomic mode setting
- drm/drm_gem.h inc, drivers/gpu/drm/drm_gem.c src – GEM memory manager
- drivers/gpu/drm/drm_ioctl.c src – ioctl dispatch
GPU drivers:
- drivers/gpu/drm/i915 src – Intel
- drivers/gpu/drm/xe src – Intel Xe (newer)
- drivers/gpu/drm/amd src – AMD (amdgpu, radeon)
- drivers/gpu/drm/nouveau src – NVIDIA (reverse-engineered)
- drivers/gpu/drm/virtio src – virtual GPU
- drivers/gpu/drm/vkms src – virtual KMS for testing
📖 References
Advanced Linux Sound Architecture (ALSA)
[edit | edit source]ALSA is a software framework and part of the Linux kernel that provides an API for sound card device drivers. Some of the goals of the ALSA project at its inception were automatic configuration of sound-card hardware and graceful handling of multiple sound devices in a system.
The sound servers PulseAudio, JACK (low-latency professional-grade audio editing and mixing) and PipeWire, the higher-level abstraction APIs OpenAL, SDL audio, etc. work on top of ALSA and implemented sound card device drivers. On Linux systems, ALSA succeeded the older Open Sound System (OSS).
⚲ API
- /proc/asound/cards, /sys/class/sound/
- snd_card id - central struct
- snd_card_new id
- snd_card_register id
- snd_device_ops id
- snd_device_new id creates an ALSA device component
- uapi/sound/asound.h inc
- sound/core.h inc
⚙️ Internals
- sound src – ALSA sound subsystem
- sound/core/device.c src – ALSA device management
- See ASoC
📖 References
Video4Linux (V4L2)
[edit | edit source]V4L is a collection of device drivers and an API for supporting realtime video capture on Linux systems. It supports many USB webcams, TV tuners, and related devices, standardizing their output, so programmers can easily add video support to their applications. MythTV, tvtime and Tvheadend are typical applications that use the V4L framework.
⚲ API
- v4l2_device_register id registers v4l2_device id
- video_register_device id registers video_device id
- 👁 examples drivers/media/test-drivers src
📖 References
HID
[edit | edit source]Generic human interface devices. Don't confuse with hiddev.
Input devices
[edit | edit source]Input device files are kind of char devices with id INPUT_MAJOR id. Classic input devices are keyboard and mouse.
⚲ API
- In shell: cat /proc/bus/input/devices
- linux/input.h inc
- devm_input_allocate_device id, input_register_device id, input_register_handler id, input_dev id
- input_report_key id input_sync id
👁 Examples
- drivers/input/mousedev.c src – mouse device emulation
- drivers/input/keyboard/atkbd.c src – AT/PS2 keyboard driver
⌨️ Hands on
sudo hexdump /dev/input/mice # dump your mouse movements events from your kernel
⚙️ Internals
- drivers/input/input.c src – input core
- input_event id
📖 References
HID devices
[edit | edit source]🔧 TODO
⚲ API
- hid_device id - device report descriptor. Operations: hid_allocate_device id, hid_add_device id . 👁 Example usbhid_probe id
- uapi/linux/hid.h inc
- linux/hid.h inc
Camera
[edit | edit source]🔧 TODO
⚲ API
📖 References
- UVC doc
- drivers/media/usb/uvc src – USB Video Class driver
HI device drivers
[edit | edit source]This section is about low level drivers to human interface peripheral devices.
⚲ HID API
⚙️ Internals
- hid_bus_type id
- drivers/hid src – HID transport drivers
- drivers/hid/hid-core.c src – HID core parsing and event handling
- drivers/accessibility src – accessibility drivers (speakup)
- drivers/leds src – LED class drivers
- samples/uhid/uhid-example.c src - 👁 example of user mode HID driver
- drivers/input src : keyboard & mouse, misc, serio, tablet, touchscreen, gameport, joystick
- ⌨️ Hands on
- echo "module atkbd +pfl" | sudo tee /sys/kernel/debug/dynamic_debug/control
USB HID
⚲ HID API
⚙️ Internals
- drivers/hid/usbhid src – USB HID transport
📖 References
Display drivers
[edit | edit source]🔧 TODO
🗝️ Acronyms
- FB - Framebuffer
- GPU - Graphics processing unit
- TFT (LCD) - Thin-film-transistor liquid-crystal display used for 🤖 embedded devices
- MIPI - 📱 Mobile Industry Processor Interface
- DBI - Display Bus Interface
- DSI - Display Serial Interface
- DCS - The Display Command Set
⚲ API
- cat /proc/fb
- ls -l /sys/class/graphics
- video/mipi_display.h inc
- linux/fb.h inc
- devm_register_framebuffer id
- FBTFT_REGISTER_DRIVER id
- fbtft_display id
⚙️ Internals
- drivers/video src – framebuffer and video drivers
- drivers/gpu src – GPU and DRM drivers
👁 Examples
📖 References
Sound SoC - ASoC
[edit | edit source]ALSA System on Chip (ASoC) layer for 🤖 embedded systems. ASoC is designed to handle complex audio processing and routing on low-power and resource-constrained systems, making it an ideal solution for embedded devices such as smartphones, tablets, and other IoT devices.
ASoC provides a comprehensive framework for audio drivers, enabling the creation of modular audio drivers that can be easily integrated with the rest of the kernel. It also supports a wide range of audio interfaces, including I2S, PCM, AC97, and SPDIF, making it highly versatile and capable of handling a variety of audio formats.
One of the key features of ASoC is its ability to handle audio routing and processing using Digital Signal Processing (DSP) techniques.
This enables ASoC to support advanced audio features such as noise reduction, echo cancellation, and dynamic range compression, among others.
Overall, ASoC is a powerful and flexible subsystem that enables Linux to support a wide range of audio hardware in embedded devices. It has become an essential component of many embedded Linux distributions and is widely used in the development of modern audio-enabled devices.
⚲ API
- sound/soc.h inc
- snd_soc_card id
- is registered by devm_snd_soc_register_card id ⇾ snd_soc_register_card id
- snd_soc_card id
- sound/soc-component.h inc
- sound/soc-dpcm.h inc - DPCM - Dynamic PCM doc
- sound/soc-dapm.h inc - DAPM - Dynamic Audio Power Management doc
👁 Examples
- sound/soc/generic/simple-card.c src
- sound/soc/generic/audio-graph-card.c src uses sound/graph_card.h inc
⚙️ Internals
- sound/soc src – ASoC framework
- snd_soc_card id
📖 References
🗝️ Acronyms SAI could be
- STM Serial Audio Interface: sound/soc/stm/stm32_sai.h src
- Freescale (FSL) Synchronous Audio Interface: sound/soc/fsl/fsl_sai.h src