Bài giảng Quản lý bộ nhớ và tập tin - pdf 17

Download miễn phí Bài giảng Quản lý bộ nhớ và tập tin



Giải phóng vùng nhớ ảo
Đểgiải phóng vùng nhớ ảo, ta dùng hàm VirtualFree. Hàm giải phóng hay khửcấp
phát (hay cảhai) các trang trong không gian địa chỉ ảo của tiến trình đang gọi.
BOOL VirtualFree(LPVOIDlpAddress, DWORDdwSize, DWORDdwType);
Trường lpAddresslà con trỏtrỏ đến vùng các trang cần giải phóng. Nếu dwTypechứa
cờ MEM_RELEASE, đây phải là con trỏtrảvềtừhàm VirtualAlloc.
Trường dwSizexác định sốbyte kích vùng nhớcần giải phóng. Nếu dwTypechứa cờ
MEM_RELEASE, giá trịnày cần thiết lập bằng 0. Trong các trường hợp khác, vùng ảnh
hưởng sẽlà các trang có ít nhất một byte nằm trong đoạn lpAddress đến lpAddress +
dwSize. Nghĩa là, nếu có 2 byte nằm ởbiên hai trang khác nhau, thì cảhai trang đều
được giải phóng.
Trường dwTypexác định cách giải phóng, sửdụng giá trị MEM_DECOMMIT, hay
MEM_RELEASE. Với giá trị đầu, hàm giải phóng các trang chỉ định (đã được xác nhận
cấp phát). Nếu các trang chưa được cấp phát, ta vẫn có thểkhửcấp phát (decommit) mà
không gây ra lỗi. Với giá trịsau, hàm giải phóng vùng nhớ đểdành. Trong trường hợp
này, dwSizephải bằng 0, nếu không hàm thực hiện thất bại.



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:


Cấp phát vùng nhớ ảo
Các hàm quản lý bộ nhớ ảo thực hiện các thao tác trên các trang vùng nhớ. Để cấp phát
các trang vùng nhớ ảo, ta dùng hàm VirtualAlloc, với các chức năng sau đây :
• Để dành một hay nhiều trang trống.
• Cấp phát xác nhận một hay nhiều trang để dành.
• Để dành và cấp phát xác nhận một hay nhiều trang trống.
Chúng ta có thể chỉ định địa chỉ đầu của các trang để dành hay cấp phát, hay để cho hệ
thống tự xác nhận địa chỉ. Hàm sẽ làm tròn địa chỉ chỉ định với biên trang thích hợp.
Vùng nhớ được cấp phát được khởi gán bằng 0, nếu ta không thiết lập cờ MEM_RESET.
LPVOID VirtualAlloc(LPVOID lpAddress, DWORD dwSize, DWORD
flAllocationType, DWORD flProtect);
Trường lpAddress xác định địa chỉ bắt đầu của vùng cấp phát. Nếu vùng nhớ đang để
dành, địa chỉ chỉ định được làm tròn đến biên 64 KB kế tiếp. Nếu vùng nhớ đã để dành và
đang được xác nhận, địa chỉ sẽ được làm tròn đến biên trang kế. Để xác định kích thước
của trang, ta sử dụng hàm GetSystemInfo. Nếu biến này bằng NULL, hệ thống tự xác
nhận địa chỉ vùng nhớ cấp phát.
Trường dwSize xác định số byte kích thước vùng nhớ. Nếu lpAddress bằng NULL, giá
trị này sẽ được làm tròn đến biên trang kế. Nếu không, các trang cấp phát là các trang
chứa một hay nhiều byte nằm trong khoảng từ lpAddress đến lpAddress+dwSize.
Nghĩa là, nếu hai byte nằm ở hai trang thì cả hai trang đó đều nằm trong vùng cấp phát.
Trường flAllocationType xác định dạng cấp phát, có thể kết hợp từ các cờ :
Cờ Ý nghĩa
MEM_COMMIT Cấp phát vùng lưu trữ vật lý trong bộ nhớ hay đĩa.
Các trang đã được cấp phát xác nhận hay khử cấp
phát đều có thể được cấp phát lại mà không gây ra
lỗi.
MEM_RESERVE Để dành vùng không gian địa chỉ ảo của tiến trình.
Không thể cấp phát vùng để dành bằng các hàm cấp
phát bộ nhớ khác (malloc, GlobalAlloc, …) cho
đến khi chúng được giải phóng. Chúng chỉ được cấp
phát bằng hàm VirtualAlloc.
MEM_RESET Áp dụng cho Windows NT. Khi thiết lập với giá trị
này, dữ liệu được xem như không quan trọng, có thể
bị viết chồng lên. Ứng dụng không hoán chuyển dữ
liệu từ bộ nhớ chính vào (ra) tập tin trang. Mặt khác,
khi thiết lập giá trị này, hệ thống sẽ bỏ qua các giá trị
của flProtect.
MEM_TOPDOWN Cấp phát vùng nhớ tại địa chỉ cao nhất có thể.
Các cờ xác định dạng cấp phát flAllocationType.
Trường flProtect xác định cách thức bảo vệ truy cập vùng nhớ. Nếu các trang đã được
cấp phát xác nhận, một trong các cờ sau có thể được thiết lập, kết hợp với các cờ
PAGE_GUARD và PAGE_NOCACHE :
Cờ Ý nghĩa
PAGE_READONLY Chỉ cho phép đọc các trang cấp phát (không được ghi).
PAGE_READWRITE Cho phép truy cập đọc và ghi các trang vùng nhớ.
PAGE_EXECUTE Cho phép thực thi các tiến trình, nhưng không đọc và
ghi.
PAGE_EXECUTE_READ Cho phép thực thi và đọc, nhưng không được ghi.
PAGE_EXECUTE_READWRITE Cho phép thực thi, đọc và ghi.
PAGE_GUARD Các trang trong vùng trở thành các trang "lính canh".
Nếu ghi hay đọc các trang này, hệ thống sẽ phát sinh
lỗi ngoại lệ STATUS_PAGE_GUARD và tắt tình
trạng đó của trang “lính canh”. Xem thêm ở ví dụ trong
phần 7.2.3.4.
PAGE_NOACCESS Cấm truy cập (đọc, ghi, thực thi) các trang. Nếu truy
cập, ta có lỗi bảo vệ chung.
PAGE_NOCACHE Không dùng bộ nhớ đệm. Thích hợp với các chế độ bảo
vệ trang hơn là NO_ACCESS.
Các cờ xác định dạng bảo vệ truy cập flProtect.
Nếu thành công, hàm trả về địa chỉ cơ sở của các trang vùng cấp phát. Ngược lại giá trị
trả về là NULL.
Giải phóng vùng nhớ ảo
Để giải phóng vùng nhớ ảo, ta dùng hàm VirtualFree. Hàm giải phóng hay khử cấp
phát (hay cả hai) các trang trong không gian địa chỉ ảo của tiến trình đang gọi.
BOOL VirtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwType);
Trường lpAddress là con trỏ trỏ đến vùng các trang cần giải phóng. Nếu dwType chứa
cờ MEM_RELEASE, đây phải là con trỏ trả về từ hàm VirtualAlloc.
Trường dwSize xác định số byte kích vùng nhớ cần giải phóng. Nếu dwType chứa cờ
MEM_RELEASE, giá trị này cần thiết lập bằng 0. Trong các trường hợp khác, vùng ảnh
hưởng sẽ là các trang có ít nhất một byte nằm trong đoạn lpAddress đến lpAddress +
dwSize. Nghĩa là, nếu có 2 byte nằm ở biên hai trang khác nhau, thì cả hai trang đều
được giải phóng.
Trường dwType xác định cách giải phóng, sử dụng giá trị MEM_DECOMMIT, hay
MEM_RELEASE. Với giá trị đầu, hàm giải phóng các trang chỉ định (đã được xác nhận
cấp phát). Nếu các trang chưa được cấp phát, ta vẫn có thể khử cấp phát (decommit) mà
không gây ra lỗi. Với giá trị sau, hàm giải phóng vùng nhớ để dành. Trong trường hợp
này, dwSize phải bằng 0, nếu không hàm thực hiện thất bại.
Nếu thành công, hàm trả về giá trị khác 0. Ngược lại, giá trị trả về là 0.
Lưu ý để giải phóng các trang, các trang phải cùng tình trạng (cấp phát hay để dành), và
tất cả các trang để dành bằng hàm cấp phát VirtualAlloc cần giải phóng đồng thời. Nếu
một số trang để dành ban đầu đã được xác nhận cấp phát, chúng cần được khử cấp phát
trước khi gọi hàm VirtualFree để giải phóng.
Thao tác trên các trang vùng nhớ
Để xác định kích thước các trang trên máy tính, ta sử dụng hàm GetSystemInfo.
VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);
Trường lpSystemInfo trỏ đến cấu trúc SYSTEM_INFO chứa các thông tin hệ thống.
typedef struct _SYSTEM_INFO // sinf
{
union
{
DWORD dwOemId;
struct
{
WORD wProcessorArchitecture;
WORD wReserved;
}
};
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
}SYSTEM_INFO;
Để xác định thông tin về bộ nhớ, ta chỉ khảo sát một số trường liên quan. Trường
dwPageSize các định kích thước các trang theo dạng đã được cấp phát bằng hàm
VirtualAlloc. Trường lpMinimumApplicationAddress trỏ đến địa chỉ vùng nhớ thấp
nhất, và trường lpMaximumApplicationAddress trỏ đến địa chỉ vùng nhớ cao nhất có
thể truy cập bởi các ứng dụng và thư viện liên kết động. Trường
dwAllocationGranularity xác định độ phân nhỏ mà vùng nhớ ảo cấp phát. Cụ thể, hàm
VirtualAlloc yêu cầu cấp phát một byte sẽ để dành một vùng không gian bộ nhớ có kích
thước là dwAllocationGranularity byte.
Tiến trình có thể khoá một hay nhiều trang đã được cấp phát (xác nhận) vào vùng nhớ vật
lý (RAM), ngăn chặn việc hệ thống hoán chuyển các trang vào (ra) tập tin trang bằng
cách dùng hàm VirtualLock.
BOOL VirtualLock(LPVOID lpAddress, DWORD dwSize);
Để mở khoá các trang đã bị khoá, ta dùng hàm VirtualUnlock, cho phép các trang có
thể được hoán chuyển vào (ra) tập tin trang trên đĩa.
BOOL VirtualUnlock(LPVOID lpAddress, DWORD dwSize);
Trường lpAddress trỏ đến địa chỉ cơ sở của vùng các trang cần được khoá. Trường
dwSize xác định số byte vùng nhớ cần khoá, gồm các trang chứa tất cả các địa chỉ từ
lpAddress đến lpAddress + dwSize.
Nếu thành công, giá trị trả về khác 0. Ngược lại, các hàm trả về 0.
Số trang mặc định được cấp phát tối đa là 30 trang. Tuy nhiên, chúng ta có cũ...
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status