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 ¿¬»êµéÀ» ÇàÇÑ´Ù.

º¸³»±â ¿ä±¸¸¦ À§ÇØ ÆÐŶ µ¥ÀÌÅ͸¦ Àü¼ÛÇϱâ À§ÇØ, ¾î¶² ¹Ì´ÏÆ÷Æ®´Â ±âº»ÀûÀ¸·Î ´ÙÀ½°ú °°Àº ÀÏÀ» ÇÑ´Ù.

  1. NIC¿¡ ÀÇÇØ »ç¿ëÀ» À§ÇÑ ¸ÊµÈ ÀåÄ¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â ¹üÀ§ ÁÖ¼ÒµéÀ» ¾ò±â À§ÇØ NdisMStartBufferPhysicalMapping ÇÔ¼ö·Î µ¥ÀÌÅ͸¦ Æ÷ÇÔÇÑ °¡»ó ¹üÀ§¸¦ ¸ÊÇÑ´Ù.
  2. NIC¿¡ ´ëÇÑ ¸®ÅÏµÈ ½ÇÁ¦ ÁÖ¼ÒµéÀ» ´Ù¿î·ÎµåÇÑ´Ù.
  3. ¸¸¾à µå¶óÀ̹ö°¡ ij½¬È­µÈ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù¸éÀº NdisFlushBuffer¿Í NdisMUpdateSharedMemory¸¦ È£ÃâÇÑ´Ù.
  4. Àü¼Û ¿¬»êÀ» À§ÇØ NICÀ» ÇÁ·Î±×·¥ÇÑ´Ù.
  5. NICÀÌ Àü¼ÛÀ» ¿Ï·áÇÒ ¶§, NICÀÌ Àü¼Û ÀÎÅÍ·´Æ®¿¡ ÀÇÇØ ȤÀº NIC µå¶óÀ̹öÀÇ Æú¸µ MiniportTimer ÇÔ¼ö¿¡ ÀÇÇØ ¹ß°ßµÈ »óÅ º¯È­¿¡ ÀÇÇØ ÀεðÄÉÀÌÆ® ÇÏ´Â °ÍÀÌ ¾î´À °ÍÀÎÁö MiniportHandleInterrupt ÇÔ¼ö·ÎºÎÅÍ Ç×»ó NdisMCompleteBufferPhysicalMapping ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
NdisMStartBufferPhysicalMapping¿¡ ÀÇÇØ ¸®ÅÏµÈ ¾î¶² ¸ÊÇÎÀº ´ÜÁö ¹Ì´ÏÆ÷Æ®°¡ NdisMCompleteBufferPhysicalMapping ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§±îÁö À¯È¿ÇÏ´Ù. NdisMCompleteBufferPhysicalMapping ÇÔ¼ö°¡ Á¦¾î¸¦ ¸®ÅÏÇÒ ¶§, NdisMStartBufferPhysicalMapping ÇÔ¼ö¿¡ ´ëÇÑ ¼±Çà È£Ãâ¿¡¼­ ÁöÁ¤µÈ PhysicalMapRegisters´Â °è¼ÓÇØ¼­ DMA¿¬»ê¿¡¼­ Àç»ç¿ëµÉ ¼ö ÀÖ´Ù.

NdisMStartBufferPhysicalMappingÀÇ È£ÃâÀÚµéÀº IRQL <= DISPATCH_LEVEL¿¡¼­ ½ÇÇàÇÑ´Ù.