Sunday, January 25, 2015

Thuật ngữ trong quản lý bộ nhớ .

Mọi ứng dụng Windows sử dụng các phần của bộ nhớ. Trong đó gồm 3  thành phần chính là:

● Code s egment: mã lệnh hướng dẫn bộ xử lý thực thi . (EIP trỏ đến mã lệnh sẽ được thực thi  tiếp theo)

● Data s egment:  biến – varible, dynamic buffer.

● Stack segment: được sử dụng để truyền data (dữ liệu) – tham số (agrument) vào trong hàm, và được sử dụng như là một nơi lưu trữ biến. Stack bắt đầu ( đáy stack) tại vị trí kết thúc ( very end) của           trang bộ nhớ ảo ( virtual memory) và giảm dần. Lệnh PUSH thêm vào đỉnh stack, POP thì l ấy nó ra (4bytes ) và chuyển vào thanh ghi .

Nếu muốn truy cập s tack trực ti ếp, có thể s ử dụng thanh ghi ESP (Stack Pointer). Thanh ghi  này luôn trỏ vào đỉnh stack – địa chỉ  thấp nhất của stack.
Sau khi PUSH, ESP sẽ trỏ đến địa chỉ thấp hơn ( địa chỉ sẽ được giảm bằng size của dữ liệu được push vào stack – thường l à 4 bytes với địa chỉ thanh ghi ) Việc giảm địa chỉ thường được thực hiện trước khi đặt dữ liệu vào stack ( tùy thuộc vào quá trình thực hiện – nếu ESP chỉ vào vị trí tiếp theo trong
stack, việc giảm sẽ tiến hành sau khi  đặt dữ liệu vào stack)

Sau khi POP, ESP trỏ đến đị a chỉ cao hơn (địa chỉ được tăng, thường là 4bytes). Việc tăng địa chỉ  xảy ra khi  sau khi  gỡ bỏ thành phần ra khỏi  stack.
Khi một hàm/ chương trình con bắt đầu, một frame stack được tạo ra.
Frame này sẽ lưu các thông số của thủ tục trước đó và được sử dụng để chuyển tham số cho chương trình con. Vị trí hiện tại của con trỏ có thể truy cập qua ESP – stack pointer. Cơ sở bắt đầu của hàm hiện tại được chứa trong thanh ghi cơ sở – base pointer (EBP) hoặc frame pointer
Các thanh ghi  phổ biến (Intel , x86) là:

● EAX – accumulator: được s ử dụng cho việc tính toán, lưu trữ dữ
liệu ( trong function call chẳng hạn). Sử dụng trong các toán tử cơ
bản như add, subtract, compare.

● EBX: base: ( không có bất kỳ điều gì cần làm với thanh ghi cơ sở)
không có mục đích chính xác và được sử dụng để lưu dữ liệu.

● ECX:  counter:  được sử dụng để lặp – ECX giảm dần.

● EDX: data : thanh ghi mở rộng của EAX. Cho phép các tính toán
phức tạp hơn ( multiply – divde) bằng cách cho phép mở rộng lưu
trữ dữ liệu tạo điều ki ện cho tính toán ( như lưu thương số vào
EAX, phần dư vào EDX chẳng hạn)

● ESP:  stack poi nter
● EBP:  base pointer
● ESI:  source index:  lưu giữ vị  trí của input data.
● EDI: desti nation index : chỉ đến vị trí kết quả của toán tử được lưu trữ.
● EIP:  ins truction pointer

 Process  Memory

Khi ứng dụng bắt đầu trong môi trường Win32, tiến trình được tạo và bộ nhớ ảo (virtual memory) được gán. Với tiến trình 32 bit, địa chỉ bắt đầu từ  0×00000000 đến 0xFFFFFFFF
stack
Hình 1:
Phân đoạn text (text segment) trong program hình à read-only, và chỉ bao gồm cod của ứng dụng. Điều này hạn chế sửa đổi code ứng dụng.
Data segment được sử dụng để lưu trữ biến toàn cục (global ) và biến tĩnh (static).

Data segment được sử dụng để khởi  tạo global  variables , strings , constants
Data  segment có khả năng ghi và có size cố định. Heap segment được sử dụng cho các phần còn lại của program variables . Nó có thể phát triển lớn hơn hoặc nhỏ hơn thiết kế.Tất cả bộ nhớ trong heap được quản lý bởi thuật toán cấp phát và thuật toán thu hồi . Một vùng nhớ được dành riêng bởi thuật toán. Heap sẽ phát triển địa chỉ  lên cao hơn .

 Stack

Stack là một phần của tiến trình bộ nhớ, một cấu trúc dữ liệu hoạt động theo mô hình LIFO (Last in first out). Stack được cấp phát bởi OS cho mỗi thread khi thread được tạo. Khi thread kết thúc, stack sẽ được xóa. Size của stack được định nghĩa khi được tạo và không thể thay đổi. Kết hợp với LIFO không đòi hỏi cơ chế quản lý phức tạp nên stack khá nhanh tuy nhiên bị giới hạn trong kích cỡ
LIFO có nghĩa là dữ liệu được đặt vào gần nhất sẽ là dữ liệu đầu tiên được lấy ra.
Khi stack được tạo, con trỏ stack trỏ về đỉnh của stack (bằng địa chỉ cao nhất của stack). Ngay khi dữ liệu được push vào stack, con trỏ stack giảm (tới địa chỉ  thấp hơn).

 Vì vậy, stack phát triển xuống vùng địa chỉ  thấp hơn
Stack lưu local variables, function call và những thông tin khác mà không cần lưu trữ trong thời gian lớn. Mỗi lần gọi hàm (function call ), các tham số của hàm được push vào stack, và các giá trị được lưu vào các thanh ghi (EIP, EBP). Khi hàm kết thúc , giá trị đã lưu của EIP được lấy ra từ stack và đặt trở lại EIP, từ đó ứng dụng có thể trở lại  bình thường

Nguồn : http://anninhmang.net/2014/11/thuat-ngu-trong-quan-ly-bo-nho/

No comments:

Post a Comment