NeXTSTEPDRIVERKIT:Chapter1 6

From 흡혈양파의 번역工房
Jump to: navigation, search
How IODevice Objects are Created

IODevice 객체 생성 방법

Drivers are packaged into driver bundles. A driver bundle contains its relocatable code and configuration information—everything needed to load and configure the driver. It may also contain help information, programs to be run before and after loading the driver, and a configuration inspector that the Configure application uses to access configuration data. Chapter 4, "Building, Configuring, and Debugging Drivers," tells you more about bundle contents and how to create a driver bundle.
드라이버는 driver bundles 에 패키지되어 있습니다. driver bundle 에는 재배치 가능한 코드와 구성 정보가 들어 있습니다. 이 정보는 드라이버를 로드하고 구성하는 데 필요한 모든 것입니다. 또한 도움말 정보, 드라이버를 로드하기 전후에 실행할 프로그램 및 구성 응용 프로그램이 구성 데이터에 접근하는데 사용하는 설정(configuration) 관리자를 포함할 수 있습니다. 4 장, "Building, Configuring, and Debugging Drivers" 에서는 번들 내용과 드라이버 번들의 생성 방법에 대해 설명합니다.


When the system starts up, it goes through three steps to create each driver object, using the information in the driver bundle:
시스템이 시작되면 driver bundle 의 정보를 사용해서 각 드라이버 개체를 만드는 세 단계를 거칩니다.

  1. Load the relocatable code for the driver.
    드라이버의 재배치 가능한 코드를 로드.
  2. Create an IODeviceDescription object for the device.
    장치에 대한 IODeviceDescription 객체를 만들기
  3. Send a probe: message to the IODevice class object to instantiate a driver object.
    IODevice 클래스 객체에 probe: 메시지를 보내 드라이버 객체를 인스턴스화 하기


The system goes through two phases of driver creation. In the first phase, it performs these three steps to create all the boot device drivers. Boot drivers are the drivers that must be loaded before the kernel can be active, such as the driver for the boot device. In the second phase, the system creates the active device drivers—drivers for the rest of the devices in the system. The System.config/Instance0.table file defines the boot and active devices.
시스템은 드라이버 생성에 대해서 두 단계를 거칩니다. 첫 번째 단계에서는 이 세 스텝을 수행하여 모든 부팅 장치 드라이버를 만듭니다. 부팅 드라이버는 부팅 장치용 드라이버와 같이 커널을 활성화하기 전에 로드해야 하는 드라이버 입니다. 두 번째 단계에서 시스템은 활성 장치 드라이버 (시스템의 나머지 장치 용 드라이버)를 만듭니다. System.config / Instance0.table 파일은 부팅 및 활성 장치를 정의합니다.


Some driver objects need to know about each other. For instance, an indirect driver controlling a SCSI peripheral needs to communicate with the direct driver that manages the SCSI controller. These drivers get connected with each other during the startup process. See "Connecting the Driver," in Chapter 2, "Designing a Driver."
일부 드라이버 객체는 서로에 대해 알아야 합니다. 예를 들어, SCSI 주변 장치를 제어하는 ​​간접 드라이버는 SCSI 컨트롤러를 관리하는 직접 드라이버와 통신해야 합니다. 이러한 드라이버는 시작 프로세스(startup process) 중에 서로 연결됩니다. 2 장, "Designing a Driver" 의 "Connecting the Driver" 을 참조하십시오.


The system is not limited to creating drivers only at system start up time. You can also load a driver after the system has started up with the driverLoader command. See "Using the driverLoader Command" in Chapter 4, "Building, Configuring, and Debugging Drivers," for more information.
시스템은 시스템을 시작하는 시점에서만 드라이버를 만드는 것으로 국한되는 것은 아닙니다. driverLoader 명령으로 시스템을 시작한 후에 드라이버를 로드할 수도 있습니다. 자세한 정보는 제 4 장, "Building, Configuring, and Debugging Drivers"의 "Using the driverLoader Command" 을 참조하십시오.


드라이버 재배치 가능 코드를 로딩하기

In the first phase of driver object creation, the kernel loads the driver's relocatable code (in the file Driver_reloc in the driver bundle, where Driver is the driver's name) if necessary. The driver is already loaded if it's in the kernel. If there are multiple instances of the driver, the relocatable code is loaded only once.
드라이버 개체 생성의 첫 번째 단계에서 커널은 필요한 경우 드라이버의 재배치 가능 코드(드라이버 번들의 Driver_reloc 파일에서 Driver 는 드라이버 이름)를 로드합니다. 드라이버가 이미 커널에 있으면 로드됩니다. 드라이버 인스턴스가 여러 개있는 경우 재배치 가능한 코드는 한 번만 로드됩니다.


장치 명세(Description) 만들기

Next, the kernel creates an IOConfigTable object that provides methods to examine the appropriate configuration file for the driver (either Default.table or Instancen.table). The IOConfigTable object parses the configuration information it gets, which is in configuration key/value pairs in this file. From this information, the kernel instantiates an IODeviceDescription object, which encapsulates information about the driver.
그런 다음, 커널은 드라이버의 적절한 설정(configuration) 파일(Default.table 또는 Instancen.table)을 검사하는 메소드를 제공하는 IOConfigTable 객체를 생성합니다. IOConfigTable 개체는이 파일의 설정 key/value 쌍에 있는 구성 정보를 구문 분석합니다. 이 정보에서 커널은 IODeviceDescription 객체를 인스턴스화 합니다. 이 객체는 드라이버에 대한 정보를 캡슐화합니다.


The driver's bus type is indicated in the configuration table as the value associated with the "Bus Type" configuration key (see "Configuration Keys" in the Appendix). The kernel creates the appropriate IODeviceDescription object for the bus:
드라이버의 버스 유형은 구성 표에서 "Bus Type" 설정 key 와 관련된 value 로 표시됩니다(부록의 "Configuration Keys" 를 참조하십시오). 커널은 버스에 적합한 IODeviceDescription 객체를 생성합니다:

  • Bus Type
    • IODevice Description Subclass
  • EISA, ISA, VL-Bus
    • IOEISADeviceDescription
  • PCI
    • IOPCIDeviceDescription
  • PCMCIA
    • IOPCMCIADeviceDescription


IOPCIDeviceDescription and IOPCMCIADeviceDescription are subclasses of IOEISADeviceDescription, which is a subclass of IODeviceDescription.
IOPCIDeviceDescription 과 IOPCMCIADeviceDescription 은 IODeviceDescription 의 하위 클래스 인 IOEISADeviceDescription 의 하위 클래스입니다.


After instantiating the IODeviceDescription object, the kernel may do further initialization, using methods in IODeviceDescription to get configuration information. For example, for a PCI-bus device, the kernel might check whether the location of the object on the bus is correct, and if it isn't, the kernel doesn't initialize that device.
IODeviceDescription 객체를 인스턴스화한 후, 커널은 IODeviceDescription의 메소드를 사용하여 설정 정보를 가져 오는 추가 초기화 작업을 수행 할 수 있습니다. 예를 들어, PCI 버스 장치의 경우, 커널은 버스에 있는 객체의 위치가 올바른지 여부를 검사하며, 위치가 올바르지 않은 경우라면, 커널은 해당 장치를 초기화하지 않을 수 있습니다.


If the system supports automatic detection of devices, it automatically scans all system buses to determine which devices are present and to obtain additional configuration information. For more information, see "Auto Detection of Devices" in "Other Features" of Chapter 5, "Reference." Some EISA- and PCI-based systems support this feature.
시스템이 장치의 자동 감지를 지원한다면, 모든 시스템 버스를 자동으로 검색하여 어떤 장치가 있는지 확인하고 추가 구성 정보를 얻습니다. 자세한 내용은 5 장, "Reference" 의 "Other Features" 에서 "Auto Detection of Devices" 을 참조하십시오. 일부 EISA 및 PCI 기반 시스템은 이 기능을 지원합니다.


For more information on configuration tables, see Chapter 4.
설정 테이블(configuration tables)에 대한 자세한 내용은 4 장을 참조하십시오.


드라이버 인스턴스화(Instantiating Drivers)

The kernel invokes probe:, a class method in the IODevice class, to instantiate a driver. You must override this method in your driver.
커널은 IODevice 클래스의 클래스 메소드 인 probe: 를 호출해서 드라이버를 인스턴스화합니다. 드라이버에서 이 메서드를 재정의해야 합니다.


The receiver of a probe: message determines whether to create a new instance of itself, with the help of information passed as the probe: message's argument—the IODeviceDescription object created in the previous step. The IODeviceDescription object contains information about the device's logical location in the system, and the device can query this object for additional information about the way it is configured. From this information, probe: can determine whether the device exists. If the device is present, probe: instantiates and initializes the driver. Your probe: method should invoke the initFromDeviceDescription: method, which initializes the driver.
probe: 메시지의 수신자는 probe: 메시지의 인수(이전 단계에서 생성 된 IODeviceDescription 객체)로 전달되는 정보의 도움으로 자체의 새 인스턴스를 생성할지의 여부를 결정합니다. IODeviceDescription 개체는 시스템상 장치의 논리 위치에 대한 정보를 포함하며, 장치는 이 개체를 질의해서 설정(configured) 방법에 대한 추가 정보를 얻을 수 있습니다. 이 정보에서 probe: 는 장치가 있는지의 여부를 결정할 수 있습니다. 장치가 있으면 probe: 는 드라이버를 인스턴스화 하고 초기화 합니다. probe: 메소드는 드라이버를 초기화하는 initFromDeviceDescription: 메소드를 호출해야합니다.


Note: Use the alloc and initFromDeviceDescription: methods to instantiate and initialize the driver, not the new method.
Note: allocinitFromDeviceDescription: 메소드를 사용해서 new 메소드가 아닌 드라이버를 초기화하고 초기화하십시오.


If probe: creates a driver instance, it returns YES. Otherwise, it returns NO.
probe: 가 드라이버 인스턴스를 생성하면 YES 를 반환합니다. 그렇지 않으면 NO 를 반환합니다.


Note: Declare your probe: method to return BOOL—not id.
Note: probe: 메소드를 선언해서 id 가 아닌 BOOL 을 반환하십시오.[1]


Notes

  1. Objective C 에서 id 는 그 자체로 하나의 type 입니다. 객체의 ID 를 나타내기도 하는데, 객체의 ID 를 반환받는게 아니라 YES 또는 NO 를 반환할 수 있도록 코드를 수정하라는 의미입니다.