Input/Output Organizations

By Notes Vandar

6.1 Peripheral devices of input output organization

Peripheral devices are essential components of a computer system that enable input, output, and storage operations beyond the core functionalities of the CPU and memory. These devices are categorized into three main types: input devices, output devices, and storage devices. Here’s an overview of each category along with some examples of peripheral devices:

1. Input Devices

Input devices allow users to provide data and control signals to a computer. They convert physical actions into digital signals that the computer can process.

  • Keyboard: A device used for typing text and commands.
  • Mouse: A pointing device that allows users to interact with graphical elements on a screen.
  • Scanner: A device that converts physical documents and images into digital format.
  • Microphone: Captures audio input and converts it into a digital signal.
  • Webcam: A camera that captures video input for video conferencing or streaming.
  • Touchscreen: A display that allows users to interact directly with what is displayed by touching the screen.

2. Output Devices

Output devices take processed data from a computer and convert it into a form that can be understood by users, such as visual, auditory, or physical output.

  • Monitor: Displays visual output, such as text, images, and videos.
  • Printer: Produces hard copies of documents and images.
  • Speakers: Output audio signals from the computer.
  • Projector: Displays visual output on a larger screen or surface.
  • Plotter: A printer that produces large-scale graphics and drawings.

3. Storage Devices

Storage devices are used to store data and information for short-term or long-term use.

  • Hard Disk Drive (HDD): A traditional storage device that uses magnetic disks to store data.
  • Solid State Drive (SSD): A faster storage device that uses flash memory.
  • USB Flash Drive: A portable storage device that connects via USB ports.
  • Optical Disc (CD/DVD/Blu-ray): Media used for storing digital data.
  • External Hard Drive: A portable storage device that connects externally to a computer.

4. Communication Devices

These devices facilitate communication between computers or between computers and users.

  • Modem: Converts digital signals to analog for transmission over telephone lines and vice versa.
  • Network Interface Card (NIC): Allows a computer to connect to a network.
  • Router: Directs data traffic between networks.
  • Wireless Adapter: Enables wireless communication and connectivity to networks.

Peripheral Device Organization in Input/Output Systems

The organization of peripheral devices in a computer system involves a few key components:

  • Bus System: Peripheral devices communicate with the CPU and memory through a bus system. This system transfers data, control signals, and addresses between the CPU and peripherals.
  • Device Controllers: Each peripheral device typically has a controller that manages its operation and communicates with the CPU. The device controller interprets commands from the CPU and sends data to/from the device.
  • I/O Ports: Peripheral devices are connected through input/output ports, allowing them to send and receive data. These ports can be physical (like USB, HDMI) or logical (like network protocols).
  • Drivers: Software drivers are required for the operating system to communicate effectively with peripheral devices. Drivers translate high-level commands from the operating system into low-level commands that the device can understand.

 

6.2 I/O modules

I/O (Input/Output) modules are essential components in computer architecture that facilitate communication between the CPU and peripheral devices. They serve as intermediaries, managing the flow of data between the system’s internal components and external peripherals. Here’s an overview of I/O modules, their functions, types, and key characteristics:

Overview of I/O Modules

I/O modules are responsible for:

  1. Data Transfer: Moving data between the CPU and peripheral devices (like keyboards, printers, and storage devices).
  2. Control Signals: Generating control signals to coordinate data transfer operations.
  3. Data Buffering: Temporarily storing data being transferred between devices to accommodate differences in data transfer rates.
  4. Error Detection and Handling: Identifying and managing errors that occur during data transfer.
  5. Addressing: Managing the addressing of peripheral devices to ensure that data is directed to the correct location.

Types of I/O Modules

I/O modules can be classified based on various criteria:

  1. Based on Functionality:
    • Input Module: Facilitates data input from devices to the CPU. Examples include keyboard controllers and mouse interfaces.
    • Output Module: Handles data output from the CPU to devices. Examples include printer controllers and video output interfaces.
    • I/O Control Module: Manages both input and output operations, acting as a central controller for a set of peripheral devices.
  2. Based on Data Transfer Method:
    • Programmed I/O (PIO): The CPU actively polls the I/O module to check for the status of data transfer. This method can be inefficient due to CPU involvement.
    • Interrupt-driven I/O: The I/O module sends an interrupt signal to the CPU when it is ready to transfer data, allowing the CPU to perform other tasks while waiting for the I/O operation to complete.
    • Direct Memory Access (DMA): A specialized I/O module that allows peripherals to directly transfer data to and from memory without CPU intervention, improving efficiency.
  3. Based on the Number of Devices Supported:
    • Single-Device Modules: Control a single peripheral device.
    • Multi-Device Modules: Can handle multiple peripheral devices simultaneously.

Key Characteristics of I/O Modules

  1. Addressing Capability: Each I/O module has a unique address or identifier that the CPU uses to communicate with it. This addressing allows multiple devices to be connected to the system without conflicts.
  2. Data Format: I/O modules often include hardware that converts data formats between the CPU and the connected peripheral devices, ensuring compatibility.
  3. Speed: The speed of data transfer can vary significantly between I/O modules and the CPU. This discrepancy often necessitates buffering and synchronization mechanisms.
  4. Error Handling: I/O modules implement error detection mechanisms to identify and respond to data transmission errors. This may include checksums, parity bits, and timeouts.
  5. Bus Interface: I/O modules are typically connected to a bus system, allowing them to share data lines with the CPU and memory. The bus interface defines how data is sent and received.

 

6.3       Input‐output interface

The input-output (I/O) interface is a critical component of computer architecture that facilitates communication between the CPU and peripheral devices. It serves as the bridge that connects various input and output devices, enabling them to interact with the system’s main processing unit and memory. Understanding the I/O interface is essential for managing how data is exchanged and processed in a computer system.

Key Functions of the I/O Interface

  1. Data Transfer: The I/O interface manages the transfer of data between the CPU and peripheral devices. It defines the protocols and methods for sending and receiving data.
  2. Device Control: It generates control signals that dictate how and when data is transferred between the CPU and the peripheral devices. This includes managing the timing of operations and coordinating multiple devices.
  3. Buffering: The interface often includes buffering mechanisms to temporarily hold data during transfers. This is crucial for accommodating differences in data processing speeds between the CPU and I/O devices.
  4. Error Detection and Handling: The I/O interface can implement error-checking mechanisms, such as parity checks and checksums, to identify and respond to data transmission errors.
  5. Addressing: It manages device addressing, allowing the CPU to send commands and data to the correct peripheral devices without conflicts.

Types of I/O Interfaces

I/O interfaces can be categorized based on various criteria:

  1. Based on Connection Type:
    • Parallel Interface: Multiple bits are transmitted simultaneously across multiple channels. This type is faster for short distances (e.g., printers using a parallel port).
    • Serial Interface: Data is transmitted one bit at a time over a single channel. This method is slower but is more effective over longer distances (e.g., USB, RS-232).
  2. Based on Control Method:
    • Programmed I/O (PIO): The CPU actively controls the data transfer process, checking the status of the I/O devices through polling. This can lead to inefficiencies as the CPU is occupied during the transfer.
    • Interrupt-driven I/O: The I/O devices interrupt the CPU when they are ready for data transfer. This allows the CPU to perform other tasks while waiting for I/O operations, improving overall efficiency.
    • Direct Memory Access (DMA): A specialized interface that allows peripherals to transfer data directly to and from memory without involving the CPU, significantly enhancing data transfer speeds.
  3. Based on Application:
    • Standard Interfaces: Interfaces like USB, HDMI, and Ethernet that are widely used across various devices.
    • Custom Interfaces: Interfaces designed for specific applications or devices that may not conform to standard protocols.

Components of an I/O Interface

  1. Data Bus: A set of parallel or serial lines used to transfer data between the CPU, memory, and I/O devices.
  2. Control Lines: Signals that control the operation of the I/O devices, including read/write signals and interrupts.
  3. Status Lines: Lines used to convey the status of the device, indicating whether it is ready, busy, or has encountered an error.
  4. Registers: Small storage locations within the interface that hold data, addresses, and control information temporarily during the I/O operations.

Example of an I/O Interface: USB

The Universal Serial Bus (USB) interface is a widely used standard for connecting various peripherals to computers. Key features of the USB interface include:

  • Hot Swappable: Devices can be connected and disconnected without shutting down the system.
  • Power Supply: Provides power to connected devices, eliminating the need for separate power sources.
  • Data Transfer: Supports both low-speed (1.5 Mbps) and high-speed (up to 10 Gbps) data transfers.
  • Device Class Support: Allows various devices (e.g., keyboards, mice, printers) to communicate using standardized protocols.

 

6.4       Modes of transfer

In computer systems, modes of transfer refer to the different methods used for transferring data between the CPU and peripheral devices (input/output devices). Each mode of transfer has its own characteristics, advantages, and use cases. The primary modes of data transfer are:

1. Programmed I/O (PIO)

In programmed I/O, the CPU is directly involved in the data transfer process. The CPU executes a program that actively checks the status of the I/O devices and transfers data accordingly.

  • Characteristics:
    • The CPU periodically polls the I/O device to check if it is ready for data transfer.
    • The CPU reads data from the device and writes it to memory or vice versa.
  • Advantages:
    • Simple to implement, as it requires minimal hardware support.
    • Suitable for devices with predictable and consistent data transfer rates.
  • Disadvantages:
    • Inefficient, as the CPU spends a significant amount of time checking the status of devices (busy waiting).
    • Reduces overall CPU performance since it cannot perform other tasks while waiting for I/O operations to complete.

2. Interrupt-Driven I/O

In interrupt-driven I/O, the CPU initiates data transfer but does not continuously check the status of the I/O devices. Instead, devices send an interrupt signal to the CPU when they are ready for data transfer.

  • Characteristics:
    • The CPU can perform other tasks while waiting for the I/O device to be ready.
    • When an I/O device is ready, it interrupts the CPU, which then handles the data transfer.
  • Advantages:
    • More efficient than programmed I/O, as the CPU can execute other instructions while waiting for I/O operations.
    • Reduces CPU idle time and improves overall system performance.
  • Disadvantages:
    • Requires more complex hardware and software support for handling interrupts.
    • Interrupt handling can add overhead, especially in systems with many devices generating interrupts.

3. Direct Memory Access (DMA)

Direct Memory Access (DMA) is a specialized mode of data transfer that allows peripherals to transfer data directly to and from the system memory without continuous CPU intervention.

  • Characteristics:
    • A dedicated DMA controller manages the data transfer between the device and memory.
    • The CPU initializes the transfer by setting up the DMA controller and then can perform other tasks while the transfer occurs.
  • Advantages:
    • Frees up the CPU to perform other operations while data is being transferred, significantly improving system performance.
    • Suitable for high-speed data transfer applications, such as disk I/O and network communications.
  • Disadvantages:
    • More complex to implement, requiring additional hardware (DMA controller) and software support.
    • Potential for data bus contention if multiple devices request access to the bus simultaneously.

4. Memory-Mapped I/O

In memory-mapped I/O, peripheral devices are assigned specific memory addresses, allowing the CPU to read and write to these addresses as if they were regular memory locations.

  • Characteristics:
    • The same address space is used for both memory and I/O devices.
    • CPU instructions for reading and writing data can be used to interact with I/O devices.
  • Advantages:
    • Simplifies the instruction set, as the same instructions are used for both memory and I/O operations.
    • Allows for faster data transfer due to the direct access to the device’s memory.
  • Disadvantages:
    • Reduces the available address space for regular memory since some addresses are reserved for I/O devices.
    • Can lead to address conflicts if not carefully managed.

6.5       Programmed I/O 

Programmed I/O (Input/Output) is a method of data transfer between the CPU and peripheral devices in which the CPU actively controls the data transfer process. In this approach, the CPU directly reads from or writes to I/O devices based on the status of the device, usually involving polling to check whether the device is ready for communication.

Key Characteristics of Programmed I/O

  1. Polling Mechanism:
    • The CPU repeatedly checks (polls) the status of the I/O device to determine if it is ready to send or receive data. This polling is often done in a loop until the device indicates it is ready.
  2. CPU Involvement:
    • The CPU is actively involved in the transfer process, which means it dedicates time to manage I/O operations instead of performing other computational tasks.
  3. Direct Control:
    • The CPU directly controls the I/O operations, issuing commands and waiting for data to be read from or written to the I/O device.

Advantages of Programmed I/O

  1. Simplicity:
    • The implementation of programmed I/O is straightforward, requiring minimal additional hardware. It can be easily understood and used in simple systems.
  2. Deterministic Operation:
    • Since the CPU directly controls the data transfer process, the timing and order of operations can be precisely determined.
  3. No Additional Components:
    • Unlike Direct Memory Access (DMA), programmed I/O does not require a dedicated controller, which can reduce system complexity.

Disadvantages of Programmed I/O

  1. Inefficiency:
    • The CPU spends a significant amount of time polling devices, which leads to wasted CPU cycles and decreased overall system efficiency. During polling, the CPU cannot perform other useful tasks.
  2. CPU Bottleneck:
    • In systems with multiple I/O devices, programmed I/O can become a bottleneck, as the CPU is responsible for managing all data transfers, leading to potential performance degradation.
  3. Latency:
    • The latency of data transfer can increase due to the polling mechanism, especially for devices that take longer to respond.

Example of Programmed I/O

Here’s a simplified example of how programmed I/O might be implemented in a C program for reading data from a keyboard (an input device) and sending it to a display (an output device):

#include <stdio.h>
#include <stdlib.h>

// Simulated hardware register for keyboard status
#define KEYBOARD_READY 1
#define KEYBOARD_NOT_READY 0

// Simulated hardware register for keyboard input
char keyboard_input;

// Simulated hardware register for output device (e.g., display)
void output_device(char data) {
printf(“Output: %c\n”, data);
}

// Simulated function to check if the keyboard is ready
int is_keyboard_ready() {
return (rand() % 2) == 0 ? KEYBOARD_READY : KEYBOARD_NOT_READY; // Randomly simulate readiness
}

// Simulated function to read from the keyboard
char read_from_keyboard() {
return getchar(); // In a real scenario, this would read from a hardware register
}

int main() {
char data;

while (1) {
// Poll the keyboard status
while (is_keyboard_ready() == KEYBOARD_NOT_READY) {
// Busy wait until the keyboard is ready
}

// Read from the keyboard
data = read_from_keyboard();

// Output the data to the output device
output_device(data);
}

return 0;
}

Explanation of the Example

  • Polling: The program uses a while loop to check if the keyboard is ready for input. If it’s not ready, it continues to loop (busy waiting).
  • Reading Input: Once the keyboard is ready, it reads a character from the keyboard.
  • Output: The character is then sent to the output device (simulated by printing it to the console).

 

6.6       Interrupt‐driven I/O

Interrupt-Driven I/O is a method of input/output operations in computer systems where the CPU is notified (interrupted) by peripheral devices when they are ready for data transfer. Unlike programmed I/O, where the CPU continuously polls the devices, interrupt-driven I/O allows the CPU to perform other tasks while waiting for the devices to signal that they require attention.

Key Characteristics of Interrupt-Driven I/O

  1. Asynchronous Communication:
    • Peripheral devices operate asynchronously, meaning they can signal the CPU at any time when they are ready to send or receive data, rather than requiring the CPU to actively check their status.
  2. Interrupt Signals:
    • When a device is ready for communication, it sends an interrupt signal to the CPU. This signal can be generated by various events, such as data being available to read or a device completing a write operation.
  3. Interrupt Handlers:
    • The CPU uses a special routine, known as an interrupt handler or interrupt service routine (ISR), to process the interrupt signal. This routine is executed in response to the interrupt and is responsible for handling the data transfer.

Advantages of Interrupt-Driven I/O

  1. Efficiency:
    • The CPU can perform other computations while waiting for I/O operations to complete, leading to better utilization of CPU resources and overall system performance.
  2. Reduced Latency:
    • Data can be processed as soon as it is available, reducing the time the CPU waits for I/O operations to complete.
  3. Flexibility:
    • Supports multiple devices efficiently. Each device can interrupt the CPU, allowing for quick responses to different events.

Disadvantages of Interrupt-Driven I/O

  1. Complexity:
    • Implementing an interrupt-driven system requires more complex hardware and software, including the design of the interrupt handling mechanism and maintaining the state of the CPU when an interrupt occurs.
  2. Overhead:
    • Each interrupt incurs some overhead due to context switching (saving the state of the current process, loading the state of the interrupt handler, and restoring the state afterwards).
  3. Priority Management:
    • If multiple devices generate interrupts simultaneously, the system must have a way to prioritize them, which can add complexity to the design.

Example of Interrupt-Driven I/O

Here’s a simplified example of how interrupt-driven I/O might be implemented in a C program. In this case, we will simulate a keyboard interrupt that signals when data is available to read:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

// Function to simulate the keyboard interrupt
void keyboard_interrupt_handler(int signum) {
printf(“Interrupt: Data is available from the keyboard!\n”);
// Here, we would typically read data from the keyboard
}

int main() {
// Register the interrupt handler for SIGUSR1
signal(SIGUSR1, keyboard_interrupt_handler);

printf(“Waiting for keyboard input (simulate interrupt)\n”);

// Simulate waiting for keyboard input
while (1) {
// Simulate the interrupt after some time
sleep(2); // Wait for 2 seconds
kill(getpid(), SIGUSR1); // Send an interrupt signal to itself
}

return 0;
}

Explanation of the Example

  • Signal Handling: The program sets up a signal handler using the signal function to handle a user-defined interrupt (SIGUSR1).
  • Waiting for Input: The main loop simulates waiting for keyboard input. After every 2 seconds, it sends itself an interrupt signal.
  • Interrupt Handling: When the interrupt signal is received, the keyboard_interrupt_handler function is executed, simulating the processing of data from the keyboard.

6.7       Direct Memory access

Direct Memory Access (DMA) is a method that allows peripherals to directly transfer data to or from the system’s main memory, bypassing the CPU to improve efficiency.

Key Characteristics:

  • Controller: A DMA controller manages the data transfer between memory and I/O devices.
  • CPU Involvement: The CPU is only involved in setting up the transfer and is free to perform other tasks during the process.
  • Data Transfer: Data is transferred directly from the I/O device to memory or vice versa without CPU intervention.

Advantages:

  • Increased Efficiency: The CPU can perform other tasks while the transfer occurs.
  • Faster Data Transfer: Reduces CPU overhead, allowing faster I/O operations.

Disadvantages:

  • Complexity: Requires additional hardware (DMA controller).
  • Bus Contention: Multiple devices using DMA may compete for memory access.

DMA is widely used in high-speed devices like hard drives, graphics cards, and network interfaces to offload tasks from the CPU and improve system performance.

 

4o mini
You said:
6.7 Direct Memory access
ChatGPT said:
ChatGPT

 

You said:
6.7 Direct Memory access
ChatGPT said:
ChatGPT

Direct Memory Access (DMA)

Direct Memory Access (DMA) is a feature of computer systems that allows peripheral devices to communicate with the main memory directly, bypassing the CPU to speed up data transfer processes. This method enhances the overall performance of a computer by freeing the CPU from being involved in the data transfer operation, allowing it to execute other tasks simultaneously.

Key Features of DMA

  1. Bypassing the CPU:
    • DMA enables devices to read from or write to memory without continuous intervention from the CPU. This significantly reduces the CPU’s workload during data transfers.
  2. DMA Controller:
    • The hardware responsible for managing DMA operations is called the DMA controller. This controller coordinates the data transfers between I/O devices and memory.
  3. Data Transfer Modes:
    • DMA can operate in various modes:
      • Burst Mode: The DMA controller takes control of the system bus and transfers a block of data in one go, holding the bus until the transfer is complete.
      • Cycle Stealing Mode: The DMA controller transfers one data item at a time, allowing the CPU to access the bus between transfers.
      • Block Transfer Mode: Similar to burst mode, but transfers large blocks of data at once while temporarily taking over the bus.
  4. Interrupt Handling:
    • After completing the data transfer, the DMA controller sends an interrupt to the CPU to indicate that the operation is complete, allowing the CPU to resume its normal operations.

Advantages of DMA

  1. Efficiency:
    • By allowing devices to transfer data directly to and from memory, DMA reduces the amount of time the CPU spends managing I/O operations.
  2. Speed:
    • DMA can perform data transfers faster than traditional programmed I/O methods because it eliminates the need for the CPU to process every data byte.
  3. Reduced Latency:
    • Since DMA can handle multiple data transfers in the background, it minimizes the waiting time for I/O operations to complete.

Disadvantages of DMA

  1. Complexity:
    • Implementing DMA requires additional hardware (the DMA controller) and more complex system software to manage DMA operations and interrupts.
  2. Bus Contention:
    • The DMA controller and the CPU may compete for control of the system bus, potentially leading to delays in processing.
  3. Hardware Costs:
    • Adding a DMA controller increases the cost of the hardware and may require additional support circuits.

Example of DMA Operation

The following steps outline how DMA typically works in a computer system:

  1. Setup:
    • The CPU configures the DMA controller by specifying the source and destination addresses for the data transfer, as well as the amount of data to be transferred.
  2. Transfer Initiation:
    • Once configured, the DMA controller takes control of the system bus and begins the data transfer process, reading data from the source device and writing it directly to the destination memory location.
  3. Completion:
    • After the data transfer is complete, the DMA controller sends an interrupt signal to the CPU to notify that the operation is finished, allowing the CPU to proceed with its tasks.

Applications of DMA

  1. Disk I/O:
    • Used for transferring data between hard drives and RAM, especially for large files or bulk data transfers.
  2. Audio and Video Processing:
    • Essential for streaming audio and video data to and from memory without CPU intervention, ensuring smooth playback.
  3. Networking:
    • Employed in network cards to transfer incoming and outgoing packets to and from memory efficiently.

6.8       Data Communication processor

A Data Communication Processor (DCP) is a specialized hardware component designed to manage and facilitate data communication between different devices, systems, or networks. It plays a crucial role in ensuring that data is transmitted and received efficiently and accurately in computer networks.

Key Functions of a Data Communication Processor

  1. Protocol Handling:
    • DCPs manage various communication protocols to ensure that data is transmitted according to the specified rules. They can handle protocols such as TCP/IP, Ethernet, and others, enabling seamless communication across different networks.
  2. Data Formatting and Conversion:
    • The processor converts data into the appropriate format required by the transmitting or receiving device. This may include encoding, decoding, compression, or decompression of data.
  3. Error Detection and Correction:
    • DCPs implement error-checking mechanisms to identify and correct errors that may occur during data transmission. Techniques such as checksums, parity bits, and cyclic redundancy checks (CRC) are commonly used.
  4. Buffering and Flow Control:
    • They manage data buffers to temporarily store data during transmission and reception, ensuring that data flows smoothly between devices. Flow control techniques prevent data overflow and ensure that the sender does not overwhelm the receiver.
  5. Multiplexing and Demultiplexing:
    • DCPs can combine multiple data streams into a single transmission channel (multiplexing) and separate them back into individual streams at the destination (demultiplexing). This allows for efficient use of communication channels.
  6. Addressing and Routing:
    • They handle the addressing of data packets, ensuring that they are sent to the correct destination. DCPs can also assist in routing data through various network paths to optimize transmission.

Components of a Data Communication Processor

  1. Microprocessor or Microcontroller:
    • The core processing unit that executes instructions and manages data communication tasks.
  2. Memory:
    • Used for storing data, control information, and communication protocols. This may include both volatile (RAM) and non-volatile memory (ROM).
  3. Input/Output Interfaces:
    • These interfaces connect the DCP to other devices, such as sensors, modems, and computers, allowing for data transmission and reception.
  4. Network Interface Controller (NIC):
    • A specialized component that connects the DCP to a network, handling physical and data link layer protocols for network communication.

Applications of Data Communication Processors

  1. Networking Equipment:
    • DCPs are widely used in routers, switches, and bridges to manage data traffic across networks, ensuring efficient routing and switching of data packets.
  2. Modems:
    • In modems, DCPs facilitate the conversion of digital data into analog signals for transmission over telephone lines, and vice versa.
  3. Embedded Systems:
    • DCPs are found in various embedded systems where data communication is necessary, such as industrial automation systems, smart home devices, and IoT applications.
  4. Telecommunications:
    • Used in telecommunications equipment to manage voice, video, and data traffic, enabling reliable communication over different media.
  5. Real-Time Systems:
    • In systems requiring real-time data communication, such as air traffic control and medical devices, DCPs ensure timely and accurate data transfer.

Advantages of Data Communication Processors

  1. Efficiency:
    • By offloading data communication tasks from the CPU, DCPs allow for more efficient processing of data and better overall system performance.
  2. Flexibility:
    • DCPs can handle multiple communication protocols, making them adaptable to different networking environments and technologies.
  3. Scalability:
    • They enable scalable communication solutions that can grow with the network, supporting more devices and higher data rates as needed.

 

Next Chapter
Important Questions
Comments
Discussion
0 Comments
  Loading . . .