1. Trang chủ
  2. » Công Nghệ Thông Tin

Quản lý bộ nhớ (memory management )

16 322 1

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 314,82 KB

Nội dung

Quản lý nhớ (Memory Management ) Quản lý nhớ (Memory Management ) Bởi: Khoa CNTT ĐHSP KT Hưng Yên Ở chương này, bàn chủ đề quản lý nhớ Windows XP chia cắt vùng địa thực tế chia cắt bên vài cách Một cách chia - bảo mật toàn vẹn địa người dùng địa nhân Một cách chia khác, mà sử dụng hầu hết không tốt trang nhớ không phaitrang nhớ Hầu hết địa người sử dụng vài địa kiểu nhân tham chiếu dến ô nhớ mà Quản lý nhớ đổi tới từ đĩa toàn thời gian, vài địa kiểu nhân luôn liên kết tới ô nhớ nhớ vật lý Từ Windows XP cho phép nhưững phần trình điều khiển tớ ô nhớ, giải thích cách làm điều khiển ô nhớ trình điều khiển bạn thời điểm bạn xây dựng trình điều khiển chạy Windows XP cung cấp số phưoơg thức để quản lý nhớ Tôi mô tả hai hàm dịch vụ —ExAllocatePoolWithTag ExFreePool— mà bạn sử dụng để phân chia giải phóng cách ngẫu nhiên Tôi giải thích nguyên thuỷ mà bạn sử dụng để tổ chức nhớ danh sách liên kết cấu trúc Cuối giải thích khái niệm danh sách mà cho phép bạn phân chia có hiệu User-Mode and Kernel-Mode Address Spaces Windows XP Microsoft Windows 98/Me chạy nhữngmáy tính mà hỗ trợ vùng địa thực tế nơi mà địa ảo vẽ tới nhớ vật lý ô nhớ bên 1/16 Quản lý nhớ (Memory Management ) file tráo đổi dĩa cứng Thủ tục đơn giản hoá vấn đề, bạn nghĩ địa ảo chia cắt thành hai phần: phaanf kiêu nhân phần kiểu người dùng Nhìn hình 3-6 Hình 3-6 Thành viên-hạt nhân chế độ-chế độ phần không gian địa Mỗi người sử dụng chế độ xử lý có địa bối cảnh riêng mình, mà đồ người sử dụng chế độ ảo-địa cho sưu tập vật chất trang khung Nói cách khác, ý nghĩa địa riêng ảo thay đổi từ chút thời gian để Windows XP Scheduler tắc từ sợi trình vào sợi khác trình Một phần công việc khâu chuyển đổi để thay đổi trang bảng sử dụng xử lý để họ giới thiệu đến luồng trình bối cảnh It's thường không WDM đó, driver thực bối cảnh sợi xướng I / O yêu cầu xử lý Chúng ta nói chạy bối cảnh arbitrary sợi, chắn cho trình mà người sử dụng chế độ địa bối cảnh thuộc Trong bối cảnh arbitrary sợi, đơn giản không sử dụng địa mà ảo thuộc với người sử dụng chế độ ý tưởng với vật lý nhớ điểm Trong số xem không chắn, nhìn chung phải tuân theo quy định sau chương trình driver: Không (tốt, khi) người trực tiếp tham chiếu-chế độ nhớ Nói cách khác, địa mà người sử dụng chế độ-cung cấp ứng dụng chữa trị cho địa trỏ trực tiếp dereference Tôi thảo luận chương sau vài kỹ thuật để truy cập liệu đệm mà bắt nguồn chế độ người dùng Tất cần phải biết bây giờ, nhiên, (gần như) luôn có cách sử dụng hạt nhân-chế độ địa ảo muốn truy cập vào nhớ máy tính Bao lớn Có trang? Trong hệ thống nhớ ảo, hệ điều hành tổ chức vật lý nhớ vùng trao đổi vào tập tin như-kích thước trang khung Trong WDM trình điều khiển, bạn sử dụng để tỏ cố PAGE_SIZE cho bạn biết làm trang lớn Trong số máy tính Windows XP, trang 4096 bytes dài; người khác, it's 8192 bytes dài A liên quan đến việc đặt tên PAGE_SHIFT kích thước trang sức mạnh Đó là: PAGE_SIZE == linkfield); SINGLE_LIST_ENTRY psLink = PopEntryList(&SingleHead); if (psLink) { 13/16 Quản lý nhớ (Memory Management ) psElement = CONTAINING_RECORD(psLink, ONEWAY, linkfield); ExFreePool(psElement); } Thay việc kéo theo hàm dịch vụ vận hành để khởi tạo phần đầu danh sách liên kết đơn, thiết lập trường hướng tới NULL Chú ý thiếu vắng hàm dịch vụ cho việc thử nghiệm liệu danh sách trống rỗng; kiểm tra phần tử PushEntryList đặt phần tử đầu danh sách, mà phần danh sách trực tiếp tiếp cận PushEntryList nhận yếu tố đầu danh sách, phần danh sách truy cập trực tiếp Thông báo mà bạn định địa nhúng thay lĩnh vực liên kết riêng bạn ONEWAY cấu PopEntryList loại bỏ mục danh sách mang lại cho bạn trỏ lại để lĩnh vực liên kết bên Ngược lại với danh sách liên kết-gấp đôi, giá trị NULL cho thấy danh sách sản phẩm Trong thực tế, nước để IsListEmpty để sử dụng với danh sách liên kết-singly Lookaside Lists Thậm chí tốt sử dụng thuật toán, người quản lý heap ngẫu nhiên mà kinh doanh với kích cỡ khối nhớ yêu cầu số thời gian để xử lý coalesce liền kề miễn phí từ khối thời gian Hình 3-10 minh hoạ nào, trở khối B vào heap thời gian khối A C miễn phí, heap quản lý kết hợp khối A, B, C để tạo thành khối lớn Các khối lớn, sau có sẵn để đáp ứng số yêu cầu sau cho khối lớn ba thành phần gốc Hình 3-10 Coalescing adjacent free blocks in a heap Nếu bạn biết bạn luôn có làm việc với kích thước cố định-khối nhớ, bạn thủ công cách hiệu nhiều chương trình để quản lý heap Bạn có thể, ví dụ, preallocate khối lớn nhớ bạn chia thành phần cho kích 14/16 Quản lý nhớ (Memory Management ) thước cố định Sau đó, bạn devise số chương trình cho biết khối miễn phí sử dụng trong, đề nghị Hình 3-11 Để lại khối heap bao gồm việc đánh dấu miễn phí-bạn không cần phải coalesce liền kề với khối bạn không cần phải ngẫu nhiên kích thước đáp ứng yêu cầu Hình 3-11 A-heap chứa cố định kích cỡ khối Hình 3-12 minh hoạ khái niệm lookaside danh sách Hãy tưởng tượng bạn có ly mà bạn (nào đó-pháp luật Vật lý không xác làm cho việc dễ dàng!) Số dư thẳng, hồ pool Bottom of Form Hệ thống định kỳ điều chỉnh sâu tất lookaside danh sách dựa thực tế sử dụng Các chi tiết thuật toán không thật quan trọng, thay đổi trường hợp Về (trong phát hành tại, anyway), hệ thống giảm chiều sâu lookaside danh sách mà truy cập thời gian gần hay không truy cập pool buộc phần trăm thời gian Sâu không 4, nhiên, chiều sâu ban đầu danh sách Bảng 3-8 liệt kê dịch vụ tám hàm mà bạn sử dụng bạn làm việc với lookaside danh sách Có thật hai bốn hàm, đặt cho danh sách lookaside paged quản lý nhớ (các ExXxxPagedLookasideList đặt) cho danh sách lookaside nonpaged quản lý nhớ (ExXxxNPagedLookasideList thiết lập) Điều bạn phải làm đặt nonpaged nhớ cho PAGED_LOOKASIDE_LIST đối tượng NPAGED_LOOKASIDE_LIST 15/16 Quản lý nhớ (Memory Management ) Ngay paged nhiều đối tượng cần phải nonpaged nhớ hệ thống truy cập vào danh sách đối tượng cao IRQL Blocksize tham số kích cỡ khối nhớ bạn phân bổ từ danh sách, từ khóa 32-bit, giá trị từ khóa bạn muốn đặt phía trước khối Hai đối số không placeholders cho giá trị mà bạn cung cấp phiên trước Windows NT, mà xác định hệ thống riêng mình; giá trị có cờ để kiểm soát loại phân bổ độ sâu lookaside danh sách Để bố trí nhớ khối từ danh sách, gọi điện cho phù hợp AllocateFrom hàm: PVOID p = ExAllocateFromPagedLookasideList(pagedlist); PVOID q = ExAllocateFromNPagedLookasideList(nonpagedlist); To put a block back onto the list, call the appropriate FreeTo function: ExFreeToPagedLookasideList(pagedlist, p); ExFreeToNPagedLookasideList(nonpagedlist, q); Finally, to destroy a list, call the appropriate Delete function: ExDeletePagedLookasidelist(pagedlist); ExDeleteNPagedLookasideList(nonpagedlist); Nếu bạn thực lỗi này, thời gian tới hệ thống chạy qua, loạt danh sách lookaside để điều chỉnh danh sách họ sâu, đặt chân xuống chỗ, nơi đối tượng danh sách bạn sử dụng để được, có lẽ với kết xấu 16/16 [...]... Có thật sự hai bộ bốn hàm, một đặt cho một danh sách lookaside rằng paged quản lý bộ nhớ (các ExXxxPagedLookasideList đặt) và một cho một danh sách lookaside rằng nonpaged quản lý bộ nhớ (ExXxxNPagedLookasideList các thiết lập) Điều đầu tiên bạn phải làm là đặt nonpaged bộ nhớ cho một PAGED_LOOKASIDE_LIST hoặc một đối tượng NPAGED_LOOKASIDE_LIST 15/16 Quản lý bộ nhớ (Memory Management ) Ngay cả các... blocks in a heap Nếu bạn biết bạn luôn luôn có được làm việc với kích thước cố định-khối bộ nhớ, bạn có thể thủ công một cách hiệu quả hơn nhiều chương trình để quản lý một heap Bạn có thể, ví dụ, preallocate một khối lớn bộ nhớ rằng bạn chia thành từng phần cho các kích 14/16 Quản lý bộ nhớ (Memory Management ) thước cố định Sau đó, bạn có thể devise một số chương trình cho biết khối đó là miễn phí... ExAllocatePool(PagedPool, sizeof(ONEWAY )) ; PushEntryList(&SingleHead, &psElement->linkfield); SINGLE_LIST_ENTRY psLink = PopEntryList(&SingleHead); if (psLink) { 13/16 Quản lý bộ nhớ (Memory Management ) psElement = CONTAINING_RECORD(psLink, ONEWAY, linkfield); ExFreePool(psElement); } 1 Thay vì việc kéo theo một hàm dịch vụ vận hành để khởi tạo phần đầu danh sách liên kết đơn, chỉ thiết lập trường kế tiếp hướng... một lỗi, làm bất cứ yêu cầu và sự trở lại một mã trạng thái Khoảng thời gian bộ nhớ (Releasing a Memory Block) Để giải phóng bộ nhớ được bạn cấp phát trước đó với ExAllocatePoolWithTag, bạn gọi ExFreePool ExFreePool((PVOID) p); Bạn cần giữ những rãnh ghi chưa được xác định của bộ nhớ mà bạn có , được cấp phát trước đó từ bộ nhớ chung để giải phóng nó khi nó không còn cần Không ai khác sẽ làm điều đó... của hệ điều hành 12/16 Quản lý bộ nhớ (Memory Management ) Pseudofunction sau đây minh họa thao tác như thế nào danh sách đơn liên kết typedef struct _ONEWAY { SINGLE_LIST_ENTRY linkfield; } ONEWAY, *PONEWAY; SINGLE_LIST_ENTRY SingleHead; SingleHead.Next = NULL; PONEWAY psElement = (PONEWAY) ExAllocatePool(PagedPool, sizeof(ONEWAY )) ; PushEntryList(&SingleHead, &psElement->linkfield); SINGLE_LIST_ENTRY... một cái nhìn về quyền sở hữu bộ nhớ Chẳng hạn, trong hàm AddDevice tôi cho thấy nó trong chương trước , ở đó nó được gọi tới IoRegisterDeviceInterface Hàm đó có một tác dụng phụ: nó cấp phát một khối bộ nhớ chứa chuỗi có tên là giao diện(interface) Bạn sẽ phải giải phóng bộ nhớ đó sau này Thiết bị kiểm chứng sẽ kiểm tra thời gian DriverUnload đảm bảo đã giải phóng tất cả bộ nhớ nó đã cấp phát Ngoài ra,.. .Quản lý bộ nhớ (Memory Management ) Nhưng từ khi có lỗi sẽ không phát sinh trong thực tế đời sống, không có điểm trong xây dựng đưa vào mã của bạn để đăng nhập lỗi trình điều khiển, tín hiệu WMI các sự kiện, in gỡ lỗi tin nhắn, thực hiện các thuật toán thay thế, và như vậy trên Thật vậy, thêm mã cần thiết để làm tất cả mà có thể là lý do hệ thống không có thêm 32 byte... phải làm nó hay sử dụng nó như thế nào (Gợi ý: bạn cần làm một số thứ undocumented khác để sử dụng nó một cách thành công .) Những đối sốlà tương tự như chúng tôi đang đựơc học trừ những cái bạn cung cấp thêm ưu tiên chỉ báo Nhìn Bảng 3-5 11/16 Quản lý bộ nhớ (Memory Management ) DDK cho biết rằng đa số những thiết bị điều khiển cần phải chỉ rõ NormalPoolPriority khi gọi đến hàm này HighPoolPriorityshould... chí tốt nhất có thể sử dụng các thuật toán, một người quản lý heap ngẫu nhiên mà chúng tôi kinh doanh với kích cỡ khối bộ nhớ sẽ yêu cầu một số hiếm thời gian để xử lý coalesce liền kề miễn phí từ các khối thời gian Hình 3-10 minh hoạ như thế nào, cái gì khi trở về khối B vào heap tại một thời gian khi khối A và C đã và đang miễn phí, các heap quản lý có thể kết hợp khối A, B, và C để tạo thành một khối... lookaside danh sách Để bố trí một bộ nhớ khối từ danh sách, gọi điện cho phù hợp AllocateFrom hàm: PVOID p = ExAllocateFromPagedLookasideList(pagedlist); PVOID q = ExAllocateFromNPagedLookasideList(nonpagedlist); To put a block back onto the list, call the appropriate FreeTo function: ExFreeToPagedLookasideList(pagedlist, p); ExFreeToNPagedLookasideList(nonpagedlist, q); Finally, to destroy a list, call ... data_seg("PAGE ") 7/16 Quản lý nhớ (Memory Management ) ULONG ulSomething; #pragma data_seg () hPageDataSection = MmLockPagableDataSection((PVOID) &ulSomething); MmUnlockPagableImageSection(hPageDataSection);... (PONEWAY) ExAllocatePool(PagedPool, sizeof(ONEWAY )) ; PushEntryList(&SingleHead, &psElement->linkfield); SINGLE_LIST_ENTRY psLink = PopEntryList(&SingleHead); if (psLink) { 13/16 Quản lý nhớ (Memory Management. .. định-khối nhớ, bạn thủ công cách hiệu nhiều chương trình để quản lý heap Bạn có thể, ví dụ, preallocate khối lớn nhớ bạn chia thành phần cho kích 14/16 Quản lý nhớ (Memory Management ) thước cố

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

TỪ KHÓA LIÊN QUAN

w