วิธีการแมปตัวปรับต่อ RAM ลงในพื้นที่ที่อยู่ระหว่างดำเนินการ

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 189327 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

เมื่อคุณแมปหน่วยความจำของอะแดปเตอร์จำนวนมาก คุณอาจได้รับข้อความกับอาการต่อไปนี้อย่างใดอย่างหนึ่ง:
  • unavailability ของระบบ PTEs (NO_MORE_SYSTEM_PTES)
  • พื้นที่ไม่เพียงพอที่อยู่ของกระบวนการที่ต่อเนื่องกัน
บทความนี้อธิบายถึง:
  • เหตุใดจึงเกิดปัญหาเหล่านี้เกิดขึ้น
  • วิธีการแก้ไขแฟ้มเหล่านั้น
  • เมื่อต้องการแมปหน่วยความจำของการ์ดเชื่อมต่อลงในพื้นที่ที่อยู่ของกระบวนการสองวิธี

ข้อมูลเพิ่มเติม

คำแนะนำรายการในตารางของเพจ (PTE)

กระบวนการทั้งหมดที่ทำงานบนระบบ Windows NT ได้ 4 กิกะไบต์เสมือนอยู่ ranging จาก 0x00000000 0xFFFFFFFF สำหรับการใช้ นี้ อยู่ 2 กิกะไบต์บนที่ ranging จาก 0x8000000 0xFFFFFFFF ทั่วไปกระบวนการทั้งหมดที่ทำงานในระบบ และจะเรียกว่าพื้นที่ของที่อยู่ของเคอร์เนลหรือระบบ พื้นที่ต่ำกว่า ranging จาก 0x00000000 0x7FFFFFFF เรียกว่าพื้นที่ที่อยู่ของผู้ใช้

จากมุมมองกระบวนการ แต่ละองค์ประกอบของที่อยู่เสมือน conceptually อ้างถึงไบต์ของหน่วยความจำกายภาพ เป็นความรับผิดชอบของในหน่วยความจำเสมือน'ตัวจัดการ' (VMM) ร่วมกับหน่วยตัวจัดการหน่วยความจำของตัวประมวลผล (MMU) เพื่อแปล หรือแมปที่อยู่เสมือนแต่ละที่อยู่ทางกายภาพที่สอดคล้องกัน VMM ทำการแมป โดยการหารเท่าของ RAM ในเฟรมเพขนาดถาวร การสร้างตารางของหน้าเพื่อเก็บข้อมูลเกี่ยวกับเฟรมเพเหล่านี้ และแมปเหล่านั้น แต่ละ PTE แทนเฟรมของหน้า และประกอบด้วยรายละเอียดที่จำเป็นสำหรับ VMM เพื่อค้นหาหน้า

บนอิน x ใช้ x86 ระบบที่ใช้ขนาดเป็นกิโลไบต์ 4 หน้า PTEs ที่จำเป็นต้องแมปพื้นที่ที่อยู่ 2 GB จำนวนสูงสุดคือ 524,288 (2 กิกะ ไบต์/4 KB) บนระบบโดยทั่วไป พื้นที่นี้ถูกใช้เป็นดังนี้:
  • สูงสุด PTEs 50,000 (ประมาณเมกะไบต์ 195 พื้นที่ที่อยู่) ถูกสำรองสำหรับการใช้งานทั่วไป
  • ส่วนเหลือถูกใช้ในการแมปแคชของระบบ hyperspace จพู พู nonpaged พื้นที่การถ่ายโอนข้อมูลความล้มเหลว และอื่น ๆ
ขนาดการเก็บพัก PTE นี้ถูกกำหนดโดยอัตโนมัติเมื่อเริ่มต้นระบบที่ขึ้นอยู่กับจำนวนของหน่วยความจำทางกายภาพในระบบ ประเภทการผลิตนี้ถูก squeezed ระหว่างจพูและ nonpaged พู ซึ่งยัง grows ด้วยจำนวนของหน่วยความจำทางกายภาพในระบบเช่นเดียวกัน

ระบบใช้ PTEs เหล่านี้เพื่อสร้างกองไพ่เธรดเคอร์เนล โหลดโปรแกรมควบคุมอุปกรณ์ (และ DLLs ของพวกเขา), การแมปพื้นที่ที่อยู่เสมือนของระบบสำหรับการโอนย้าย I/O หรือผู้เรียก MmMapIoSpace/MmMapLockedPages/MmGetSystemAddressForMdl/MmAllocateNonCachedMemory และ สำหรับวัตถุประสงค์อื่นเบ็ดเตล็ด ระบบนี้พู PTE สามารถกลายเป็น heavily ใช้ และ heavily มาก นี้หมายความว่าโปรแกรมควบคุมของคุณอาจไม่สามารถรับเนื้อที่ว่างเพียงพอที่อยู่เสมือนที่ต่อเนื่องจากระบบพู PTE ตลอดเวลากำหนด ถึงแม้ว่าผลรวมของเนื้อที่ที่ยัง เหลืออยู่ในที่อยู่ อาจมีขนาดใหญ่พอ

หมายด้วยความ ลดว่า ถ้าโปรแกรมควบคุมของคุณใช้อัพระบบพู PTE ทั้งหมด ส่วนอื่น ๆ ของระบบจะลง ได้แม้แต่ในเธรดไม่ถูกสร้าง ระบบ stalls และตรวจสอบจุดบกพร่อง outright (เนื่องจากโปรแกรมควบคุมบางโปรแกรมเรียกใช้หน่วยความจัดสรร--จำระบบ มีการตั้งค่าพารามิเตอร์การ MustSucceed)

คุณต้องระวังมากเมื่อใช้แมปพูอย่างเดียวนี้ ใช้เข้าถึงจากบริบทกระบวนการใด ๆ บางส่วนของอะแดปเตอร์ RAM ที่ว่า คุณจำเป็นจริง ๆ ต้องระบบ และเฉพาะจำนวนที่คุณต้องแมป ไม่แมปช่วงอะแด็ปเตอร์ทั้งหมดถ้าคุณไม่จำเป็นจริง ๆ ต้องสามารถเข้าถึงทั้งหมดจากโหมดของระบบ

สิ่งสำคัญ: unmap หน่วยความจำทันทีที่คุณดำเนินการในบริบทด้านขวาของกระบวนการเสร็จงาน มิฉะนั้น ระบบจะทำงานออกจาก PTEs และมันจะ bug กาเครื่องหมายไว้ คุณสามารถเพิ่มหมายเลขเริ่มต้นของคำนวณ PTEs ขึ้นอยู่กับระบบที่รวมหน่วยความจำขึ้นกับค่าสูงสุด โดยการเพิ่มจำนวน(เท่ากันไปยังหมายเลขหน้าเพื่อที่ถูกเพิ่ม) ไปยังรีจิสทรีที่:
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
คุณสามารถยังติดตามในขณะนี้พร้อมใช้งาน "ฟรีระบบหน้าตารางรายการ" การใช้การตรวจสอบประสิทธิภาพการทำงาน

หมายเหตุ:: ไม่มีใช้การ์ดหน่วยความจำเพสำหรับการเปลี่ยนเพจ จะยังคงถูกแมปไว้ในพื้นที่ที่อยู่ของกระบวนการแม้ว่ากระบวนการไม่ได้ใช้งาน หรือสลับทั้งหมดออก

ต่อไปนี้มีสองวิธีธรรมดาที่สุดในการแมปหน่วยความจำของการ์ดเชื่อมต่อ วิธีการแรกแมปหน่วยความจำโดยตรงไปยังผู้ใช้ของกระบวนการช่องว่าง และวิธีการที่สองแมปเข้า สู่ระบบของขั้นตอนช่องว่าง และเลือกลง ในพื้นที่ จัดเก็บข้อมูลของผู้ใช้ Both of these methods require the physical memory to be contiguous. Because of the PTE limitation, you might not be able to map a large amount of memory in system-space. However, you might be able to map into the user- space if it is not fragmented or used up.

Section Object Method

There is a sample (MAPMEM) in the Windows NT 4.0 DDK (available through MSDN Professional membership) that shows how to perform this mapping. Here is an outline of the technique:

  1. Get the translated physical address of the adapter memory (HalTranslateBusAddress).
  2. Open a section handle (ZwOpenSection) to the physical memory device \Device\PhysicalMemory.
  3. Reference the object handle (ObReferenceObjectByHandle) to prevent it from being deleted.
  4. Map the memory (ZwMapViewOfSection).
The virtual address you get from the ZwMapViewOfSection is only valid in the context of the process it is mapped. If you want to access the memory in your driver's deferred procedure call (DPC) or interrupt service routine (ISR), which runs in an arbitrary process context, you should also map the memory in the system address space (use the next method). Unmap (ZwUnMapViewOfSection) the memory in the same process context that you mapped before it exits.

หมายเหตุ:: In general, it can be dangerous to use theZwMapViewOfSectionusing \Device\PhysicalMemory unless you already own the physical pages. A driver that maps pages that it does not own almost always causes memory corruption because the owner can change the page attributes, free the pages, and make other changes. Drives should map only the memory that they own. Also, it is strictly illegal to map a physical address concurrently with two different attributes (that is, cached vs noncached vs writecombined). Doing this causes processor TLB corruption and unpredictable results.

On WindowsXP, theZwMapViewOfSectionfunction returns STATUS_CONFLICTING_ADDRESSES error if drivers try to map the same physical address concurrently with conflicting attributes.

MmMapIoSpace Method

This method shows how to map memory in the process system address space and in the process user address space.
  1. Get the translated physical address of the adapter memory (HalTranslateBusAddress).
  2. Map the memory into nonpaged system address space as follows:
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. Allocate an Mdl:
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. Build the MDL to describe the memory pages:
          MmBuildMdlForNonPagedPool(Mdl);
  5. Map the memory into the process's user-space using MmMapLockedPages. Because there is an inconsistency in the return value of this function between pre-SP4 and post-SP4 releases of Windows NT, use the following statement to make this code compatible with all versions of Windows NT:
          UserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl,
             Mode))) + MmGetMdlByteOffset(Mdl));
    					
สำหรับข้อมูลเพิ่มเติม โปรดคลิกหมายเลขบทความต่อไปนี้ เพื่อดูบทความในฐานความรู้ของ Microsoft::
199311INFO: MmMapLockedPages Returns Actual Virtual Address in SP4
The advantage of this method is that you get SystemVirtualAddress, which can be used in any process context (such as DPCs and ISR), and an UserVirtualAddress that can be used by the user-mode application in whose context it is mapped.

If you map into system address space, you should unmap as follows:
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
If you map into user address space, you should unmap as follows only while running in the context of the process in which you mapped the memory:
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

ข้อมูลอ้างอิง

For more information, see the Windows NT 4.0 DDK documentation, or "Inside Windows NT" by Helen Custer (Microsoft Press 1993).

คุณสมบัติ

หมายเลขบทความ (Article ID): 189327 - รีวิวครั้งสุดท้าย: 7 มกราคม 2554 - Revision: 2.0
ใช้กับ
  • Microsoft Win32 Device Driver Kit for Windows NT 4.0
Keywords: 
kbhowto kbkmode kbmt KB189327 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:189327
การปฏิเสธความรับผิดชอบในเนื้อหาของ KB ที่จะไม่มีการปรับปรุงอีกต่อไป
บทความนี้กล่าวถึงผลิตภัณฑ์ที่ Microsoft ไม่มีการสนับสนุนอีกต่อไป เนื้อหาของบทความจึงมีการนำเสนอ "ตามลักษณะที่เป็น" และจะไม่มีการปรับปรุงข้อมูลอีก

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com