Fading Coder

One Final Commit for the Last Sprint

Porting Quectel EC20 USB Modem Driver to Linux Kernel

USB Serial Driver Modifications Adding Vendor and Product IDs To enable kernel recognition of the module, add its Vendor ID (VID) and Product ID (PID) definitions. Modify the drivers/usb/serial/option.c file as shown. #define VIATELECOM_VENDOR_ID 0x15eb #define VIATELECOM_PRODUCT_CDS7 0x0001 #define...

Understanding the poll System Call Implementation

poll(2) is a system call that works similarly to select(2): it waits for a set of file descriptors to become ready for I/O operations. Usage Implementation Limitations of select(2): The maximum number of file descriptors that can be monitored is 1024. File descriptors are processed in order, making...

Managing Multiple Character Devices of the Same Type in a Single Driver

Supporting several identical hardware instances from one driver module is a common requirement. The Linux character device subsystem allows a single driver to handle multiple minor numbers, each corresponding to a distinct device node while sharing the same file operations and major number. This app...

Deep Dive into EventPipe: A Linux Kernel-to-User Space Event Notification System

Event Handler Registration void register_event_handler(handler_t *handler) { handler->category = next_category_id++; TAILQ_INSERT_TAIL(&global_handler_list, handler, list_node); } Event Processing Logic static int dispatch_event(event_t *evt, size_t data_len) { handler_t *target_handler = fin...

ARM64 Translation Lookaside Buffer Architecture and Management

The Memory Management Unit (MMU) translates virtual addresses to physical addresses. To eliminate the latency of repeated page table walks in main memory, processors integrate a Translation Lookaside Buffer (TLB). This hardware cache stores recently accessed page table entries. Contemporary microarc...

Creating and Operating Device Files for Linux PCIe Drivers

PCIe devices in Linux are implemented as character devices, wich expose hardware functionality via a device node under the /dev directory. User applications interact with PCIe hardware using standard file I/O operations on this node. Creating the Character Device Node Folow these steps to register a...

Comparing kmalloc, vmalloc, and malloc Memory Allocation Functions

All three memory allocation functions kmalloc, vmalloc, and malloc allocate memory in units of bytes. kmalloc void * kmalloc(size_t requested_size, gfp_t gfp_flags) This function returns a pointer to a memory block of at least the requested size. The allocated memory is physically contiguous and ret...

Mutex-Based Concurrency Control in the Linux Kernel

Introduction This document explores mutexes as a mechnaism for managing concurrency and race conditions within the Linux kernel. It covers theoretical aspects and the corresponding API functions provided by the kernel. Mutex Overview What Are Mutexes? Similar to systems like FreeRTOS and UCOS, mutex...

High-Performance Packet Capture with AF_PACKET V3 on Linux

Introduction While earlier implementations provided foundational packet capture capabilities, modern Linux kernels support AF_PACKET Version 3 (V3), delivering substantial performance improvements over both V1 and V2. (Version 2 primarily enhanced timestamp precision from microseconds to nanoseconds...

Implementing Semaphores, Mutexes, and Concurrency Control in Linux Device Drivers

Semaphores: Blocking-Based Concurrency Control Semaphores provide a synchronization mechanism for managing access to shared resources, particularly useful when critical sections involve longer execution times. Semaphore Operations // Define a semaphore struct semaphore sync_sem; // Initialize semaph...