NdisAllocateMemory
NDIS_STATUS
NdisAllocateMemory(
OUT PVOID *VirtualAddress,
IN UINT Length,
IN UINT MemoryFlags,
IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
);
|
NdisAllocateMemoryÇÔ¼ö´Â Á¸ÀçÇÏ´Â(nonpaged) ½Ã½ºÅÛ °ø°£ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. ÁöÁ¤µÈ ÁÖ¼Ò Á¦Çѳ»¿¡¼, ¹°¸®ÀûÀ¸·Î ¿¬¼ÓÀûÀÎ ÇÒ´çÀ¸·Î¼, ±×¸®°í/ȤÀº ºñÄɽ¬ ÇÒ´çÀ¸·Î¼.
¸Å°³º¯¼ö
- VirtualAddress
- ÀÌ ÇÔ¼ö°¡ ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ±âº»ÀûÀÎ °¡»ó ÁÖ¼Ò¸¦ ¸®ÅÏÇÏ´Â °Í¿¡´ëÇÑ È£ÃâÀÚÁ¦°ø º¯¼öÀÇ Æ÷ÀÎÅÍ,¸¸¾à ÁöÁ¤µÈ ŸÀÔÀÇ ¸Þ¸ð¸®°¡ ÀÌ¿ëÇÒ¼ö ¾ø´Ù¸é NULL.
- Length
- ÇÒ´çµÇ¾îÁö´Â ¹ÙÀÌÆ®ÀÇ »çÀÌÁ ÁöÁ¤ÇÑ´Ù.
- MemoryFlags
- Á¦·Î ȤÀº ÇÒ´çµÈ ¸Þ¸ð¸® ŸÀÔÀ» ÁöÁ¤ÇÏ´Â ºñÆ®¸¶½ºÅ©¸¦ ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÑ´Ù.:
| °ª |
ÀÇ¹Ì |
| zero |
nonpaged½Ã½ºÅÛ °ø°£ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. |
| NDIS_MEMORY_CONTIGUOUS |
¹°¸®ÀûÀ¸·Î ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. |
| NDIS_MEMORY_NONCACHED |
ºñ Äɽ¬ÈµÈ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. |
´ÜÁö ´Ð µå¶óÀ̹öµé¸¸ÀÌ µå¶óÀ̹ö ÃʱâȽà ¿¬¼ÓÀûÀ̰ųª ºñ Äɽ¬ÈµÈ ¸Þ¸ð¸®ÀÇ ÇÒ´çÀ» ÁöÁ¤ÇÒ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ µÎ Ç÷¹±×´Â NdisAllocateMemoryÇÔ¼ö°¡ È£ÃâµÇ±âÀü¿¡ MemoryFlags·Î ORedµÇ¾îÁú¼ö ÀÖ´Ù.
- HighestAcceptableAddress
- -1À» ¼¼úÇÑ´Ù.
¸®Åϰª
NdisAllocateMemoryÇÔ¼ö´Â ´ÙÀ½Áß Çϳª¸¦ ¸®ÅÏÇÑ´Ù.
- NDIS_STATUS_SUCCESS
- È£ÃâÀÚ´Â VirtualAddress¿¡ ¸®ÅÏµÈ °ªÀ» ½ÃÀÛÀ¸·Î ÇÒ´çµÈ ¸Þ¸ð¸® ¹üÀ§¸¦ »ç¿ëÇÒ¼öÀÖ´Ù.
- NDIS_STATUS_FAILURE
- ¿äûµÈ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϱâÀ§ÇÑ ½Ãµµ´Â ½ÇÆÐÀÌ´Ù. ÀÌ ¸®ÅÏÀº ´ÙÀ½¿¡ À̾îÁö´Â È£ÃâÀÌ ½ÇÆÐÇÑ´Ù´Â ÇʼöÀûÀÎ Àǹ̰¡ ¾Æ´Ï´Ù.
ÁÖ¼®
NDISµå¶óÀ̹ö´Â NdisAllocateMemoryÇÔ¼ö¸¦ MemoryFlags¸¦ 0À¸·Î ¼³Á¤ÇÏ¿© È£ÃâÇÒÁö ¸ð¸¥´Ù. ¿¹¸¦µé¾î, NDIS upper-edgeÇÔ¼öµéÀÇ ¼³Á¤À» ÀͽºÆ÷Æ®ÇÏ´Â NDISµå¶óÀ̹öµéÀº ÄÁÅØ½ºÆ® ¿µ¿ªÀ» µå¶óÀ̹ö°¡ ´Ð´ç(ȤÀº °¡»ó ´Ð´ç)·±Å¸ÀÓ »óÅÂÁ¤º¸¸¦ À¯ÁöÇϰí VirtualAddress¿¡ ¸®ÅÏµÈ Æ÷ÀÎÅ͸¦ NdisMSetAttributes(Ex)·Î ³Ñ±â´Â°Í¿¡ÀÖ¾î ÇÒ´çÇϱâÀ§ÇØ NdisAllocateMemoryÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. NDIS lower-edge(ProtocolXxx)ÇÔ¼öÀÇ ¼³Á¤À» ÀͽºÆ÷Æ®ÇÏ´Â NDISµå¶óÀ̹öµé ¶ÇÇÑ ±×·± µå¶óÀ̹ö°¡ ¹öÆÛ °ø°£À» ÇÒ´çÇÒ Çʿ䰡 ÀÖÀ»¶§¸¶´Ù NdisAllocateMemory¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.
NdisAllocateMemory ¸¦ ÃʱâȽÿ¡ È£Ãâ Çϵµ·Ï ÇßÀ»¶§, ´ÜÁö NIC¹Ì´ÏÆ÷Æ®µé¸¸ÀÌ MemoryFlags¸¦ NDIS_MEMORY_XXX¸¦ µÑ´Ù ȤÀº Çϳª¸¦ ¼³Á¤ÇÒ¼öÀÖ´Ù. Ãʱâȵ¿¾È, ¹Ì´ÏÆ÷Æ® µå¶óÀ̹öµéÀº ±×µé ´Ð°ú °øÀ¯µÇ±âÀ§ÇØ ÀÌ·± ŸÀÔÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù.
¸¸¾à ±×·± ¹Ì´ÏÆ÷Æ®°¡ NdisAllocateMemoryÀÇ È£Ãâ¿¡¼ ¹°¸®ÀûÀ¸·Î ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸®¸¦ ÁöÁ¤ÇÑ´Ù¸é, °¡»ó ¸Þ¸ð¸® ÇÒ´çÀº ÇϳªÀÇ ¹°¸®ÀûÀ¸·Î ¿¬¼ÓÀûÀÎ ¿µ¿ªÀ» ÇÒ´çÇÑ´Ù. ¸¸¾à ¹Ì´ÏÆ÷Æ®°¡ ºñÄɽ¬ÈµÇ´Â ¸Þ¸ð¸®¸¦ ÁöÁ¤ÇÑ´Ù¸é,ÇÒ´çµÈ °¡»ó ¹üÀ§´Â Äɽ¬ÇϵÇÁö¾Ê´Â´Ù. ´Ðµå¶óÀ̹ö´Â DMA¿¬»êµ¿¾È Äɽ¬ ¹öÆÛ¸¦ Ç÷¯½¬Çϴ°;øÀÌ ºñÄɽ¬ÈµÈ ¸Þ¸ð¸®¸¦ Á¢±ÙÇÒ¼öÀÖ´Ù.
ÀÔ·Â MemoryFlagsÀÇ °ªÀÌ ¹«¾ùÀ̵ç, NdisAllocateMemoryÀÇ ¼º°øÀûÀΠȣÃâÀÚ´Â ÇÒ´çµÈ ¸Þ¸ð¸®¿¡ Á¢±ÙÇϱâÀ§ÇÑ °¡»ó ÁÖ¼ÒµéÀÇ ¹üÀ§¸¦ »ç¿ëÇÑ´Ù. ÇÒ´çÀÇ Å©±â¿¡ ±×¸®°í ¸Þ¸ð¸® ¿äû ŸÀÔ¿¡ ÀÇÁ¸ÇÏ¿©, Çϳª ȤÀº ±×ÀÌ»óÀÇ ¹°¸® ¸Þ¸ð¸®¹üÀ§(ÆäÀÌÁö)´Â ÀÌ ½Ì±Û °¡»ó ¹üÀ§¸¦ backÇÑ´Ù.
NDIS_MEMORY_XXX°¡ ´Ð µå¶óÀ̹ö¿¡ÀÇÇØ ¿¬¼ÓÀûÀÌ°í ºñÄɽ¬ÈµÇ´Â ÇÒ´çÀ» ¿äûÇϱâÀ§ÇØ MemoryFlags¿¡ ORedµÉ¼ö ÀÖ´Â ¹Ý¸é¿¡ µÎ ¿¬¼ÓÀûÀÌ°í ºñ Äɽ¬ÈµÇ´Â ¸Þ¸ð¸®´Â ¸Å¿ì Á¦ÇÑµÈ ½Ã½ºÅÛ ¸Þ¸ð¸®ÀÌ´Ù. ´Ð µå¶óÀ̹ö´Â ÇÊ¿äÀÌ»óÀ¸·Î ¸¹Àº ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸® ¿Í/ȤÀº ¸¹Àº ºñÄɽ¬ÈµÇ´Â ¸Þ¸ð¸®¸¦ ¿äÃ»ÇØ¼´Â ¾ÈµÈ´Ù. µå¶óÀ̹ö°¡ ÃʱâÈ Çϴµ¿¾ÈÀ» Á¦¿ÜÇϰí ÀÌ·± ŸÀÔÀÇ ¸Þ¸ð¸®Áß Çϳª¸¦ ÇÒ´çÇϵµ·Ï ÇÏ´Â ½Ãµµ´Â ÇÁ·Î±×·¡¹Ö ¿¡·¯ÀÌ´Ù. ±×·± ½Ãµµ´Â ¼º°øµÉ°Í °°Áö°¡ ¾Ê´Ù. ¿Ö³ÄÇÏ¸é ½Ã½ºÅÛ °ø°£ ¸Þ¸ð¸®´Â ´Ù¸¥ Ä¿³Î¸ðµå ¿ä¼Òµé¿¡ÀÇÇÑ ÇÒ´çÀ¸·Î Âɰ³Áö°íµÇ¹Ç·Î, ´Ù¸¥ µå¶óÀ̹ö¸¦ Æ÷ÇÔÇÏ¿©, ±×¸®°í ·±Å¸ÀÓ ÆäÀÌ¡ ¶§¹®¿¡.
¸¸¾à ±×·± Ãʱâȶ§ÀÇ È£ÃâÀÌ ½ÇÆÐÇϸé, ´Ðµå¶óÀ̹ö´Â Çϳª ȤÀº ±×ÀÌ»óÀÇ ÀÛÀº ºí·°ÀÇ ¿¬¼ÓÀû À̰í/ȤÀº ºñÄɽ¬ÈµÇ´Â ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ·Á°í ½Ãµµ ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à Å« ºí·°ÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ¼ö¾ø¾î¼ ÃʱâÈÇϴ°ÍÀ» ½ÇÆÐÇϱ⺸´Ù´Â.
NdisAllocateMemoryÇÔ¼öÀÇ È£ÃâÀÚ´Â ºñÆäÀÌȵǴ POOL·ÎºÎÅÍ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϱâÀ§ÇØ IRQL<=DISPATCH_LEVEL¿¡¼ µ¿ÀÛÇÒ¼ö ÀÖ´Ù. ¿¬¼ÓÀû À̰í/ȤÀº ºñÄɽ¬ÈµÇ´Â ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ´Â ´Ðµå¶óÀ̹ö´Â Ãʱâȵ¿¾È¿¡ IRQL PASSIVE_LEVEL¿¡¼ µ¿À۵Ǿî¾ß¸¸ ÇÑ´Ù.
|