<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=NeXTSTEPDRIVERKIT%3AChapter3_4</id>
	<title>NeXTSTEPDRIVERKIT:Chapter3 4 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=NeXTSTEPDRIVERKIT%3AChapter3_4"/>
	<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=NeXTSTEPDRIVERKIT:Chapter3_4&amp;action=history"/>
	<updated>2026-05-02T13:30:13Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://trans.onionmixer.net/wiki/index.php?title=NeXTSTEPDRIVERKIT:Chapter3_4&amp;diff=5491&amp;oldid=prev</id>
		<title>Onionmixer: NeXTSTEP DRIVER KIT 네트워크 장치 내용 추가</title>
		<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=NeXTSTEPDRIVERKIT:Chapter3_4&amp;diff=5491&amp;oldid=prev"/>
		<updated>2017-10-11T09:36:44Z</updated>

		<summary type="html">&lt;p&gt;NeXTSTEP DRIVER KIT 네트워크 장치 내용 추가&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;;Network Devices&lt;br /&gt;
&lt;br /&gt;
==네트워크 장치==&lt;br /&gt;
&lt;br /&gt;
Two classes, IONetwork and IONetbufQueue, support all drivers that directly control networking hardware.&amp;lt;BR&amp;gt;&lt;br /&gt;
IONetwork 과 IONetbufQueue 의 두 클래스는 네트워킹 하드웨어를 직접 제어하는 ​​모든 드라이버를 지원합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Driver Kit contains special support for Ethernet and Token Ring drivers in two IODirectDevice subclasses--IOEthernet and IOTokenRing--from which you create a subclass to build your network driver. IOEthernet and IOTokenRing implement the hardware-independent code needed to control Ethernet and Token Ring cards.&amp;lt;BR&amp;gt;&lt;br /&gt;
Driver Kit 에는 두 개의 IODirectDevice 하위 클래스인 IOEthernet 및 IOTokenRing 의 이더넷 및 토큰링 드라이버에 대한 특별 지원이 포함되어 있습니다. 이 하위 클래스에서 네트워크 드라이버를 빌드할 수 있습니다. IOEthernet 및 IOTokenRing 은 이더넷 및 토큰링 카드를 제어하는​​데 필요한 하드웨어 독립적인 코드를 구현합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Figure 3-1 shows the network device classes relative to their superclasses.&amp;lt;BR&amp;gt;&lt;br /&gt;
그림 3-1 은 상위 클래스와 관련된 네트워크 장치 클래스를 보여줍니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See the IOEthernet and IOTokenRing class descriptions for additional information on writing Ethernet and Token Ring drivers.&amp;lt;BR&amp;gt;&lt;br /&gt;
이더넷 및 토큰링 드라이버 작성에 대한 추가 정보는 IOEthernet 및 IOTokenRing 클래스 설명을 참조하십시오.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/NextDeveloper/Examples/DriverKit/SMC16&amp;#039;&amp;#039;&amp;#039; contains a network driver example.&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/NextDeveloper/Examples/DriverKit/SMC16&amp;#039;&amp;#039;&amp;#039; 에 네트워크 드라이버에 대한 예제가 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:NeXTSTEPDRIVERKIT_08.png|none|thumb|Figure 3-3. Classes for Network Drivers]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===개발 요구사항(Development Requirements)===&lt;br /&gt;
&lt;br /&gt;
The following hardware is required or recommended for development and support efforts:&amp;lt;BR&amp;gt;&lt;br /&gt;
개발 및 지원 노력을 위해 다음 하드웨어가 필요하거나 권장됩니다.&lt;br /&gt;
&lt;br /&gt;
* Two workstations with NEXTSTEP User software (mandatory--these serve as debug master and slave)&amp;lt;BR&amp;gt;NEXTSTEP 사용자 소프트웨어가 있는 두 대의 워크 스테이션(필수 - 디버그 마스터 및 슬레이브 역할 수행)&lt;br /&gt;
* NEXTSTEP Developer software on one of the workstations&amp;lt;BR&amp;gt;NEXTSTEP 워크스테이션중 한곳에 설치된 개발자 소프트웨어&lt;br /&gt;
* For Ethernet drivers, two supported Ethernet adapters, one of which supports NEXTSTEP kernel debugging (contact NeXT to get a list of qualifying adapters)&amp;lt;BR&amp;gt;이더넷 드라이버의 경우, 지원되는 두 개의 이더넷 어댑터 중 하나가 NEXTSTEP 커널 디버깅을 지원.(NeXT에 연락하여 자격을 갖춘 어댑터 목록을 얻어야 합니다)&lt;br /&gt;
* Target adapter hardware&amp;lt;BR&amp;gt;타겟 어댑터 하드웨어&lt;br /&gt;
* Networking hardware (cables, tees, terminators, transceivers, and hub) to link the two workstations&amp;lt;BR&amp;gt;두개의 워크스테이션을 연결하는 네트워킹 하드웨어(케이블, 티(tee), 터미네이터, 송수신기 및 허브등).&lt;br /&gt;
* Network analyzer (optional, but highly recommended)&amp;lt;BR&amp;gt;네트워크 분석기(옵션이지만 권장)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===기본 작업(Basic Operations)===&lt;br /&gt;
&lt;br /&gt;
A network driver needs to support these operations:&amp;lt;BR&amp;gt;&lt;br /&gt;
네트워크 드라이버는 이러한 작업을 지원해야합니다:&lt;br /&gt;
&lt;br /&gt;
* Instantiating and initializing a driver object&amp;lt;BR&amp;gt;드라이버 객체 인스턴스화 및 초기화&lt;br /&gt;
* Handling interrupts and timeouts&amp;lt;BR&amp;gt;인터럽트 및 타임아웃 처리&lt;br /&gt;
* Cold initialization&amp;lt;BR&amp;gt;Cold 초기화&lt;br /&gt;
* Warm initialization&amp;lt;BR&amp;gt;Warm 초기화&lt;br /&gt;
* Transmitting&amp;lt;BR&amp;gt;전송중&lt;br /&gt;
* Receiving&amp;lt;BR&amp;gt;수신중&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====드라이버 객체 인스턴스화 및 초기화====&lt;br /&gt;
&lt;br /&gt;
Override IODevice&amp;#039;s &amp;#039;&amp;#039;&amp;#039;probe:&amp;#039;&amp;#039;&amp;#039; method. Your &amp;#039;&amp;#039;&amp;#039;probe:&amp;#039;&amp;#039;&amp;#039; method should find the hardware based upon a user-configured parameter such as an ID sequence or signature. This method must validate the device description passed to &amp;#039;&amp;#039;&amp;#039;probe:&amp;#039;&amp;#039;&amp;#039;, failing with a diagnostic message if any values are invalid. The &amp;#039;&amp;#039;&amp;#039;probe:&amp;#039;&amp;#039;&amp;#039; method should allocate an instance of IOEthernet or IOTokenRing, if necessary, and invoke &amp;#039;&amp;#039;&amp;#039;initFromDeviceDescription:&amp;#039;&amp;#039;&amp;#039; to initialize the instance. If it finds anything invalid in the hardware or device description, it shouldn&amp;#039;t create a driver instance and should return NO.&amp;lt;BR&amp;gt;&lt;br /&gt;
IODevice 의 &amp;#039;&amp;#039;&amp;#039;probe:&amp;#039;&amp;#039;&amp;#039; 메소드를 덮어씁니다(Override). &amp;#039;&amp;#039;&amp;#039;probe:&amp;#039;&amp;#039;&amp;#039; 메서드는 ID 시퀀스(ID sequence) 또는 서명(signature)과 같은 사용자 설정 매개 변수(user-configured parameter)를 기반으로 하드웨어를 찾아야 합니다. 이 메소드는 &amp;#039;&amp;#039;&amp;#039;probe:&amp;#039;&amp;#039;&amp;#039; 로 전달된 디바이스 설명의 유효성을 검증해야 하며, 값이 유효하지 않은 경우 진단 메시지로 실패합니다. &amp;#039;&amp;#039;&amp;#039;probe:&amp;#039;&amp;#039;&amp;#039; 메소드는 필요한 경우 IOEthernet 또는 IOTokenRing 의 인스턴스를 할당하고 &amp;#039;&amp;#039;&amp;#039;initFromDeviceDescription:&amp;#039;&amp;#039;&amp;#039; 을 호출해서 인스턴스를 초기화해야 합니다. 하드웨어 또는 장치 설명에서 잘못된것이 있으면 드라이버 인스턴스를 생성해서는 안되며 NO 를 반환해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===인터럽트 및 타임아웃 처리===&lt;br /&gt;
&lt;br /&gt;
Implement &amp;#039;&amp;#039;&amp;#039;interruptOccurred&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;timeoutOccurred&amp;#039;&amp;#039;&amp;#039;. The kernel invokes &amp;#039;&amp;#039;&amp;#039;interruptOccurred&amp;#039;&amp;#039;&amp;#039; from the I/O thread whenever the hardware interrupts and invokes &amp;#039;&amp;#039;&amp;#039;timeoutOccurred&amp;#039;&amp;#039;&amp;#039; when a timeout occurs.&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;interruptOccurred&amp;#039;&amp;#039;&amp;#039; 및 &amp;#039;&amp;#039;&amp;#039;timeoutOccurred&amp;#039;&amp;#039;&amp;#039; 를 구현하십시오. 커널은 하드웨어가 인터럽트 할 때마다 I/O 스레드에서 &amp;#039;&amp;#039;&amp;#039;interruptOccurred&amp;#039;&amp;#039;&amp;#039; 를 호출하고 시간 초과가 발생하면 &amp;#039;&amp;#039;&amp;#039;timeoutOccurred&amp;#039;&amp;#039;&amp;#039; 를 호출합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Cold 초기화(Cold Initialization)===&lt;br /&gt;
&lt;br /&gt;
Cold initialization should perform any one-time initialization actions, such as reading the hardware address from ROM or allocating system memory for DMA buffers.&amp;lt;BR&amp;gt;&lt;br /&gt;
Cold 초기화는 ROM 에서 하드웨어 주소를 읽거나 DMA 버퍼에 시스템 메모리를 할당하는것과 같은 일회성 초기화 작업을 수행해야합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Warm 초기화(Warm Initialization)===&lt;br /&gt;
&lt;br /&gt;
Implement the &amp;#039;&amp;#039;&amp;#039;resetAndEnable:&amp;#039;&amp;#039;&amp;#039; method to prepare the hardware and software for network activity. This method should do the following:&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;resetAndEnable:&amp;#039;&amp;#039;&amp;#039; 메소드를 구현해서 네트워크 활동을 위한 하드웨어 및 소프트웨어를 준비하십시오. 이 메서드에서는 다음을 수행할 수 있어야 합니다:&lt;br /&gt;
&lt;br /&gt;
* Disable interrupts&amp;lt;BR&amp;gt;인터럽트 비활성화&lt;br /&gt;
* Clear pending timeouts&amp;lt;BR&amp;gt;타임아웃 보류 clear&lt;br /&gt;
* Initialize hardware settings and software data structures&amp;lt;BR&amp;gt;하드웨어 설정 및 소프트웨어 데이터 구조 초기화&lt;br /&gt;
* Cache physical addresses&amp;lt;BR&amp;gt;물리 주소 캐시&lt;br /&gt;
* Enable running by invoking &amp;#039;&amp;#039;&amp;#039;setRunning:&amp;#039;&amp;#039;&amp;#039;&amp;lt;BR&amp;gt;&amp;#039;&amp;#039;&amp;#039;setRunning:&amp;#039;&amp;#039;&amp;#039; 을 호출해서 실행 허용&lt;br /&gt;
* Reenable interrupts if the enable parameter is YES&amp;lt;BR&amp;gt;enable 매개 변수(parameter)가 YES 인 경우 인터럽트를 다시 활성화&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===전송중(Transmitting)===&lt;br /&gt;
&lt;br /&gt;
Depending on what your hardware supports, choose between using a single frame or a transmit queue.&amp;lt;BR&amp;gt;&lt;br /&gt;
하드웨어가 지원하는 기능에 따라 단일 프레임 또는 전송 대기열 중 하나를 선택하십시오.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To transmit a frame, implement the &amp;#039;&amp;#039;&amp;#039;transmit:&amp;#039;&amp;#039;&amp;#039; method to follow these steps:&amp;lt;BR&amp;gt;&lt;br /&gt;
프레임을 전송하려면 &amp;#039;&amp;#039;&amp;#039;transmit:&amp;#039;&amp;#039;&amp;#039; 메소드를 구현해서 다음 단계를 수행하십시오:&lt;br /&gt;
&lt;br /&gt;
# Queue the frame if it can&amp;#039;t be processed immediately.&amp;lt;BR&amp;gt;즉시 처리 할 수 없는 경우 프레임을 대기열에 둡니다.&lt;br /&gt;
# Perform a software loopback if necessary using &amp;#039;&amp;#039;&amp;#039;performLoopback:&amp;#039;&amp;#039;&amp;#039;.&amp;lt;BR&amp;gt;필요한 경우 &amp;#039;&amp;#039;&amp;#039;performLoopback:&amp;#039;&amp;#039;&amp;#039; 을 사용해서 소프트웨어 루프백을 수행하십시오.&lt;br /&gt;
# Transfer the frame to the hardware.&amp;lt;BR&amp;gt;프레임을 하드웨어로 전송하십시오.&lt;br /&gt;
# Free the frame&amp;#039;s network buffer; you may need to do this in an interrupt handler.&amp;lt;BR&amp;gt;프레임의 네트워크 버퍼를 비우십시오. 인터럽트 처리기(interrupt handler)에서 이 작업을 수행해야 할 수 있습니다.&lt;br /&gt;
# Set a timeout.&amp;lt;BR&amp;gt;타임아웃 지정&lt;br /&gt;
# Handle the transmit interrupt or timeout.&amp;lt;BR&amp;gt;전송 인터럽트 또는 타임 아웃을 처리(Handle)하십시오.&lt;br /&gt;
# Increment statistics such as number of frames sent, number of timeouts, and so on by invoking methods such as &amp;#039;&amp;#039;&amp;#039;incrementOutputPackets&amp;#039;&amp;#039;&amp;#039; in IONetwork.&amp;lt;BR&amp;gt;&lt;br /&gt;
IONetwork 에서 &amp;#039;&amp;#039;&amp;#039;incrementOutputPackets&amp;#039;&amp;#039;&amp;#039; 와 같은 메소드를 호출해서 전송 된 프레임 수, 시간 초과 수 등과 같은 통계를 증가시킵니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Warning:&amp;#039;&amp;#039;&amp;#039; Never attempt to retransmit at the driver level.&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Warning:&amp;#039;&amp;#039;&amp;#039; 드라이버 레벨에서 절대로 재전송을 시도하지 마십시오.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===수신중(Receiving)===&lt;br /&gt;
&lt;br /&gt;
To receive a packet, follow these steps:&amp;lt;BR&amp;gt;&lt;br /&gt;
패킷을 받으려면 다음 단계를 수행하십시오:&lt;br /&gt;
&lt;br /&gt;
# Handle the receive interrupt, which indicates that a packet has been received. Incoming frames must be in a network buffer. You can allocate network buffers with &amp;#039;&amp;#039;&amp;#039;nb_alloc()&amp;#039;&amp;#039;&amp;#039; or use &amp;#039;&amp;#039;&amp;#039;nb_alloc_wrapper()&amp;#039;&amp;#039;&amp;#039; to wrap already allocated memory as a network buffer. Note that these functions can&amp;#039;t be called at the interrupt level.&amp;lt;BR&amp;gt;패킷이 수신되었음을 나타내는 수신 인터럽트를 처리합니다. 들어오는 프레임은 네트워크 버퍼에 있어야 합니다. 네트워크 버퍼를 &amp;#039;&amp;#039;&amp;#039;nb_alloc()&amp;#039;&amp;#039;&amp;#039; 으로 할당하거나 &amp;#039;&amp;#039;&amp;#039;nb_alloc_wrapper()&amp;#039;&amp;#039;&amp;#039; 를 사용해서 이미 할당된 메모리를 네트워크 버퍼로 래핑할 수 있습니다. 이러한 함수는 인터럽트 수준(interrupt level)에서 호출할 수 없습니다.&lt;br /&gt;
# Check that the network buffer size is correct. You can shrink it with &amp;#039;&amp;#039;&amp;#039;nb_shrink_bot()&amp;#039;&amp;#039;&amp;#039; if needed.&amp;lt;BR&amp;gt;네트워크 버퍼 크기가 올바른지 확인하십시오. 필요한 경우 &amp;#039;&amp;#039;&amp;#039;nb_shrink_bot()&amp;#039;&amp;#039;&amp;#039; 을 사용하여 축소할 수 있습니다.&lt;br /&gt;
# Filter unwanted packets with &amp;#039;&amp;#039;&amp;#039;isUnwantedMulticastPacket:&amp;#039;&amp;#039;&amp;#039; in IOEthernet if the hardware doesn&amp;#039;t provide filtering based on individual multicast addresses.&amp;lt;BR&amp;gt;하드웨어가 개별 멀티 캐스트 주소(individual multicast addresses)를 기반으로 필터링을 제공하지 않는 경우라면, 원치 않는 패킷을 IOEthernet 에서 &amp;#039;&amp;#039;&amp;#039;isUnwantedMulticastPacket:&amp;#039;&amp;#039;&amp;#039; 으로 필터링 하십시오.&lt;br /&gt;
# Hand off the packet to the kernel by invoking &amp;#039;&amp;#039;&amp;#039;handleInputPacket:extra:&amp;#039;&amp;#039;&amp;#039; in IONetwork. This automatically invokes &amp;#039;&amp;#039;&amp;#039;incrementInputPackets&amp;#039;&amp;#039;&amp;#039; to increment that count.&amp;lt;BR&amp;gt;IONetwork 에서 &amp;#039;&amp;#039;&amp;#039;handleInputPacket:extra:&amp;#039;&amp;#039;&amp;#039; 를 호출해서 패킷을 커널에 전달하십시오. 그러면 자동으로 &amp;#039;&amp;#039;&amp;#039;incrementInputPackets&amp;#039;&amp;#039;&amp;#039; 이 호출되어 해당 개수가 증가합니다.&lt;br /&gt;
# Update statistics appropriately using methods such as &amp;#039;&amp;#039;&amp;#039;incrementInputErrors&amp;#039;&amp;#039;&amp;#039; in IONetwork.&amp;lt;BR&amp;gt;IONetwork 의 &amp;#039;&amp;#039;&amp;#039;incrementInputErrors&amp;#039;&amp;#039;&amp;#039; 와 같은 메소드를 사용해서 통계를 적절히 업데이트 하십시오.&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
	</entry>
</feed>