NdisMStartBufferPhysicalMapping
VOID
NdisMStartBufferPhysicalMapping(
IN NDIS_HANDLE MiniportAdapterHandle,
IN PNDIS_BUFFER Buffer,
IN ULONG PhysicalMapRegister,
IN BOOLEAN WriteToDevice,
OUT PNDIS_PHYSICAL_ADDRESS_UNIT PhysicalAddressArray,
OUT PUINT ArraySize
);
|
¸Å°³º¯¼ö
- MiniportAdapterHandle
- MiniportInitialize ÇÔ¼ö¿¡ ´ëÇÑ ÀÔ·Â ÇÚµéÀ» ÁöÁ¤ÇÑ´Ù.
- Buffer
- Àü¼ÛÀ» À§ÇØ °¡»ó ¹üÀ§¸¦ ¸ÊÇÎÇÏ´Â ¹öÆÛ µð½ºÅ©¸³Å͸¦ °¡¸®Å²´Ù. ÀÌ ¹öÆÛ´Â Àü¼ÛµÈ µ¥ÀÌÅ͸¦ Æ÷ÇÔÇÑ´Ù.
- PhysicalMapRegister
- Àü¼ÛÀ» À§ÇØ »ç¿ëµÈ ¸Ê ·¹Áö½ºÅÍÀÇ 0Åä´ë À妽º¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ °ªÀº µå¶óÀ̹ö°¡ NdisMAllocateMapRegisters·Î ÃʱâÈÇÏ´Â µ¿¾È ÇÒ´çµÈ ¸Ê ·¹Áö½ºÅ͵麸´Ù ÀÛÀº ¼öº¸´Ù ´õ Ŭ ¼ö ¾øÀ» °ÍÀÌ´Ù.
- WriteToDevice
- ¸ÊÇÎÀÌ NICÀ» ÅëÇØ ½Ã½ºÅÛÀ¸·ÎºÎÅÍ outbound Àü¼ÛÀ» À§ÇØ »ç¿ëµÉ ¶§ TRUE¸¦ ÁöÁ¤ÇÑ´Ù.
- PhysicalAddressArray
- °¢ ¿ä¼Ò´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾîÁö´Âµ¥ NDIS_PHYSICAL_UNIT ±¸Á¶Ã¼µéÀÇ È£ÃâÀÚ Á¦°ø ¹è¿À» °¡¸®Å²´Ù.
typedef struct _NDIS_PHYSICAL_ADDRESS_UNIT {
NDIS_PHYSICAL_ADDRESS PhysicalAddress;
UINT Length;
} NDIS_PHYSICAL_ADDRESS_UNIT, *PNDIS_PHYSICAL_ADDRESS_UNIT;
NdisMStartBufferPhysicalMapping¿¡ ´ëÇÑ ¼º°øÀûÀΠȣÃâ·ÎºÎÅÍ ¸®ÅϵÇÀÚ¸¶ÀÚ, ÀÌ·¯ÇÑ ¹è¿³»¿¡ ¿ä¼ÒµéÀº °¢ ¿ä¼Òµé³»¿¡¼ ´ÙÀ½°ú °°Àº ¸â¹öµé·Î NIC¿¡ ´Ù¿î·ÎµåµÇ¾îÁö´Âµ¥ Àû´çÇÑ ¸ÊµÈ ³í¸® ¹üÀ§µéÀ» ÁöÁ¤ÇÑ´Ù.
- PhysicalAddress
- Àü¼ÛµÇ¾îÁö´Â ºÐ»ê ¿¬»ê ¹üÀ§ÀÇ µ¥ÀÌÅÍÀÇ ½ÃÀÛÀ» À§ÇÑ º£À̽º ¹°¸® ÁÖ¼Ò¸¦ ÁöÁ¤ÇÑ´Ù.
- Length
- ¸ÊµÈ ¹üÀ§³»¿¡¼ ¹ÙÀÌÆ® ¼öµéÀ» ÁöÁ¤ÇÑ´Ù.
- ArraySize
- NdisMStartBufferPhysicalMappingÀº PhysicalAddressArrary¿¡¼ ¹öÆÛ³»¿¡ ¸ÊµÈ ¹üÀ§µé ¼ö¸¦ ¸®ÅÏÇϴ ȣÃâÀÚ Á¦°ø º¯¼ö¸¦ °¡¸®Å²´Ù. ÀÌ °ªÀº ¸ÊÇεéÀ» Æ÷ÇÔÇÏ´Â ¿ä¼ÒµéÀÇ Ä«¿îÆ®ÀÌ´Ù, ±×·¡¼ È£ÃâÀÚ´Â °è¼ÓÇØ¼ NIC¿¡¼ ´Ù¿î·ÎµåÇÏ´Â ½ÇÁ¦ ÁÖ¼Ò ¹üÀ§µéÀÇ ¼ö·Î ¹Ù¿îµå(bound)·Î¼ ÀÌ·¯ÇÑ Ä«¿îÆ®¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÁÖ¼®
¹ö½º¸¶½ºÅÍ NIC µå¶óÀ̹öµéÀº NIC°ú ¹Ù¿îµåµÈ ÇÁ·ÎÅäÄݵé·Î ÇâÇÏ´Â(originating) ¿ä±¸µéÀ» º¸³»´Â °Í¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î NdisMStartBufferPhysicalMapping ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. Áï, Buffer¿¡ ¹öÆÛ µð½ºÅ©¸³ÅÍ´Â NIC µå¶óÀ̹öÀÇ MiniportSend ȤÀº MiniportSendPackets ÇÔ¼ö¿¡ ´ëÇÑ ÆÐŶ ÀԷ°ú ¿¬°áµÇ¾îÁø´Ù.
¸ðµç ÇÁ·ÎÅäÄÝ µå¶óÀ̹ö´Â ¾Æ·¡ NICÀÇ Á¦ÇѵéÀ» suitÇϱâÀ§ÇØ º¸³»±â ÆÐŶµéÀ» ¼³Á¤Çϴ åÀÓÀÌ ÀÖ´Ù. NIC µå¶óÀ̹öÀÇ MiniportQueryInformation ÇÔ¼ö´Â ÀÌ¹Ì ¾î¶² OID_GEN_XXX ¿ä±¸µé¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î ÀÌ·¯ÇÑ Á¦ÇѵéÀ» ¸®ÅÏÇÑ´Ù. °á°úÀûÀ¸·Î, ¹Ì´ÏÆ÷Æ®´Â ³Ê¹« Å« Å©±âÀÇ ÇÁ·¹ÀÓµé ȤÀº Àü¼Û ºí·°µéÀ» À§ÇÑ È¤Àº Àü¼Û ¹öÆÛ ¿ÀÆÛÇ÷ο츦 Ÿ¢³ª µé¾î¿À´Â º¸³»±â ÆÐŶµéÀ» Å×½ºÆ®ÇÒ Çʿ䰡 ¾ø´Ù. OID µéÀÇ ´ëÇÑ ´õ ¸¹Àº Á¤º¸¸¦ À§Çؼ, Part 2¸¦ ºÁ¶ó.
NdisMStartBufferPhysicalMappingÀÇ È£ÃâÀÚ´Â PhysicalAddressArrayÀÎ ¹è¿Àº ÁÖ¾îÁø ¹öÆÛ¸¦ ¸ÊÇϱâ À§ÇØ ÃæºÐÇϵµ·Ï ÇÏ´Â °ÍÀ» È®½ÇÈ÷ ÇØ¾ß ÇÑ´Ù. ¹Ì´ÏÆ÷Æ®´Â ¾ó¸¶³ª ¸¹Àº ¿ä¼ÒµéÀÌ Buffer¿¡ µð½ºÅ©¸³Åͳ»¿¡ ÁöÁ¤µÈ °¡»ó ¹üÀ§¸¦ ¸ÊÇϱâ À§ÇØ ¿ä±¸µÇ¾îÁö´Â Áö¸¦ °áÁ¤Çϱâ À§ÇØ NdisGetBufferPhysicalArraySize ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.
±æÀ̰¡ 256K±îÁö¿Í °°Àº, ÀÛÀº Àü¼Û ¿ä±¸µéÀ» À§ÇØ, ¹Ì´ÏÆ÷Æ®´Â NdisMAllocateSharedMemory ȤÀº NdisMAllocateSharedMemoryAsync ÇÔ¼ö·Î ÀÌ¹Ì ÇÒ´çµÈ °øÀ¯ ¸Þ¸ð¸® °ø°£³»¿¡¼ staging ¹öÆÛ·Î Àü¼ÛµÇ¾îÁö´Â µ¥ÀÌÅ͸¦ º¹»çÇÔÀ¸·Î½á ´õ ³ôÀº ÆÛÆ÷¸Õ½º¸¦ ¼ºÃëÇÒ ¼ö ÀÖ´Ù. NIC µå¶óÀ̹ö°¡ ÀÌ¹Ì ±×·¯ÇÑ ¸ÊµÈ ¸Þ¸ð¸® ¹üÀ§¸¦ À§ÇØ °¡»ó °ú ½ÇÁ¦ ÁÖ¼ÒµéÀ» ¸ÊÇ߱⠶§¹®¿¡, ±×·¯ÇÑ Á¶¸¶ÇÑ DMA Àü¼ÛµéÀ» À§ÇØ NdisM...BufferPhysicalMapping ÇÔ¼öµéÀ» È£ÃâÇÒ ÇÊ¿ä´Â ¾ø´Ù.
¹ö½º¸¶½ºÅÍ NIC¿¡ ÀÇÇØ ¼ö½ÅµÈ µ¥ÀÌÅÍ´Â, ¹Ì´ÏÆ÷Æ®¿¡ ÀÇÇØ ÇÒ´çµÈ °øÀ¯µÈ ¸Þ¸ð¸® ºí·°³»¿¡ ÀåÄ¡Á¢±ÙÇÒ ¼ö ÀÖ´Â ¹öÆÛµé·Î Á÷Á¢ Àü¼ÛµÇ¾îÁø´Ù. ¹Ì´ÏÆ÷Æ®µéÀº ¿Ü¿¬ÀûÀ¸·Î Àü¼ÛµéÀ» À§ÇØ ´ÜÁö ¹ö½º¸¶½ºÅÍ DMA ¿¬»êµéÀ» ÇàÇÑ´Ù.
º¸³»±â ¿ä±¸¸¦ À§ÇØ ÆÐŶ µ¥ÀÌÅ͸¦ Àü¼ÛÇϱâ À§ÇØ, ¾î¶² ¹Ì´ÏÆ÷Æ®´Â ±âº»ÀûÀ¸·Î ´ÙÀ½°ú °°Àº ÀÏÀ» ÇÑ´Ù.
- NIC¿¡ ÀÇÇØ »ç¿ëÀ» À§ÇÑ ¸ÊµÈ ÀåÄ¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â ¹üÀ§ ÁÖ¼ÒµéÀ» ¾ò±â À§ÇØ NdisMStartBufferPhysicalMapping ÇÔ¼ö·Î µ¥ÀÌÅ͸¦ Æ÷ÇÔÇÑ °¡»ó ¹üÀ§¸¦ ¸ÊÇÑ´Ù.
- NIC¿¡ ´ëÇÑ ¸®ÅÏµÈ ½ÇÁ¦ ÁÖ¼ÒµéÀ» ´Ù¿î·ÎµåÇÑ´Ù.
- ¸¸¾à µå¶óÀ̹ö°¡ ij½¬ÈµÈ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù¸éÀº NdisFlushBuffer¿Í NdisMUpdateSharedMemory¸¦ È£ÃâÇÑ´Ù.
- Àü¼Û ¿¬»êÀ» À§ÇØ NICÀ» ÇÁ·Î±×·¥ÇÑ´Ù.
- NICÀÌ Àü¼ÛÀ» ¿Ï·áÇÒ ¶§, NICÀÌ Àü¼Û ÀÎÅÍ·´Æ®¿¡ ÀÇÇØ ȤÀº NIC µå¶óÀ̹öÀÇ Æú¸µ MiniportTimer ÇÔ¼ö¿¡ ÀÇÇØ ¹ß°ßµÈ »óÅ º¯È¿¡ ÀÇÇØ ÀεðÄÉÀÌÆ® ÇÏ´Â °ÍÀÌ ¾î´À °ÍÀÎÁö MiniportHandleInterrupt ÇÔ¼ö·ÎºÎÅÍ Ç×»ó NdisMCompleteBufferPhysicalMapping ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
NdisMStartBufferPhysicalMapping¿¡ ÀÇÇØ ¸®ÅÏµÈ ¾î¶² ¸ÊÇÎÀº ´ÜÁö ¹Ì´ÏÆ÷Æ®°¡ NdisMCompleteBufferPhysicalMapping ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§±îÁö À¯È¿ÇÏ´Ù. NdisMCompleteBufferPhysicalMapping ÇÔ¼ö°¡ Á¦¾î¸¦ ¸®ÅÏÇÒ ¶§, NdisMStartBufferPhysicalMapping ÇÔ¼ö¿¡ ´ëÇÑ ¼±Çà È£Ãâ¿¡¼ ÁöÁ¤µÈ PhysicalMapRegisters´Â °è¼ÓÇØ¼ DMA¿¬»ê¿¡¼ Àç»ç¿ëµÉ ¼ö ÀÖ´Ù.
NdisMStartBufferPhysicalMappingÀÇ È£ÃâÀÚµéÀº IRQL <= DISPATCH_LEVEL¿¡¼ ½ÇÇàÇÑ´Ù.
|