Document Information
Preface
Part I Designing Device Drivers for the Solaris Platform
1. Overview of Solaris Device Drivers
2. Solaris Kernel and Device Tree
3. Multithreading
4. Properties
5. Managing Events and Queueing Tasks
6. Driver Autoconfiguration
7. Device Access: Programmed I/O
8. Interrupt Handlers
9. Direct Memory Access (DMA)
10. Mapping Device and Kernel Memory
11. Device Context Management
12. Power Management
13. Hardening Solaris Drivers
14. Layered Driver Interface (LDI)
Part II Designing Specific Kinds of Device Drivers
15. Drivers for Character Devices
16. Drivers for Block Devices
17. SCSI Target Drivers
18. SCSI Host Bus Adapter Drivers
19. Drivers for Network Devices
20. USB Drivers
Part III Building a Device Driver
21. Compiling, Loading, Packaging, and Testing Drivers
22. Debugging, Testing, and Tuning Device Drivers
23. Recommended Coding Practices
Part IV Appendixes
A. Hardware Overview
B. Summary of Solaris DDI/DKI Services
C. Making a Device Driver 64-Bit Ready
D. Console Frame Buffer Drivers
Index
|
D
- data alignment for SPARC, SPARC Data Alignment
- data corruption
- control data, Corruption of Device Management and Control Data
- detecting, Detecting Corrupted Data
- device management data, Corruption of Device Management and Control Data
- malignant, definition of, Corruption of Device Management and Control Data
- misleading, definition of, Corruption of Device Management and Control Data
- of received data, Corruption of Received Data
- data sharing
- using devmap(), Data Sharing in devmap()
- using ioctl(), Data Sharing in ioctl()
- using mmap(), Data Sharing in mmap()
- data storage classes, Storage Classes of Driver Data
- data structures
- dev_ops structure, dev_ops Structure
- GLD
- Declarations and Data Structures
- gld_stats Structure
- modldrv structure, modldrv Structure
- data transfers, character drivers, I/O Request Handling
- DDI-compliant drivers
- byte ordering, Endianness
- compliance testing, DDI/DKI Compliance Testing
- ddi_create_minor_node() function, Creating Minor Device Nodes
- ddi_device_acc_attr structure, Access Attributes Structure
- ddi_device_copy() function, ddi_device_copy() Argument Changes
- ddi_device_zero() function, ddi_device_zero() Argument Changes
- ddi_devid_free() function, Retrieving Target Device Information
- DDI/DKI
- See also LDI
- design considerations, DDI/DKI Facilities
- and disk performance, Disk Performance
- overview, DDI/DKI Interfaces
- purpose in kernel, What Is the Kernel?
- ddi_dma_attr structure
- ddi_dma_attr Structure
- DMA Attributes Structure
- ddi_dma_attr
- ddi_dma_cookie structure, ddi_dma_cookie Structure Changes
- ddi_dma_getwin() function, DMA Software Components: Handles, Windows, and Cookies
- ddi_dma_mem_alloc() function, ddi_dma_mem_alloc() Argument Changes
- ddi_dma_nextseg() function, DMA Software Components: Handles, Windows, and Cookies
- ddi_dma_sync() function
- DMA Isolation
- Configuring the Test Harness
- ddi_driver_major() function
- Block Device Autoconfiguration
- Block Device Autoconfiguration
- ddi_enter_critical() function, Timing-Critical Sections
- ddi_eventcookie_t, Receiving Asynchronous Device Event Notification
- ddi_fm_acc_err_clear() function, Getting Error Status
- ddi_fm_acc_err_get() function
- Access Attributes Structure
- Access Attributes Structure
- ddi_fm_capable() function, Getting the Fault Management Capability Bit Mask
- ddi_fm_dma_err_get() function, DMA Attributes Structure
- ddi_fm_ereport_post() function
- Reporting Errors
- Reporting Errors
- ddi_fm_error structure
- Registering an Error Handler
- Registering an Error Handler
- Fault Management Data and Status Structure
- ddi_fm_fini() function, Cleaning Up Fault Management Resources
- ddi_fm_handler_register() function
- Access Attributes Structure
- Registering an Error Handler
- ddi_fm_handler_unregister() function, Registering an Error Handler
- ddi_fm_init() function, Declaring Fault Management Capabilities
- ddi_fm_service_impact() function, Reporting Errors
- DDI function tables, Summary of Solaris DDI/DKI Services
- ddi_get_cred() function
- drv_getparm() Argument Changes
- Data Sharing in ioctl()
- ddi_get_driver_private() function
- scsi_device Structure
- GLD Driver Requirements
- ddi_get_instance() function, gld_mac_info Structure
- ddi_get_lbolt() function, drv_getparm() Argument Changes
- ddi_get_pid() function, drv_getparm() Argument Changes
- ddi_get_time() function, drv_getparm() Argument Changes
- ddi_get()X functions
- Exclusive Use of DDI Access Handles
- Fault Injection
- DDI_INFO_DEVT2DEVINFO, getinfo() Entry Point
- DDI_INFO_DEVT2INSTANCE, getinfo() Entry Point
- ddi_intr_add_handler() function
- MSI-X Interrupts
- Interrupt Initialization and Destruction Functions
- Registering Interrupts
- ddi_intr_add_softint() function, Soft Interrupt Functions
- ddi_intr_alloc() function
- MSI-X Interrupts
- Interrupt Initialization and Destruction Functions
- ddi_intr_block_disable() function, Interrupt Initialization and Destruction Functions
- ddi_intr_block_enable() function, Interrupt Initialization and Destruction Functions
- DDI_INTR_CLAIMED, Interrupt Handler Functionality
- ddi_intr_clr_mask() function
- Interrupt Initialization and Destruction Functions
- Interrupt Function Examples
- ddi_intr_disable() function
- MSI-X Interrupts
- Interrupt Initialization and Destruction Functions
- ddi_intr_dup_handler() function
- MSI-X Interrupts
- Interrupt Initialization and Destruction Functions
- ddi_intr_enable() function
- MSI-X Interrupts
- Interrupt Initialization and Destruction Functions
- ddi_intr_free() function
- MSI-X Interrupts
- Interrupt Initialization and Destruction Functions
- ddi_intr_get_cap() function, Interrupt Capability Functions
- ddi_intr_get_hilevel_pri() function
- Priority Management Functions
- Handling High-Level Interrupts
- ddi_intr_get_navail() function, Interrupt Capability Functions
- ddi_intr_get_nintrs() function, Interrupt Capability Functions
- ddi_intr_get_pending() function
- Interrupt Initialization and Destruction Functions
- Interrupt Function Examples
- ddi_intr_get_pri() function
- Priority Management Functions
- Handling High-Level Interrupts
- ddi_intr_get_softint_pri() function, Soft Interrupt Functions
- ddi_intr_get_supported_types() function, Interrupt Capability Functions
- ddi_intr_hilevel() function, High-Level Interrupts
- ddi_intr_remove_handler() function
- MSI-X Interrupts
- Interrupt Initialization and Destruction Functions
- ddi_intr_remove_softint() function, Soft Interrupt Functions
- ddi_intr_set_cap() function, Interrupt Initialization and Destruction Functions
- ddi_intr_set_mask() function
- Interrupt Initialization and Destruction Functions
- Interrupt Function Examples
- ddi_intr_set_pri() function, Priority Management Functions
- ddi_intr_set_softint_pri() function
- Soft Interrupt Functions
- Interrupt Function Examples
- ddi_intr_trigger_softint() function
- High-Level Interrupts
- Soft Interrupt Functions
- DDI_INTR_UNCLAIMED, Interrupt Handler Functionality
- ddi_log_sysevent() function
- Using ddi_log_sysevent() to Log Events
- Using ddi_log_sysevent() to Log Events
- ddi_model_convert_from() function, Data Sharing in ioctl()
- ddi_peek() function, Access Attributes Structure
- ddi_poke() function, Access Attributes Structure
- ddi_prop_free() function, Driver Source File
- ddi_prop_get_int() function, HBA Configuration Properties
- ddi_prop_lookup() function, Looking Up Properties
- ddi_prop_lookup_string() function, Driver Source File
- ddi_prop_op() function, prop_op() Entry Point
- ddi_ptob() function, DMA Isolation
- ddi_put()X functions
- Exclusive Use of DDI Access Handles
- Fault Injection
- ddi_regs_map_setup() function
- ddi_device_acc_attr Structure
- Exclusive Use of DDI Access Handles
- Fault Injection
- Configuring the Test Harness
- ddi_removing_power() function, detach() Entry Point
- ddi_rep_get()X functions, Exclusive Use of DDI Access Handles
- ddi_rep_put()X functions, Exclusive Use of DDI Access Handles
- DDI_RESUME, detach() function, detach() Entry Point
- ddi_set_driver_private() function, scsi_device Structure
- DDI_SUSPEND, detach() function, detach() Entry Point
- ddi_umem_alloc() function
- Allocating Kernel Memory for User Access
- DMA Isolation
- ddi_umem_free() function, Freeing Kernel Memory Exported for User Access
- DDX module, The X Window System Frame Buffer Specific DDX Module
- DE (diagnosis engine), definition, Diagnosing Faults
- deadman kernel feature, Enable the Deadman Feature to Avoid a Hard Hang
- DEBUG symbol
- Compiling and Linking the Driver
- Use ASSERT() to Catch Invalid Assumptions
- debugging
- ASSERT() macro, Use ASSERT() to Catch Invalid Assumptions
- booting an alternate kernel, To Boot With an Alternate Kernel
- coding hints, Debugging Preparation Techniques
- common tasks, Useful Debugging Tasks With kmdb and mdb
- conditional compilation, Use Conditional Compilation to Toggle Costly Debugging Features
- console frame buffer drivers, Developing, Testing, and Debugging Console Frame Buffer Drivers
- DEBUG symbol, Use ASSERT() to Catch Invalid Assumptions
- detecting kernel memory leaks, Detecting Kernel Memory Leaks
- displaying kernel data structures, Obtaining Kernel Data Structure Information
- system file, Setting Up Test Modules
- kmdb debugger, Using the kmdb Kernel Debugger
- kmem_flags, Setting kmem_flags Debugging Flags
- mdb debugger, Using the mdb Modular Debugger
- moddebug, Loading and Unloading Test Modules
- postmortem, Postmortem Debugging
- preparing for disasters, Avoiding Data Loss on a Test System
- setting up a serial connection, Testing With a Serial Connection
- setting up a SPARC test system, Setting Up a Target System on the SPARC Platform
- setting up an x86 test system, Setting Up a Target System on the x86 Platform
- system registers, Exploring System Registers With kmdb
- tools, Debugging Tools
- using kernel variables, Modifying Kernel Variables
- using the SPARC PROM for device debugging, PROM on SPARC Machines
- writing mdb commands, Writing Debugger Commands With mdb
- delay() function, delay() and timeout() Argument Changes
- changes to, delay() and timeout() Argument Changes
- dependency, Power Management Dependencies
- deprecated device access functions, User Application Kernel and Device Access Functions
- deprecated DMA functions, Direct Memory Access (DMA) Functions
- deprecated interrupt functions, Interrupt Functions
- deprecated memory allocation functions, Memory Allocation and Deallocation Functions
- deprecated power management functions, Power Management Functions
- deprecated programmed I/O functions, Programmed I/O Functions
- deprecated property functions, Property Functions
- deprecated SCSI functions, SCSI Functions
- deprecated time-related functions, Time-Related Functions
- deprecated user application kernel functions, User Application Kernel and Device Access Functions
- deprecated user process information functions, User Process Information Functions
- deprecated user space access functions, User Space Access Functions
- deprecated virtual memory functions, Virtual Memory Functions
- descriptor tree
- The Descriptor Tree
- Registering Drivers to Gain Device Access
- dest_adcent argument, ddi_device_copy(), changes to, ddi_device_copy() Argument Changes
- detach() entry point
- active power management, Device Power Management
- description of, detach() Entry Point
- hot removal, Hot Removal
- system power management, System Power Management
- detecting kernel memory leaks with mdb, Detecting Kernel Memory Leaks
- dev_advcnt argument, ddi_device_zero(), changes to, ddi_device_zero() Argument Changes
- dev_datasz argument, ddi_device_copy(), changes to, ddi_device_copy() Argument Changes
- dev_datasz argument, ddi_device_zero(), changes to, ddi_device_zero() Argument Changes
- dev_info_t functions, Device Information Tree Node (dev_info_t) Functions
- dev_ops structure, description of, dev_ops Structure
- dev_t functions, Device (dev_t) Functions
- devfsadm command, Installing Drivers with add_drv
- device
- alternate settings, How USB Devices Appear to the System
- composite
- Devices With Multiple Interfaces
- Managing Entire Devices
- configurations, How USB Devices Appear to the System
- endpoints, How USB Devices Appear to the System
- interface number, Getting Interface Numbers
- interfaces, How USB Devices Appear to the System
- splitting interfaces
- Devices With Multiple Interfaces
- Multiple-Configuration Devices
- device access functions
- block drivers, open() Entry Point (Block Drivers)
- character drivers, open() Entry Point (Character Drivers)
- deprecated, User Application Kernel and Device Access Functions
- table, User Application Kernel and Device Access Functions
- device configuration, entry points, Device Configuration Concepts
- device context management, What Is a Device Context?
- entry points, Entry Points for Device Context Management
- model, Context Management Model
- operation, Context Management Operation
- device-dependency, power.conf entry, Power Management Dependencies
- device-dependency-property, power.conf entry, Power Management Dependencies
- device directory, recovering, Recovering the Device Directory
- device drivers
- See also compiling drivers
- See also linking drivers
- See also loading drivers
- 64-bit drivers
- I/O Control Support for 64-Bit Capable Device Drivers
- Making a Device Driver 64-Bit Ready
- access from within kernel, Layered Driver Interface (LDI)
- aliases, Updating Driver Information
- binding to device node
- Binding a Driver to a Device
- Compatible Device Names
- bindings, Checking Device Driver Bindings
- block driver, Entry Points for Block Device Drivers
- configuration descriptor clouds, Hot Reinsertion
- context, Driver Context
- debugging, Debugging, Testing, and Tuning Device Drivers
- coding hints, Debugging Preparation Techniques
- setting up a serial connection, Testing With a Serial Connection
- tools, Debugging Tools
- using the PROM, PROM on SPARC Machines
definition, What Is a Device Driver?
- entry points, What Is a Device Driver Entry Point?
- error handling, Error Handling
- header files, Header Files
- hubd USB hub driver, Hot Insertion
- interface association nodes, Devices With Interface-Association Descriptors
- loadable interface, Loadable Driver Interfaces
- modifying information with update_drv, Updating Driver Information
- modifying permissions, Updating Driver Information
- module configuration, Source Files
- network drivers, Drivers for Network Devices
- offlining
- Hotplug Callbacks
- Hot Removal
- packaging, Driver Packaging
- printing messages, Returning Errors
- purpose in kernel, What Is the Kernel?
- source files, Source Files
- standard character driver, Entry Points for Character Device Drivers
- testing
- Criteria for Testing Drivers
- Testing Drivers
- tuning, Tuning Drivers
- USB driver, USB Drivers
- usb_ia USB interface association driver, Devices With Interface-Association Descriptors
- usb_mid USB multi-interface driver
- Devices With Multiple Interfaces
- Devices With Interface-Association Descriptors
- Hot Removal
- Getting Interface Numbers
- using kstats, Kernel Statistics
- device ID functions, Device ID Functions
- device information
- binding a driver to a device, Binding a Driver to a Device
- binding a driver to a USB device, Compatible Device Names
- compatible device names, Compatible Device Names
- di_link_next_by_lnode() function, Device Information Library Interfaces
- di_link_next_by_node() function, Device Information Library Interfaces
- di_link_private_get() function, Device Information Library Interfaces
- di_link_private_set() function, Device Information Library Interfaces
- di_link_spectype() function, Device Information Library Interfaces
- di_link_t, Device Information Library Interfaces
- di_link_to_lnode() function, Device Information Library Interfaces
- di_lnode_devinfo() function, Device Information Library Interfaces
- di_lnode_devt() function, Device Information Library Interfaces
- di_lnode_name() function, Device Information Library Interfaces
- di_lnode_next() function, Device Information Library Interfaces
- di_lnode_private_get() function, Device Information Library Interfaces
- di_lnode_private_set() function, Device Information Library Interfaces
- di_lnode_t, Device Information Library Interfaces
- di_node_t, Device Information Library Interfaces
- di_walk_link() function, Device Information Library Interfaces
- di_walk_lnode() function, Device Information Library Interfaces
- DINFOLYR, Device Information Library Interfaces
- LDI, Retrieving Target Device Information
- lnode, Device Information Library Interfaces
- nblocks property, Device Sizes
- Nblocks property, Device Sizes
- property values, Retrieving Target Device Property Values
- self-identifying, Device Identification
- tree structure
- Device Tree Components
- Device Tree Components
- device instances, Fault Injection
- device interrupts, See interrupts; interrupt handling
- device layering, See LDI
- device memory
- D_DEVMAP flag in cb_ops, cb_ops Structure
- mapping
- Entry Points for Memory Mapped Devices
- Mapping Device and Kernel Memory
- device node, USB Devices and the Solaris Device Tree
- device number, description of, Devices as Special Files
- device polling, Interrupt Handler Functionality
- in character drivers, Multiplexing I/O on File Descriptors
- chpoll() function, Multiplexing I/O on File Descriptors
- poll() function, Multiplexing I/O on File Descriptors
- device power management
- components, Power Management Components
- definition of, Power Management Framework
- dependency, Power Management Dependencies
- entry points, power() Entry Point
- interfaces, Device Power Management Interfaces
- model, Device Power Management Model
- pm_busy_component() function
- Power Management States
- Busy-Idle State Transitions
- Device Power Management
- Device Power Management
- pm_idle_component() function
- Power Management States
- Busy-Idle State Transitions
- Busy-Idle State Transitions
- Device Power Management
- Device Power Management
- pm_lower_power() function
- Power Levels
- Device Power Management
- pm_raise_power() function
- Multiple Power Management Components
- Power Levels
- Busy-Idle State Transitions
- Device Power Management
- Device Power Management
- power() entry point
- Device Power Management
- Device Power Management
- power() function, power() Entry Point
- power levels, Power Levels
- state transitions, Busy-Idle State Transitions
- usb_create_pm_components() function, Device Power Management
- USB devices, Device Power Management
- device registers, mapping, attach() Entry Point
- device state in power management, Hardware State
- device tree
- displaying, Displaying the Device Tree
- navigating, in debugger, Obtaining Device Tree Information
- overview, Device Tree Components
- purpose in kernel, What Is the Kernel?
- device usage, Kernel Interfaces
- See LDI
- /devices directory
- description of, Devices as Special Files
- displaying the device tree, /devices Directory
- devinfo tree, Fault Injection
- devmap_ entry point, devmap_access() function, devmap_access() Entry Point
- devmap_ entry points
- devmap_access() function, devmap_unload() Entry Point
- devmap_contextmgt()function, devmap_contextmgt() Entry Point
- devmap_dup() function, devmap_dup() Entry Point
- devmap() function, The devmap(9E) Entry Point
- devmap_map() function, devmap_map() Entry Point
- devmap_unmap() function, devmap_unmap() Entry Point
- devmap_ functions
- devmap_devmem_setup() function, Associating Device Memory With User Mappings
- devmap_load() function, devmap_load() Entry Point
- devmap_umem_setup() function, Exporting Kernel Memory to Applications
- devmap_unload() function, devmap_unload() Entry Point
- diagnosis engine, definition, What Is Predictive Self-Healing?
- .dict dictionary files, Message IDs and Dictionary Files
- disaster recovery, Recovering the Device Directory
- disk
- I/O controls, Disk ioctls
- performance, Disk Performance
- disk driver testing, Disk Drivers
- DKI, See DDI/DKI
- DL_CLDLS, DLPI symbols, Implemented DLPI Primitives
- DL_ETHER
- Ethernet V2 packet processing, Type DL_ETHER: Ethernet V2 and ISO 8802-3 (IEEE 802.3)
- GLD support
- Generic LAN Driver Overview
- Type DL_ETHER: Ethernet V2 and ISO 8802-3 (IEEE 802.3)
- ISO 8802-3 (IEEE 802.3) packet processing, Type DL_ETHER: Ethernet V2 and ISO 8802-3 (IEEE 802.3)
- network statistics, Network Statistics
- DL_FDDI
- GLD support
- Generic LAN Driver Overview
- Types DL_TPR and DL_FDDI: SNAP Processing
- SNAP processing, Types DL_TPR and DL_FDDI: SNAP Processing
- DL_STYLE1, DLPI symbols, Implemented DLPI Primitives
- DL_STYLE2, DLPI symbols, Implemented DLPI Primitives
- DL_TPR
- GLD support
- Generic LAN Driver Overview
- Types DL_TPR and DL_FDDI: SNAP Processing
- Type DL_TPR: Source Routing
- SNAP processing, Types DL_TPR and DL_FDDI: SNAP Processing
- source routing, Type DL_TPR: Source Routing
- DL_VERSION_2, DLPI symbols, Implemented DLPI Primitives
- DLIOCRAW, ioctl() function, Implemented ioctl Functions
- DLPI primitives, Implemented DLPI Primitives
- DL_ATTACH_REQ
- Style 1 and Style 2 DLPI Providers
- Implemented DLPI Primitives
- DL_BIND_REQ
- Implemented DLPI Primitives
- Implemented DLPI Primitives
- DL_DETACH_REQ
- Implemented DLPI Primitives
- Implemented DLPI Primitives
- DL_DISABMULTI_REQ
- Implemented DLPI Primitives
- Implemented DLPI Primitives
- DL_ENABMULTI_REQ
- Implemented DLPI Primitives
- Implemented DLPI Primitives
- DL_GET_STATISTICS_ACK
- Implemented DLPI Primitives
- Implemented DLPI Primitives
- DL_GET_STATISTICS_REQ
- Implemented DLPI Primitives
- Implemented DLPI Primitives
- Network Statistics
- DL_INFO_ACK, Implemented DLPI Primitives
- DL_INFO_REQ, Implemented DLPI Primitives
- DL_PHYS_ADDR_ACK, Implemented DLPI Primitives
- DL_PHYS_ADDR_REQ, Implemented DLPI Primitives
- DL_PROMISCOFF_REQ
- Implemented DLPI Primitives
- Implemented DLPI Primitives
- DL_PROMISCON_REQ
- Implemented DLPI Primitives
- Implemented DLPI Primitives
- DL_SET_PHYS_ADDR_REQ
- Implemented DLPI Primitives
- Implemented DLPI Primitives
- DL_UNATTACHED_REQ, Implemented DLPI Primitives
- DL_UNBIND_REQ
- Implemented DLPI Primitives
- Implemented DLPI Primitives
- DL_UNITDATA_IND, Implemented DLPI Primitives
- DL_UNITDATA_REQ, Implemented DLPI Primitives
- DLPI providers, Style 1 and Style 2 DLPI Providers
- DLPI symbols
- DL_CLDLS, Implemented DLPI Primitives
- DL_STYLE1, Implemented DLPI Primitives
- DL_STYLE2, Implemented DLPI Primitives
- DL_VERSION_2, Implemented DLPI Primitives
- DMA
- buffer allocation, Allocating Private DMA Buffers
- burst sizes, Determining Maximum Burst Sizes
- callbacks, Canceling DMA Callbacks
- cookie
- DMA Model
- DMA Software Components: Handles, Windows, and Cookies
- freeing handle, Freeing the DMA Handle
- freeing resources, Freeing the DMA Resources
- handle
- DMA Model
- DMA Software Components: Handles, Windows, and Cookies
- Allocating a DMA Handle
- object, DMA Model
- object locking, Object Locking
- operations, DMA Operations
- physical addresses, Types of Host Platform DMA
- private buffer allocation, Allocating Private DMA Buffers
- register structure, Device Register Structure
- resource allocation, Allocating DMA Resources
- restrictions, DMA Attributes
- transfers
- DMA Operations
- DMA Transfers (Synchronous)
- virtual addresses, Types of Host Platform DMA
- windows
- DMA Software Components: Handles, Windows, and Cookies
- DMA Windows
- DMA functions, Direct Memory Access (DMA) Functions
- deprecated, Direct Memory Access (DMA) Functions
- driver binding name, Binding a Driver to a Device
- driver.conf files, See hardware configuration files
- driver instances, Using Separate Device Driver Instances
- driver module entry points, See entry points
- drivers, requests from user applications, Threats From Top-Down Requests
- drv_getparm() function, changes to, drv_getparm() Argument Changes
- drv_usecwait(9F), Delays
- DTrace
- definition, DTrace for Dynamic Instrumentation
- task queues, Task Queue DTrace SDT Probes
- dump() entry point, block drivers, dump() Entry Point (Block Drivers)
- DVMA
- SBus slots supporting, Physical SBus Addresses
- virtual addresses, Types of Host Platform DMA
- dynamic memory allocation, Dynamic Memory Allocation
|