TÌM HIỂU CƠ CHẾ QUẢN LÝ HEAP (HEAP MANAGER) AN TOÀN HỆ ĐIỀU HÀNH. Heap là một trong 2 vùng nhớ rất quan trọng của máy tính. Vì vậy, nhóm em nhận đề tài tìm hiểu về cơ chế quản lý heap để hiểu thêm về heap và cơ chế quản lý heap.Nội dung của đề tài bao gồm:Chương 1: Tìm hiểu chung về heap.Chương 2: Tìm hiểu về cơ chế quản lý heap.Chương 3: Kết luận.Nhóm em xin cảm ơn cô đã giúp nhóm em trong quá trình tìm tài liệu để làm đề tài này.
Trang 1BAN CƠ YẾU CHÍNH PHỦ
HỌC VIỆN KỸ THUẬT MẬT MÃ
BÀI TẬP LỚN Môn AN TOÀN HỆ ĐIỀU HÀNH
ĐỀ TÀI: TÌM HIỂU CƠ CHẾ QUẢN LÝ HEAP
(HEAP MANAGER)
Ngành: Công nghệ thông tin
Chuyên ngành: An toàn thông tin
Họ và tên học viên: Đỗ Đức Thành
Nguyễn Văn Tân Nguyễn Văn Minh Nguyễn Quang Tuấn
Giáo viên hướng dẫn : Đồng Thị Thùy Linh
Trang 2L I M Đ U Ờ Ở Ầ
Heap là một trong 2 vùng nhớ rất quan trọng của máy tính Vì vậy, nhóm
em nhận đề tài tìm hiểu về cơ chế quản lý heap để hiểu thêm về heap và cơ chế quản lý heap
Nội dung của đề tài bao gồm:
Chương 1: Tìm hiểu chung về heap
Chương 2: Tìm hiểu về cơ chế quản lý heap
Chương 3: Kết luận
Nhóm em xin cảm ơn cô đã giúp nhóm em trong quá trình tìm tài liệu để làm đề tài này
Trang 3MỤC LỤC
Trang 4CHƯƠNG 1: TÌM HIỂU CHUNG VỀ HEAP
1.1 Heap là gì?
Heap là vùng nhớ được dùng để cấp phát và giải phóng các đối tượng một cách linh hoạt cho các chương trình sử dụng Heap hoạt động khi:
1 Số lượng và kích thước của các đối tượng cần thiết của chương trình không đượ biết trước thời hạn
2 Đối tượng quá lớn để khớp với trình cấp phát stack
Một heap sử dụng các bộ phận của bộ nhớ bên ngoài những gì được cấp phát cho các code và stack trong thời gian chạy Hình dưới đây cho thấy các lớp khác nhau của bộ cấp phát heap
Hình 1.1 : Các lớp khác nhau của bộ cấp phát heap
GlobalAlloc / GlobalFree: Gọi trực tiếp các heap mặc định cho mỗi tiến trình
LocalAlloc / LocalFree: Gọi trực tiếp các heap mặc định cho mỗi tiến trình
Trang 5COM's IMalloc allocator (or CoTaskMemAlloc / CoTaskMemFree): Chức năng sử dụng heap trên mỗi tiến trình mặ định Tự động sử dụng bộ cấp phát Component Object Model (COM) và các yêu cầu sử dụng heap cho mỗi tiến trình
C/C++ Run-time (CRT) allocator: Cung cấp malloc() và free() cũng như các toán tử new và delete
1.2 Phân loại heap
Mỗi tiến trình trong Windows có một heap được gọi là default heap Các tiến trình cũng có thể có nhiều dynamic heaps khác như mong muốn, chỉ đơn
giản bằng cách tạo và phá hủy chúng ngay lập tức Hệ thống sử dụng heap mặc định cho tất cả các hàm/chức năng quản lý bộ nhớ cục bộ và toàn cục, và thư viện run-time C sử dụng heap mặc định để hỗ trợ các hàm/chức năng
malloc Các hàm/chức năng bộ nhớ heap, cái mà biểu thị 1 heap riêng bởi
cách xử lý của nó, sử dụng dynamic heap
Các heaps mặc định và động về cơ bản là giống nhau, nhưng heap mặc định có đặc tính đặc biệt của việc nhận dạng được như là mặc định Đây là cách thư viện run-time C và hệ thống xác định heap để phân
bổ Hàm GetProcessHeap trả về một heap mặc định để xử lý tiến trình Vì các hàm như GlobalAlloc hoặc malloc được thực thi trong ngữ cảnh của luồng gọi chúng, chúng chỉ đơn giản gọi GetProcessHeap để lấy một đến heap mặc định, và sau đó quản lý bộ nhớ một cách phù hợp
1.3 Vai trò của heap
Hệ thống con Windows trên Windows NT cung cấp các chức năng quản
lý bộ nhớ cấp cao khiến cho các ứng dụng dễ dàng xây dựng các cấu trúc dữ liệu động, cung cấp khả năng tương thích với các phiên bản trước của Windows và tạo bộ đệm và bộ nhớ tạm thời cho các chức năng của hệ thống Các chức năng quản lý bộ nhớ này sẽ trả về các chốt xử lý và trỏ tới các khối bộ nhớ được phân bổ trong thời gian chạy và được quản lý bởi một thực thể được gọi là heap Chức năng chính của heap là quản lý hiệu suất bộ nhớ và không gian địa chỉ của một tiến trình cho một ứng dụng
Ở một mức độ cao hơn, việc xem xét heap hoàn toàn không ảnh hưởng tới việc ứng dụng định làm gì với bộ nhớ của nó và địa chỉ rỗng Tuy nhiên, heap đã cung cấp một bộ các chức năng mạnh mẽ cho phép các nhà phát triển
bỏ qua một số chi tiết tốt hơn về tài nguyên hệ thống (như sự khác biệt giữa
bộ nhớ dành riêng, miễn phí và cam kết) để họ có thể biến sự chú ý của họ thành một nhiệm vụ quan trọng hơn trong tay, của việc thực hiện các ứng dụng của họ
Trang 6Trong Windows NT, heaps cung cấp một hạt nhỏ hơn cho kích thước của
bộ nhớ nhỏ nhất được phân bổ bộ nhớ hơn các chức năng quản lý bộ nhớ
ảo Các ứng dụng thường cần phải phân bổ một số byte cụ thể để đáp ứng yêu cầu tham số hoặc hoạt động như một bộ đệm tạm thời Ví dụ, khi nạp một tài nguyên chuỗi với chức năng LoadString , một ứng dụng chuyển một con trỏ tới một bộ đệm nhận được tài nguyên chuỗi Kích thước của bộ đệm phải đủ
lớn để chứa chuỗi và một terminator null Nếu không có trình quản lý heap,
các ứng dụng sẽ buộc phải sử dụng các chức năng quản lý bộ nhớ ảo, phân bổ
ít nhất một trang bộ nhớ cùng một lúc
1.4 Hành vi chung của heap
Trong khi heap cung cấp hỗ trợ để quản lý các khối nhỏ hơn của bộ nhớ,
nó không có gì hơn một đoạn bộ nhớ thực hiện trong hệ thống bộ nhớ ảo Windows NT Do đó, các kỹ thuật mà heap sử dụng để quản lý bộ nhớ dựa trên các chức năng quản lý bộ nhớ ảo có sẵn cho heap Bằng chứng này được tìm thấy trong cách heaps tự thực hiện trong một tiến trình
Ứng dụng mẫu của ProcessWalker (PW) khám phá mỗi thành phần trong một tiến trình, bao gồm tất cả các heap của nó PW xác định các heap trong một quá trình và cho thấy dung lượng của bộ nhớ dành riêng và cam kết liên quan đến một heap cụ thể Giống như tất cả các vùng bộ nhớ khác trong một tiến trình, vùng nhỏ nhất của bộ nhớ cam kết trong một heap là một trang (4096 byte)
Điều này không có nghĩa là số lượng bộ nhớ nhỏ nhất có thể được phân
bổ trong heap là 4096 byte; thay vào đó, trình quản lý heap cam kết các trang
bộ nhớ nếu cần để đáp ứng các yêu cầu phân bổ cụ thể Ví dụ, nếu một ứng dụng phân bổ 100 byte thông qua một cuộc gọi tới hàm GlobalAlloc , trình quản lý heap phân bổ bộ nhớ 100 byte trong vùng cam kết của nó cho yêu cầu này Nếu không có đủ bộ nhớ cam kết có sẵn tại thời điểm yêu cầu, trình quản
lý heap sẽ thực hiện cam kết một trang khác để làm cho bộ nhớ có sẵn
Nếu một ứng dụng lặp đi lặp lại phân bổ các khối 100 byte bộ nhớ, heap
sẽ cam kết thêm một trang bộ nhớ cho mỗi 40 yêu cầu đầu tiên (40 * 100 byte
= 4000 byte) Khi yêu cầu 40 lần đầu tiên cho một đoạn 100 byte, heap manager nhận ra rằng không có đủ bộ nhớ cam kết để đáp ứng yêu cầu, do đó
nó cam kết một trang khác của bộ nhớ và sau đó hoàn thành việc phân bổ yêu cầu Bằng cách này, trình quản lý heap có trách nhiệm quản lý môi trường bộ nhớ ảo hoàn toàn minh bạch của ứng dụng
Trong thực tế, dù vậy, heap manager yêu cầu bộ nhớ bổ sung để quản lý
bộ nhớ trong heap Vì vậy, thay vì chỉ phân bổ 100 byte theo yêu cầu, nó
Trang 7cũng phân bổ một số không gian để quản lý từng phần cụ thể của bộ nhớ Kiểu bộ nhớ và kích thước của phân bổ xác định kích thước của bộ nhớ
bổ sung này
1.5 Các vấn đề chung về hiệu suất của heap
Đây là nh ng tr ng i ph bi n nh t mà b n g p ph i khi làm vi c ữ ở ạ ổ ế ấ ạ ặ ả ệ
v i heap:ớ
•Ch m l i nh là k t qu c a ho t đ ng phân b ậ ạ ư ế ả ủ ạ ộ ổ Nó ch đ n ỉ ơ
gi n m t m t th i gian dài đ phân b ả ấ ộ ờ ể ổ Lý do có kh năng nh t ả ấ
c a s ch m l i là các danh sách mi n phí không có các kh i, và doủ ự ậ ạ ễ ố
đó mã th i gian ch y allocator dành chu kỳ săn tìm cho m t kh i ờ ạ ộ ố
lượng l n h n mi n phí ho c phân b m t kh i tớ ơ ễ ặ ổ ộ ố ươ ừ ộ ấi t b c p phát back-end
•S ch m l i do ho t đ ng t do ự ậ ạ ạ ộ ự Các ho t đ ng t do tiêu th ạ ộ ự ụ nhi u chu kỳ h n, ch y u là n u k t h p l i đề ơ ủ ế ế ế ợ ạ ược kích
ho t.ạ Trong quá trình k t h p, m i ho t đ ng t do nên "tìm" ế ợ ỗ ạ ộ ự hàng xóm, kéo chúng ra đ xây d ng m t kh i l n h n, và l p l i ể ự ộ ố ớ ơ ắ ạ
kh i l n h n vào danh sách mi n phí.ố ớ ơ ễ Trong quá trình tìm ki m, ế
b nh có th b xúc đ ng theo th t ng u nhiên, gây ra l i b ộ ớ ể ị ộ ứ ự ẫ ỗ ộ
nh cache và hi u năng làm ch m l i.ớ ệ ậ ạ
•Suy thoái nh là k t qu c a cu c tranh lu n heap ư ế ả ủ ộ ậ S tranh ự
lu n x y ra khi hai ho c nhi u ch đ th truy c p vào d li u ậ ả ặ ề ủ ề ử ậ ữ ệ cùng m t lúc và ngộ ười ta ph i đ i cho ngả ợ ười kia hoàn thành trước khi có th ti n hành.ể ế C nh tranh luôn luôn gây ra r c r i;ạ ắ ố đó là v nấ
đ l n nh t mà m t trong nh ng g p ph i trên h th ng đa.ề ớ ấ ộ ữ ặ ả ệ ố M t ộ
ng d ng ho c DLL v i kh i l ng l n s d ng b nh sẽ ch m
l i khi ch y v i nhi u lu ng (và trên các h th ng đa x lý).ạ ạ ớ ề ồ ệ ố ử Vi c ệ
s d ng khóa đ n - gi i pháp chung - có nghĩa là t t c các ho t ử ụ ơ ả ấ ả ạ
đ ng s d ng heap độ ử ụ ược tu n t ầ ự Các serialization gây ra ch đ ủ ề
đ chuy n đ i b i c nh trong khi ch khóa.ể ể ổ ố ả ờ Hãy tưởng tượng s ự suy thoái do stop-and-go t i đèn pha nh p nháy màu đ nh p ạ ấ ỏ ấ nháy
S ganh đua thự ường d n đ n s chuy n đ i ng c nh c a ch ẫ ế ự ể ổ ữ ả ủ ủ
đ và quy trình.ề B i c nh chuy n m ch r t t n kém, nh ng th m ố ả ể ạ ấ ố ư ậ chí còn t n kém h n là m t d li u t b nh cache c a b x lý ố ơ ấ ữ ệ ừ ộ ớ ủ ộ ử
và xây d ng l i d li u đó khi s i đự ạ ữ ệ ợ ược đ a vào cu c s ng sau đó.ư ộ ố
•Suy thoái nh là k t qu c a tham nhũng đ ng ư ế ả ủ ố Tham nhũng x y ả
ra khi ng d ng không s d ng kh i heap đúng cách.ứ ụ ử ụ ố Các tình
Trang 8hu ng ph bi n bao g m vi c tăng g p đôi ho c s d ng m t ố ổ ế ồ ệ ấ ặ ử ụ ộ
kh i sau khi mi n phí, và các v n đ rõ ràng v ghi đè vố ễ ấ ề ề ượt quá ranh gi i kh i.ớ ố
•Ch m l i nh là m t k t qu c a allocs th ậ ạ ư ộ ế ả ủ ườ ng xuyên và
reallocs Đây là m t hi n tộ ệ ượng r t ph bi n khi b n s d ng ấ ổ ế ạ ử ụ ngôn ng k ch b n.ữ ị ả Các chu i đỗ ược phân b nhi u l n, phát tri n ổ ề ầ ể
v i s phân b l i, và gi i phóng.ớ ự ổ ạ ả Đ ng làm đi u này.ừ ề Hãy th phânử
b các chu i l n, n u có th , và s d ng b đ m.ổ ỗ ớ ế ể ử ụ ộ ệ M t gi i pháp ộ ả thay th là gi m thi u các ho t đ ng n i.ế ả ể ạ ộ ố
S ganh đua là v n đ gi i thi u s ch m l i trong phân b cũng ự ấ ề ớ ệ ự ậ ạ ổ
nh ho t đ ng t do.ư ạ ộ ự Lý tưởng nh t là chúng tôi mu n có m t đ ng mà ấ ố ộ ố không có tranh ch p và c p phát nhanh / mi n phí.ấ ấ ễ Than ôi, ch ng có ẳ
m t đ ng m c đích chung nh v y, m c dù nó có th sẽ x y ra trong ộ ố ụ ư ậ ặ ể ả
tương lai
Trong t t c các h th ng máy ch (nh IIS, MSProxy, DatabaseStacks, ấ ả ệ ố ủ ư các máy ch m ng, Exchange ), khóa heap là m t nút c chai l n.ủ ạ ộ ổ ớ S b ố ộ
vi x lý càng l n, thì s tranh cãi càng t i t ử ớ ự ồ ệ
Trang 9CH ƯƠ NG 2: C CH QU N LÝ HEAP Ơ Ế Ả
Hầu hết các ứng dụng phân bổ các khối nhỏ hơn mức phân bổ tối thiểu 64-KB có thể bằng cách sử dụng các chức năng chi tiết trang như VirtualAlloc và VirtualAllocExNuma Việc phân bổ một khu vực rộng lớn cho phân bổ tương đối nhỏ không phải là tối ưu từ cách sử dụng bộ nhớ và quan điểm hiệu năng Để giải quyết nhu cầu này, Windows cung cấp một thành phần được gọi là heap manager, quản lý các khoản phân bổ bên trong vùng bộ nhớ lớn hơn được dành riêng bằng chức năng phân bổ bộ nhớ theo từng trang Khả năng phân bổ trong trình quản lý heap tương đối nhỏ: 8 byte trên các hệ thống 32-bit, và 16 byte trên các hệ thống 64-bit Trình quản lý heap đã được thiết kế để tối ưu hóa việc sử dụng và hiệu suất bộ nhớ trong trường hợp các phân bổ nhỏ hơn
Trình quản lý heap tồn tại ở hai nơi: Ntdll.dll và Ntoskrnl.exe Các API hệ thống con (chẳng hạn như các API của Windows heap) gọi các hàm trong Ntdll, và các thành phần điều hành khác nhau và trình điều khiển thiết bị gọi hàm trong Ntoskrnl Các giao diện của nó (cố định đầu với Rtl) chỉ có sẵn để
sử dụng trong các thành phần Windows bên trong hoặc các trình điều khiển thiết bị hạt nhân Các giao diện Windows API đã được ghi lại để heap (tiền tố với Heap) là chuyển tiếp đến các chức năng có trong Ntdll.dll Ngoài ra, các API kế thừa (cố định đầu bằng Local hoặc Global) được cung cấp để hỗ trợ các ứng dụng Windows cũ, cũng được gọi chung là quản lý heap, sử dụng một số giao diện đặc biệt để hỗ trợ hành vi kế thừa Thời gian chạy C (CRT) cũng sử dụng trình quản lý heap khi sử dụng các chức năng như malloc, free,
và nhà điều hành mới của C++ Các chức năng heap phổ biến nhất của Windows là:
■ HeapCreate hoặc HeapDestroy: Tạo hoặc xóa, tương ứng, một đống Bản dự thảo ban đầu và kích thước cam kết có thể được xác định khi tạo
■ HeapAlloc: Phân bổ một khối heap
■ HeapFree: Giải phóng một khối được phân bổ trước đó với HeapAlloc
■ HeapReAlloc: Thay đổi kích thước của một phân bổ hiện có (phát triển hoặc co lại một khối hiện có)
■ HeapLock hoặc HeapUnlock: Các điều khiển loại trừ lẫn nhau vào các hoạt động của heap
■ HeapWalk: Khai báo các mục và các vùng trong một đống
Trang 102.1 Những loại Heap
Mỗi tiến trình có ít nhất một heap: tiến trình heap mặc định Heap mặc định được tạo ra khi khởi động quá trình và không bao giờ bị xóa trong suốt quá trình hoạt động của tiến trình Mặc định có kích thước 1 MB, nhưng nó
có thể được làm lớn hơn bằng cách xác định kích thước bắt đầu trong tệp hình ảnh bằng cách sử dụng cờ liên kết /HEAP Kích thước này chỉ là dự trữ ban đầu, tuy nhiên, nó sẽ tự động mở rộng khi cần thiết (Bạn cũng có thể chỉ định kích thước cam kết ban đầu trong tệp hình ảnh.)
Heap mặc định có thể được sử dụng một cách rõ ràng bởi một chương trình hoặc ngầm sử dụng bởi một số chức năng Windows nội bộ Một ứng dụng có thể truy vấn heap quá trình mặc định bằng cách thực hiện cuộc gọi đến hàm GetProcessHeap của Windows Các quy trình cũng có thể tạo thêm heap riêng với chức năng HeapCreate Khi quá trình không còn cần một heap riêng, nó có thể phục hồi không gian địa chỉ ảo bằng cách gọi HeapDestroy Một mảng với tất cả các heaps được duy trì trong mỗi quá trình, và một sợi
có thể truy vấn chúng với các chức năng Windows GetProcessHeaps
Một heap có thể quản lý phân bổ trong các vùng bộ nhớ lớn được lưu trữ
từ bộ quản lý bộ nhớ thông qua VirtualAlloc hoặc từ các đối tượng tệp ánh xạ trên bộ nhớ ánh xạ trong không gian địa chỉ của tiến trình Cách tiếp cận thứ hai hiếm khi được sử dụng trong thực tế, nhưng nó phù hợp với các kịch bản
mà nội dung của các khối cần phải được chia sẻ giữa hai tiến trình hoặc giữa một chế độ hạt nhân và một thành phần chế độ người dùng Trình điều khiển
hệ thống con GUI Win32 (Win32k.sys) sử dụng một heap để chia sẻ GDI và User các đối tượng với chế độ người dùng Nếu một đống được xây dựng trên đầu trang của vùng tệp được ánh xạ bộ nhớ, một số ràng buộc nhất định áp dụng đối với thành phần có thể gọi hàm heap Thứ nhất, các cấu trúc heap bên trong sử dụng con trỏ, và do đó không cho phép remapping đến các địa chỉ khác nhau trong các quá trình khác Thứ hai, quá trình đồng bộ hóa qua nhiều quá trình hoặc giữa một thành phần hạt nhân và quá trình người dùng không được hỗ trợ bởi các chức năng heap Ngoài ra, trong trường hợp chia
sẻ heap giữa chế độ người dùng và chế độ hạt nhân, lập bản đồ chế độ người dùng phải là chỉ đọc để ngăn chặn mã chế độ người dùng làm hỏng các cấu trúc nội bộ của heap, dẫn tới sự sụp đổ của hệ thống Trình điều khiển chế độ hạt nhân cũng chịu trách nhiệm về việc không đưa bất kỳ dữ liệu nhạy cảm nào vào một đống chia sẻ để tránh rò rỉ nó vào chế độ người dùng
2.2 Cấu trúc của Heap Manager
Như trong hình dưới, cấu trúc của trình quản lý Heap gồm 2 lớp: lớp tùy chỉnh front-end và lõi Heap Lõi heap xử lý các chức năng cơ bản và phổ biến nhất là usermode và kernel-mode triển khai Heap Chức năng lõi bao gồm