Địa chỉ một bộ đệm dữ liệu (addressing a data buffer )

7 184 0
Địa chỉ một bộ đệm dữ liệu (addressing a data buffer )

Đang tải... (xem toàn văn)

Thông tin tài liệu

Địa Bộ đệm liệu (Addressing a Data Buffer ) Địa Bộ đệm liệu (Addressing a Data Buffer ) Bởi: Khoa CNTT ĐHSP KT Hưng Yên Khi ứng dụng bắt đầu thao tác đọc hay ghi, cung cấp vùng đệm liệu thông qua cách cung cấp cho quản lý vào/ra chế độ người dung địa ảo chiều dài Như trình bày chương trước đây, nhân điều khiển truy xuất vào nhở mà sử dụng chế độ người dung với địa ảo vì, nhìn chung, bạn chắn chốt luồng Microsoft Windows XP cung cấp cho bạn cách để truy xuất đệm liệu chế độ người dung: Trong phương thức Buffered, trình quản lý vào /ra tạo đệm hệ thống với kích thước đệm liệu chế độ người dung Và bạn làm việc với đệm hệ thống Trình lý vao/ra giám sát cẩn thận (trông nom) việc copy liệu đệm chế độ người dùng đệm hệ thống Trong phương thức Direct, trình quản lý vào/ra khoá trang vật lý chứa đựng đệm chế độ người dùng tạo cấu trúc liệu phụ gọi danh sách kí hiệu nhớ (MDL) để diễn tả trang bị khoá Khi bạn làm việc với MDL Phương thức neither, trình quản lý vào đơn giản cho bạn vượt qua địa chế độ địa người dùng Bạn cần phải làm việc cẩn thận với địa chế độ người dùng/ Hình 7.2 minh hoạ hai phương thức đầu Phương thức cuối cùng, tất nhiên phương thức mà hệ thống không làm để giúp đỡ bạn đến gần (lấy được) liệu bạn 1/7 Địa Bộ đệm liệu (Addressing a Data Buffer ) Hình 7-2 Accessing user-mode data buffers Chỉ rõ phương thức vùng đệm (Specifying a Buffering Method): Bạn tiến hành định rõ phương thức vùng đệm để đọc hay ghi cách thiết lập bit cờ đối tượgn thiết bị bạn sau bạn tạo hàm AddDivice: NTSTATUS AddDevice( ) { PDEVICE_OBJECT fdo; IoCreateDevice( , &fdo); fdo->Flags │= DO_BUFFERED_IO; fdo->Flags │= DO_DIRECT_IO; fdo->Flags │= 0; // i.e., neither direct nor buffered } 2/7 Địa Bộ đệm liệu (Addressing a Data Buffer ) Bạn thay đổi ý định phương thức vùng đệm sau Các trình điều khiển lọc copy thiết lập cờ cách để biết bạn thực thay đổi định phương thức vùng đệm khác, Phương thức vùng đệm (The Buffered Method): PVOID uva; ULONG length; // Parameters.Read.Length = length;else stack->Parameters.Write.Length = length; if (reading) RtlCopyMemory(uva, sva, length); ExFreePool(sva); Phương pháp trực tiếp (The Direct Method): Nếu đối tượng thiết bị bạn rõ DO_DIRECT_IO trình điều khiển vào tạo MDL để mô tả trang bị khoá chứa vùng đệm liệu chế độ người dùng.Cấu trúc MDL khai báo sau: typedef struct _MDL { 3/7 Địa Bộ đệm liệu (Addressing a Data Buffer ) struct _MDL *Next; CSHORT Size; CSHORT MdlFlags; struct _EPROCESS *Process; PVOID MappedSystemVa; PVOID StartVa; ULONG ByteCount; ULONG ByteOffset; } MDL, *PMDL; Hình 7.3 minh hoạ cho quy luật MDL Thành phần StartVa cung cấp địa ảo vùng đệm - hợp lý trường hợp chế độ người dùng xử lý điều ByteOffset địa offset nơi bắt đầu vùng đệm suốt Frame, ByteCount kích thước vùng đệm tình theo đơn vị Byte Mảng Page, không khai báo thông thường phần cấu trúc MDL, MDL nhớ chứa đựng số lượng trang Frame vật lý đồ địa ảo chế độ người dùng 4/7 Địa Bộ đệm liệu (Addressing a Data Buffer ) Hình 7.3 Liệt kê cấu trúc kí hiệu (thể hiện) nhớ Theo cách này, chẳng truy cập trực tiếp tới thành phần cấu trúc MDL Chúng ta sử dụng Macro nâng cấp hàm bảng 7.2 Table 7-2 Macros and Support Functions for Accessing an MDL Macro or Function Description IoAllocateMdl Creates an MDL IoBuildPartialMdl Builds an MDL for a subset of an existing MDL IoFreeMdl Destroys an MDL MmBuildMdlForNonPagedPool Modifies an MDL to describe a region of kernel-mode nonpaged memory MmGetMdlByteCount Determines byte size of buffer 5/7 Địa Bộ đệm liệu (Addressing a Data Buffer ) MmGetMdlByteOffset Gets buffer offset within first page MmGetMdlPfnArray Locates array of physical page pointers MmGetMdlVirtualAddress Gets virtual address MmGetSystemAddressForMdl Creates a kernel-mode virtual address that maps to the same locations in memory MmGetSystemAddressForMdlSafe Same as MmGetSystemAddressForMdl but preferred in Windows 2000 and later systems MmInitializeMdl (Re)initializes an MDL to describe a given virtual buffer MmMapLockedPages Creates a kernel-mode virtual address that maps to the same locations in memory MmMapLockedPagesSpecifyCache Similar to MmMapLockedPages but preferred in Windows 2000 and later systems MmPrepareMdlForReuse Reinitializes an MDL MmProbeAndLockPages Locks pages after verifying address validity MmSizeOfMdl Determines how much memory would be needed to create an MDL to describe a given virtual buffer You don’t need to call this routine if you use IoAllocateMdl to create the MDL in the first place MmUnlockPages Unlocks the pages for this MDL MmUnmapLockedPages Undoes a previous MmMapLockedPages Bạn hình dung trình quản lý vào/ra thực đoạn code để thực phương thức đọc ghi cách trực tiếp KPROCESSOR_MODE mode; // ... MmProbeAndLockPages(mdl, mode, reading ? IoWriteAccess : IoReadAccess); 6/7 Đ a Bộ đệm liệu (Addressing a Data Buffer ) MmUnlockPages(mdl); IoFreeMdl(mdl); Đầu tiên,...Đ a Bộ đệm liệu (Addressing a Data Buffer ) Hình 7-2 Accessing user-mode data buffers Chỉ rõ phương thức vùng đệm (Specifying a Buffering Method): Bạn tiến hành định rõ phương thức vùng đệm. .. nonpaged memory MmGetMdlByteCount Determines byte size of buffer 5/7 Đ a Bộ đệm liệu (Addressing a Data Buffer ) MmGetMdlByteOffset Gets buffer offset within first page MmGetMdlPfnArray Locates array

Ngày đăng: 31/12/2015, 22:06

Mục lục

  • Địa chỉ một Bộ đệm dữ liệu (Addressing a Data Buffer )

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan