The mac_alloc and mac_free Functions
GLDv3 MAC Registration Data Structures
Large Segment (or Send) Offload
The mac_init_ops and mac_fini_ops Functions
The mac_init_ops and mac_fini_ops Functions
GLDv3 State Change Notifications
The mac_register and mac_unregister Functions
Receive Data Path
The mac_register and mac_unregister Functions
Devices as Special Files
Block Device Autoconfiguration
Block Device Autoconfiguration
GLDv3 Capabilities
GLDv3 Properties
GLDv3 Network Statistics
GLDv3 Properties
GLDv3 Properties
Transmit Data Path
Receive Data Path
Detecting Kernel Memory Leaks
Writing Debugger Commands With mdb
Using the mdb Modular Debugger
Obtaining Device Tree Information
Retrieving Driver Soft State Information
Dynamic Memory Allocation
Detecting Kernel Memory Leaks
Virtual Memory
Context Management Model
System Memory Model
Store Buffers
Device Interrupts
Creating Minor Device Nodes
Updating Driver Information
Devices as Special Files
minphys Entry Point
Bulk Requests
Associating User Mappings With Driver Notifications
The mac_init_ops and mac_fini_ops Functions
The mac_init_ops and mac_fini_ops Functions
Setting the moddebug Kernel Variable
modldrv Structure
modlinkage Structure
Loading and Unloading Test Modules
mdb debugger
Copying the Driver to a Module Directory
Module Functions
GLDv2 Driver Requirements
Loading and Unloading Test Modules
Loading and Unloading Drivers
open Entry Point (Block Drivers)
Device Interrupts
MSI Interrupts
Device Interrupts
MSI-X Interrupts
Multiplexing I/O on File Descriptors
Device Context Switched
to User Process A
Initializing Condition Variables
Locking Primitives
cb_ops Structure
Multithreaded Execution Environment
Condition Variables in Thread Synchronization
Setting Up Mutexes
Potential Locking Pitfalls
Mutual-Exclusion Locks
High-Level Interrupts
High-Level Interrupts
Registering Drivers to Gain Device Access
mutex