NeXTSTEPDRIVERKIT:Chapter1 4
- Driver Classes and Instances
드라이버 클래스와 인스턴스
You implement a driver by creating a subclass of one of the device type classes in the Driver Kit. A driver object is an instance of this subclass you've defined.
Driver Kit 에서 장치 유형 클래스 중 하나의 하위 클래스를 작성해서 드라이버를 구현합니다. 드라이버 객체는 정의한 이 하위 클래스의 인스턴스가 됩니다.
Each Driver Kit class has a set of methods, some of which don't actually do anything. These methods—even the ones that do nothing—provide a framework for you to build on. The classes and their methods all ignore hardware-dependent aspects of a driver to some extent. Of course, every driver must control real hardware, so you must implement or override the methods provided in the Driver Kit so that they perform their intended functions with your hardware. You essentially "fill in the blanks" in the methods to develop much of your driver.
각 Driver Kit 클래스에는 일련의 메소드가 있으며, 그 중 일부는 실제로 아무것도 수행하지 않습니다. 이러한 방법(아무것도 하지 않는 메서드까지)은 여러분이 구축 할 수 있는 프레임 워크를 제공합니다. 클래스와 메소드는 둘 다 드라이버의 하드웨어 종속적인 측면을 어느 정도 무시합니다. 물론 모든 드라이버는 실제 하드웨어를 제어해야 하므로, Driver Kit 에서 제공하는 메서드를 구현하거나 재정의해야 하드웨어에서 원하는 기능을 수행 할 수 있습니다. 드라이버를 개발하는 방법은 결국 "빈칸을 채우는것(fill in the blanks)" 이 됩니다.
You choose the Driver Kit class for which you're going to create a subclass based on the device type, such as display, network, sound, and so on.
디스플레이, 네트워크, 사운드 등과 같은 장치 유형을 기반으로 하위 클래스를 만들 Driver Kit 클래스를 선택합니다.
For example, you can write an Ethernet card driver by creating a subclass of the IOEthernet class. You then override each method in the IOEthernet superclass by writing code that performs that method's functions—using the software interface to your particular Ethernet card hardware. In other words, you take the generic methods provided by the IOEthernet class and make them specific to your hardware in the subclass that you implement.
예를 들어 IOEthernet 클래스의 하위 클래스를 만들어서 이더넷 카드 드라이버를 작성할 수 있습니다. 이후에 특정 이더넷 카드 하드웨어에 소프트웨어 인터페이스를 사용해서 해당 메소드의 기능을 수행하는 코드를 작성하는 것으로 IOEthernet 상위 클래스의 각 메소드를 대체합니다. 즉, IOEthernet 클래스가 제공하는 일반 메소드를 가져 와서, 구현하려하는 하위 클래스의 하드웨어에 맞게 지정합니다.
Most Driver Kit classes are never instantiated. Instead, they serve as abstract classes that give capabilities to their subclasses. For example, IODisplay is an abstract class that implements functionality common to all displays.
대부분의 Driver Kit 클래스는 결코 직접 인스턴스화 되지는 않습니다. 대신 하위 클래스에 기능을 제공하는 추상 클래스로 사용됩니다. 예를 들어, IODisplay는 모든 디스플레이에 공통된 기능을 구현하는 추상 클래스입니다.
The hierarchy of Driver Kit classes has three main branches, as shown in Figure 1-1.
Driver Kit 클래스의 계층에는 그림 1-1 에 표시된 것처럼 세 가지 주요 분기가 있습니다.
Note: Classes for developing disk drivers, such as IODisk, aren't currently documented.
Note: IODisk 와 같은 디스크 드라이버 개발을 위한 클래스는 현재 문서화 되어 있지 않습니다.
You create a subclass of a class in the IODevice branch to create your driver. All drivers are instances of subclasses of IODevice. These classes provide frameworks for specific types of device drivers.
IODevice 분기에서 클래스의 하위 클래스를 만들어 드라이버를 만듭니다. 모든 드라이버는 IODevice 의 하위 클래스의 인스턴스입니다. 이러한 클래스는 특정 유형의 장치 드라이버에 대한 프레임 워크를 제공합니다.
The other two branches—IODeviceDescription and IOConfigTable—provide information about drivers. IOConfigTable objects get configuration information aboutparticular devices and the system as a whole from configuration tables, which specify how a driver is to be configured. IODeviceDescription objects encapsulate configuration and other information about the driver and are used for initializing the driver. These classes allow you to configure the driver into the system and allow it to communicate with system hardware.
IODeviceDescription 및 IOConfigTable 의 서로 다른 두 브랜치는 드라이버에 대한 정보를 제공합니다. IOConfigTable 객체는 드라이버 구성 방법을 지정하는 구성 테이블에서 특정 장치 및 시스템 전체에 대한 구성 정보를 가져옵니다. IODeviceDescription 객체는 드라이버에 대한 구성 및 기타 정보를 캡슐화하며 드라이버를 초기화 하는데 사용됩니다. 이 클래스들을 사용해서 드라이버를 시스템에 구성하고, 시스템 하드웨어와 통신 할 수 있습니다.
In summary, the Driver Kit provides a framework for developing a driver for NEXTSTEP systems. It provides many of the pieces you need to create a driver—classes and protocols, methods, functions, and utilities—and puts the pieces together for you. A class hierarchy groups methods logically by function and device type. A thread mechanism, including a default I/O thread, ensures that methods work together, taking advantage of the NEXTSTEP architecture. You still have to implement the methods to fit your hardware, but the basic structure is already there. The paradigm embodied in the Driver Kit fits well with NEXTSTEP, but it's different from the model that standard UNIX drivers use. You can write a driver using a UNIX model, but it would require greater effort.
요약하자면, Driver Kit 은 NEXTSTEP 시스템용 드라이버를 개발하기 위한 프레임 워크를 제공합니다. 이 프레임워크는 드라이버를 만드는 데 필요한(클래스 및 프로토콜, 메소드, 함수 및 유틸리티) 많은 조각들을 제공하며, 이 조각들을 조립하면 됩니다. 클래스 계층 구조는 함수 및 장치 유형별로 메소드를 논리적으로 그룹화합니다. 기본 I/O 스레드를 포함하는 스레드 메커니즘은 NEXTSTEP 아키텍처를 활용하여 메서드가 함께 작동하도록 합니다. 하드웨어에 맞는 메소드를 구현해야 하지만 기본 구조는 이미 있습니다. Driver Kit 에 구현 된 패러다임은 NEXTSTEP 에는 잘 맞지만 표준 UNIX 드라이버가 사용하는 모델과는 다릅니다. UNIX 모델을 사용하여 드라이버를 작성하는것도 가능하지만. 더 많은 노력이 필요합니다.
직접 및 간접 장치 드라이버(Direct and Indirect Device Drivers)
Some devices, such as displays and network devices, are connected directly to the processor, and their drivers are referred to as direct device drivers. Other devices are connected to the processor indirectly through some secondary bus—such as SCSI peripherals connected to a SCSI bus. Drivers for such devices are called indirect device drivers. Drivers for direct devices talk to the hardware directly. Indirect device drivers talk to their device hardware indirectly through some direct device. A SCSI disk driver, for instance, communicates with the disk through a SCSI controller driver, which controls the SCSI bus.
디스플레이 및 네트워크 장치와 같은 일부 장치는 프로세서에 직접 연결되며, 이러한 장치의 드라이버를 직접 장치 드라이버라고합니다. 다른 장치들은 SCSI 버스에 연결된 SCSI 주변 장치와 같은 일부 보조 버스를 통해 간접적으로 프로세서에 연결됩니다. 직접 장치 용 드라이버는 하드웨어와 직접 대화합니다. 간접 장치 드라이버는 직접 장치를 통해 간접적으로 장치 하드웨어와 통신합니다. 예를 들어, SCSI 디스크 드라이버는 SCSI 버스를 제어하는 SCSI 컨트롤러 드라이버를 통해 디스크와 통신합니다.
Thus drivers talk to hardware either directly or indirectly, or they may not deal with hardware at all. Drivers are thus further classified into these three types:
따라서 드라이버는 직접 또는 간접적으로 하드웨어와 대화하거나, 하드웨어를 전혀 다루지 않을 수도 있습니다. 따라서 드라이버는 이 세 가지 유형으로 더 분류됩니다:
- Direct device drivers (for example, drivers for SCSI controllers)
직접 장치 드라이버 - Indirect device drivers (for example, drivers for disks attached to SCSI controllers)
간접 장치 드라이버 - Pseudo device drivers (drivers that control no hardware)
의사(psudo) 장치 드라이버
These classes work differently, are initialized differently, and require different system resources. This manual focuses primarily on direct and indirect drivers, not pseudo device drivers.
이러한 클래스들은 서로 다르게 작동하고, 다르게 초기화되며, 각각 다른 시스템 리소스가 필요합니다. 이 설명서는 주로 의사 드라이버가 아닌 직접 및 간접 드라이버에 중점을 둡니다.
Note that the IODevice branch in Figure 1-1 is further split into two branches. On one side is IODirectDevice, from which you would create a subclass for a direct device driver. Indirect device drivers stem from the other branch and are subclasses of IODevice.
그림 1-1 에서 IODevice 브랜치는 두 개의 브랜치로 나뉘어져 있습니다. 한쪽에는 직접 장치 드라이버에 대한 하위 클래스를 생성하는 IODirectDevice 가 있습니다. 간접 장치 드라이버는 다른 브랜치에서 갈라지며 IODevice 의 하위 클래스가 됩니다.
Terminology Used in This Document
이 문서에 사용 된 용어
The term driver refers to the implementation of a subclass of one of the Driver Kit device classes—since Driver Kit classes are typically abstract classes. Instances of a driver are instances of the subclass. Often an object is referred to as an object of one of its superclasses—for example, as an IOSCSIController object or IODevice object—to indicate that the object is an instance of any subclass of the superclass. Finally, device is sometimes used to refer to any IODevice object.
드라이버라는 용어는 일반적으로 추상 클래스 이기 때문에, Driver Kit 의 장치 클래스중 한가지의 하위 클래스 구현을 의미합니다. 드라이버의 인스턴스는 하위 클래스의 인스턴스가 됩니다. 일반적으로 객체는, 객체가 상위 클래스의 임의의 하위 클래스(예를 들어, IOSCSIController 객체 또는 IODevice 객체)의 인스턴스라는 것을 나타내기 위해 상위 클래스 중 하나의 객체로 참조됩니다. 마지막으로, 장치는 때때로 어떤 IODevice 객체를 지칭하기 위해 사용되기도 합니다.
As Figure 1-1 shows, IOSCSIController, IODisplay, and IOEthernet are subclasses of IODirectDevice. This classification occurs because instances of their subclasses talk directly to the hardware, performing such operations as handling interrupts, mapping memory, and performing DMA operations. IODisk, an indirect device class, is a subclass of IODevice—but not of IODirectDevice. This occurs because IODisk objects don't talk directly to the hardware: They talk indirectly to the hardware by sending request messages to IODirectDevice objects such as IOSCSIControllers.
그림 1-1 에서 볼 수 있듯이 IOSCSIController, IODisplay 및 IOEthernet 은 IODirectDevice 의 하위 클래스입니다. 하위 클래스의 인스턴스가 하드웨어와 직접 대화하고 인터럽트 처리, 메모리 매핑 및 DMA 작업 수행과 같은 작업을 수행하기 때문에 이렇게 분류됩니다. 간접 장치 클래스인 IODisk 는 IODevice 의 하위 클래스이지만 IODirectDevice 인것은 아닙니다. 왜냐하면 이것들은 IOSCSIController 와 같은 IODirectDevice 객체에 요청 메시지를 보내서 하드웨어에 간접적으로 이야기하기 때문에, 결국 IODisk 개체는 하드웨어와 직접 통신하지 않는 방식으로 분류됩니다.
Figure 1-2 shows how two objects—one an instance of a direct device driver, the other an instance of an indirect device driver—combine to control two pieces of hardware. The indirect driver, an IOSCSIDisk object, uses the direct driver, an IOSCSIController object, to control the hardware.
그림 1-2는 직접 장치 드라이버의 인스턴스와 간접 장치 드라이버의 인스턴스인 두 개체가 어떻게 결합되어 두 가지 하드웨어를 제어하는지를 보여줍니다. 간접 드라이버인 IOSCSIDisk 객체는 직접 드라이버인 IOSCSIController 객체를 사용해서 하드웨어를 제어합니다.
Note: IOSCSIDisk is a nonpublic subclass of IODisk.
Note: IOSCSIDisk 는 IODisk 의 비공개 하위 클래스입니다.
하드웨어 장치당 하나씩의 장치 드라이버 개체(One Device Driver Object per Hardware Device)
There is one device driver object for each hardware device. In Figure 1-3, one IOSCSIController object manages the SCSI controller, and an IOSCSIDisk object manages each disk. Both disks are connected to the same SCSI controller, so both IOSCSIDisk objects communicate with the hardware using the single IOSCSIController object.
각 하드웨어 장치마다 하나의 장치 드라이버 개체가 있습니다. 그림 1-3 에서는 하나의 IOSCSIController 객체는 SCSI 컨트롤러를 관리하며, IOSCSIDisk 객체가 각 디스크를 관리합니다. 두 디스크 모두 동일한 SCSI 컨트롤러에 연결되므로, 두개의 IOSCSIDisk 개체 모두 단일 IOSCSIController 개체를 사용해서 하드웨어와 통신합니다.
Driver Kit 클래스의 핵심
You typically create a subclass of either IODevice or IODirectDevice (or one of its subclasses) to create a driver.
일반적으로 IODevice 또는 IODirectDevice (또는 해당 하위 클래스 중 하나)의 하위 클래스를 만들어 드라이버를 만듭니다.
IODevice: 일반 장치 드라이버
Every driver is a subclass of IODevice. This class provides a standard programming interface for probing hardware and for creating, initializing, and registering a driver instance.
모든 드라이버는 IODevice 의 하위 클래스입니다. 이 클래스는 하드웨어 검색 및 드라이버 인스턴스 생성, 초기화 및 등록을 위한 표준 프로그래밍 인터페이스를 제공합니다.
IODirectDevice: 모든 직접 장치를 위한 클래스
IODirectDevice is the class for drivers that directly control hardware. This class adds data (that is, instance variables) and methods for managing interrupts, DMA channels, address ranges, and other resources. It contains a configuration table, an NXStringTable object of key/value pairs that hold configuration data provided by the system and the user.
IODirectDevice는 하드웨어를 직접 제어하는 드라이버 클래스입니다. 이 클래스는 데이터 (즉, 인스턴스 변수)와 인터럽트, DMA 채널, 주소 범위 및 기타 리소스를 관리하는 메서드를 추가하고 있습니다. 여기에는 시스템과 사용자가 제공한 구성 데이터를 보유하는 key/value 쌍의 NXStringTable 객체인 설정(configuration 테이블을 가지고 있습니다.
The IODirectDevice class has Objective C categories for specific hardware buses:
IODirectDevice 클래스에는 특정 하드웨어 버스에 대한 Objective C 카테고리가 있습니다:
- EISA-, ISA-,그리고 VL-Bus-based systems 를 위한 IOEISADirectDevice
- PCI-based systems 를 위한 IOPCIDirectDevice
- PCMCIA-based systems 를 위한 IOPCMCIADirectDevice
Display, network, SCSI controller, and sound drivers are all direct drivers that can be implemented as subclasses of IODirectDevice—or its subclasses. IODirectDevice has subclasses for each of these specific device types. For example, you can use the IODisplay class (a subclass of IODirectDevice) to write a display driver.
디스플레이, 네트워크, SCSI 컨트롤러 및 사운드 드라이버는 모두 IODirectDevice 의 하위 클래스, 또는 하위 클래스로 구현할 수 있는 직접 드라이버입니다. IODirectDevice 는 이러한 특정 장치 유형에 대한 하위 클래스를 가지고 있습니다. 예를 들어, IODisplay 클래스 (IODirectDevice 의 하위 클래스)를 사용해서 디스플레이 드라이버를 작성할 수 있습니다.
IODeviceDescription: 장치 정보
For every IODevice object, there's a device description object—an instance of the IODeviceDescription class—that contains information about the device. Thus every device in a system has a device description that contains information about the device:
모든 IODevice 객체에는 장치에 대한 정보가 들어있는 장치 설명 객체 (IODeviceDescription 클래스의 인스턴스)가 있습니다. 따라서 시스템의 모든 장치에는 장치에 대한 정보가 들어있는 장치 설명이 있습니다:
- Device address
- System resources (IRQ, DMA channels, and so on) used by the device
- Other information specific to the bus type
Instance variables in IODevice (of which the driver is a subclass) contain the rest of the device information, such as device type. The configuration tables, such as Default.table and Instancen.table, contain the device driver configuration information. These tables can be modified using the Configure application.
IODevice 의 하위 클래스인 드라이버의 인스턴스 변수에는 장치 유형과 같은 나머지 장치 정보가 들어 있습니다. Default.table 및 Instancen.table 과 같은 설정(configuration) 테이블에는 장치 드라이버 구성 정보가 들어 있습니다.
Class 구성요소
When you create a subclass, you add instance variables that are appropriate for your hardware, such as variables for memory-mapped registers. A subclass might include the following typical instance variables:
하위 클래스를 만들 때, 메모리 매핑된 레지스터에 대한 변수등과 같이 하드웨어에 적합한 인스턴스 변수를 추가합니다. 하위 클래스에는 다음과 같은 일반적인 인스턴스 변수가 포함될 수 있습니다:
- Pointers to hardware registers
- Device state from volatile or write-only registers
- Driver mode or state
- I/O management variables such as queue heads, locks for critical structures, or data buffer pointers
queue head, 중요한 구조체(structures) lock, 또는 데이터 버퍼 포인터와 같은 I / O 관리 변수 - Any per-device private data that normally goes in a UNIX driver's "softc" structure
일반적인 UNIX 드라이버의 "softc" 구조체(structures)에 들어있는 장치별 내부 데이터
Your subclass inherits a set of methods from its superclass to perform such actions such as these:
하위 클래스는 상위 클래스의 메소드 집합을 상속하여 이러한 액션을 수행합니다:
- Initialize the driver object
드라이버 객체 초기화 - Get and set values of instance variables
인스턴스 변수 값 가져오기(get) 및 설정(set) - Send commands to hardware
하드웨어로 명령어 전송 - Receive notifications such as interrupts, I/O completions, and timeouts
인터럽트, I/O 완료 및 시간 초과와 같은 알림 수신
In your subclass you can override methods from the superclass, and you can also add new ones. You customize these methods to work with your device's hardware.
하위 클래스에서 상위 클래스의 메서드를 재정의(override) 할 수 있으며, 새 클래스를 추가 할 수도 있습니다. 장치의 하드웨어에서 작동하도록 이러한 메서드들을 사용자 지정할 수 있습니다.
Suppose, for example, you're implementing a display driver for a display card that can linearly map the entire frame buffer. Create a subclass of the IOFrameBufferDisplay class (a subclass of IODisplay), then override four methods to do the following operations:
예를 들어 전체 프레임 버퍼를 선형적(linearly)으로 매핑할 수있는 디스플레이 카드용 디스플레이 드라이버를 구현한다고 가정합니다. IOFrameBufferDisplay 클래스 (IODisplay의 하위 클래스)의 하위 클래스를 만든 이후에, 네 가지 메서드를 재정의(override)해서 다음과 같은 작업을 수행합니다.
- initFromDeviceDescription: to invoke super 's implementation of initFromDeviceDescription:, map the display into the memory, and select the display mode.
initFromDeviceDescription:의 super 구현을 호출하고, 디스플레이를 메모리에 매핑하고, 디스플레이 모드를 선택하는 initFromDeviceDescription: - enterLinearMode to place the frame buffer device into the linear frame buffer mode selected during device initialization.
enterLinearMode 를 사용해서 프레임 버퍼 장치를 장치 초기화 중에 선택한 선형 프레임 버퍼 모드에 배치 - revertToVGAMode to set the display to run as a standard VGA device.
revertToVGAMode 를 이용해서 표준 VGA 장치로 실행되도록 디스플레이를 설정 - setBrightness: to control screen brightness, if the hardware supports this function.
setBrightness: 를 이용해서 하드웨어가 이 기능을 지원하는 경우, 화면 밝기를 제어
Once you've done this, you've finished much of your driver.
일단이 작업을 마치면 드라이버를 거의 끝냈다고 할 수 있습니다.