Cơ chế hoạt động và quản lý bộ nhớ trong Windows 32bits:

Một phần của tài liệu Nghiên cứu các phương pháp nhận dạng từ dưới Cursor mouse trên destop windows (Trang 42 - 46)

Windows 32bits sử dụng mô hình bộ nhớ phẳng 4GB đã loại trừ được nhiều vấn đề nảy sinh trong hệ điều hành DOS bởi việc thay thế kiến trúc bộ nhớ phân trang thay cho kiến trúc bộ nhớ phân đoạn vốn chậm chạp.

Mỗi ứng dụng DOS chạy trong máy ảo VM (Virtual Machine) của nó. Điều này tạo cho mỗi quá trình DOS một mức bảo vệ khỏi các quá trình khác và gia tăng lượng vùng nhớ thấp khả dụng.

Việc sử dụng bộ nhớ được điều khiển bởi các quá trình VxD 32 bit làm gia tăng tốc độ xử lý. Cả hai trình VCACHE và VMM là các quá trình 32 bit làm giảm thiểu tổng phí và gia tăng tốc độ cho việc đánh địa chỉ và việc hoán đổi thông tin giữa bộ nhớ và đĩa.

Windows 32bits chỉ có thể hoạt động trên hệ thống 386 trở lên do yêu cầu phải có phần cứng hỗ trợ sơ đồ địa chỉ hóa 32 bit và cơ chế phân trang bộ nhớ.

Kiến trúc bộ nhớ:

Kiến trúc bộ nhớ của Windows 32bits được định nghĩa là hệ thống bộ nhớ ảo đòi hỏi phân trang dựa trên nền mô hình bộ nhớ phẳng 4GB bằng cách sử dụng sơ đồ địa chỉ hóa 32 bit.

Hệ thống yêu cầu phân trang (demand-paged) điều khiển việc truy xuất vào bộ nhớ chính và việc thực thi quá trình , dựa trên các phần mềm yêu cầu cho hệ điều hành mà phần mềm đang xử lý đặt ra. Hệ điều hành cũng giám sát các tài nguyên hệ thống, xác định quá trình nào đang yêu cầu bộ nhớ và cung cấp một vài cơ chế để đáp ứng các yêu cầu đó.

Bộ nhớ ảo là không gian bao gồm cả bộ nhớ vật lý liên kết với hệ thống lưu trữ trên đĩa cứng nhằm làm cho việc thi hành của các quá trình có đủ vùng nhớ để thực thi các chỉ thị phầm mềm.

Mô hình bộ nhớ phẳng tuyến tính cho phép đánh địa chỉ bắt đầu tại một vài vị trí nào đó, 0 hay 0000h và tiếp tục cho đến giới hạn lớn nhất, 4G hay FFFF:FFFFh bằng cách dùng sơ đồ đánh địa chỉ tăng dần. Sơ đồ địa chỉ hóa này chỉ được hỗ trợ bởi phần cứng của hệ thống 386 hoặc cao hơn.

Mô hình lập trình 386:

Các thanh ghi và đường dẫn dữ liệu 32 bit của hệ thống 386 (và cao hơn) cho phép 4GB không gian địa chỉ vật lý. Không gian bộ nhớ ảo của chế độ bảo vệ 30386 gồm có 16383 tuyến tính cho mỗi bộ nhớ 4GB. Việc biểu hiện bộ nhớ tuyến tính 4GB được gọi là mô hình bộ nhớ phẳng (flat memory model). Mỗi thanh ghi đơn có thể được coi như một con trỏ chỉ vào không gian địa chỉ 4GB này. Các thanh ghi trong 80386 có giá trị 32 bit, gồm 5 nhóm chính:

Nhóm thanh ghi đa dụng (general purpose register): dùng di chuyển dữ liệu ra vài bộ vi xử lý, kiểm tra và lập các cờ trạng thái.

Nhóm các thanh ghi gỡ rối (debuging register): cho phép người lập trình thiết lập một vài địa chỉ ngắt (breakpoint address) trong quá trình để theo dõi, gỡ lỗi cho chương trình.

Nhóm các thanh ghi trạng thái và điều khiển (status and control register): cung cấp các cờ trạng thái chỉ ra kết quả của các phép toán và được dùng để thay đổi các bước thực thi của chương trình dựa vào kết quả kiểm tra cờ. Các thanh ghi cờ trạng thái được bộ quản lý bộ nhớ ảo VMM sử dụng rộng rãi để quản lý bộ nhớ.

EIP là thanh ghi lệnh mở rộng (extended instruction register): chỉ ra địa chỉ của lệnh tiếp theo sẽ được thi hành.

Nhóm các thanh ghi điều khiển (control register): được hệ điều hành dùng điều khiển việc thực thi chương trình và được dùng bởi VMM để đánh địa chỉ cho bộ nhớ ảo, hỗ trợ đặc điểm tổ chức bộ nhớ theo trang của 386.

Các thanh ghi phân đoạn (segment register): duy trì sự tương thích với hệ thống 80286 và cung cấp địa chỉ phân đoạn khi 386 chạy trong chế độ thực hoặc chế độ chuẩn.

Địa chỉ hóa bộ nhớ ảo: Windows 32bits dùng sơ đồ địa chỉ phân trang làm cho bộ nhớ vật lý dường như rộng thêm hơn.

Thư mục trang (page directory): là một bảng chứa đựng địa chỉ của 1024 bảng trang (page table), mỗi địa chỉ rộng 32 bit nên kích thước của thư mục trang là 4096 bytes.

Bảng trang (page table): bao gồm là các điểm nhập, mỗi điểm nhập là sự kết hợp của địa chỉ vật lý và các cờ trạng thái của bộ nhớ vật lý. Sự kết hợp giữa thư mục trang và một bảng trang đơn độc sẽ đánh địa chỉ cho 4MB bộ nhớ. Vì vậy nếu RAM được thêm vào thì đòi hỏi cũng phải thêm bảng trang cho mỗi 4MB. Các địa chỉ bảng trang tuần tự được lưu giữ trong thư mục trang cho đến tối đa 1024 địa chỉ. Cách đánh địa chỉ trang như trên là lý do giải thích tại sao bộ nhớ tối thiểu cho Windows 32bits là 4MB. Mỗi quá trình trong Windows 32bits có một tập các địa chỉ bảng trang được gán cho nó. Mỗi địa chỉ này bao gồm phần 20 bit cao là một địa chỉ vật lý và phần 12 bit thấp là các cờ trạng thái. Các cờ này cung cấp thông tin cần thiết cho thành phần Kernel của Windows và chương trình người sử dụng.

Khung trang (page frame): mỗi khung trang được đánh địa chỉ duy nhất bởi một điểm nhập trong bảng trang. Phần 12 bit thấp của địa chỉ ảo 32 bit này đặc tả cho 1 byte duy nhất của bộ nhớ. Việc sử dụng 12 bit này sẽ đánh địa chỉ toàn bộ 4096 byte của khung trang và như vậy khung trang sẽ chỉ vào các địa chỉ RAM vật lý.

Như vậy một địa chỉ ảo 32 bit được chia làm 3 phần:

10 bit cao (22 - 31) chỉ ra bảng trang được chọn trong thư mục trang 10 bit tiếp theo (12 - 21) chỉ ra địa chỉ của khung trang thuộc bảng trang 12 bit thấp (0 - 11) đặc tả cho địa chỉ byte vật lý bên trong ranh giới 4K của trang

Không gian bộ nhớ ảo của trình ứng dụng:

Trong Windows 32bits, mỗi quá trình có một không gian địa chỉ 4GB riêng của nó. Các nhánh (thread) thuộc quá trình chỉ có thể truy xuất đến không gian nhớ thuộc về quá trình đó mà thôi. Không gian địa chỉ của tất cả các quá trình khác đều không thể truy xuất đối với nhánh đang chạy. Tuy nhiên riêng trong Windows 32bits thì không hoàn toàn trọn vẹn như vậy, vùng nhớ thuộc về hệ

điều hành không được che giấu đối với nhánh đang chạy do vậy rất có khả năng nhánh đang chạy vì một sự cố nào đó sẽ truy xuất vào vùng dữ liệu của hệ điều hành và làm hỏng hệ thống.

Không gian địa chỉ của mỗi quá trình được phân thành các vùng như sau:

Vùng địa chỉ từ 0x00000000 đến 0x003FFFFF:

Đây là vùng nhớ kích thước 4MB ở phần đáy của không gian địa chỉ, Windows 32bits dùng để đảm bảo tính tương thích với MS-DOS và Windows 16 bit. Các ứng dụng 32 bit không nên đọc ghi vào vùng này. Về mặt lý thuyết thì CPU sẽ tạo ra lỗi truy xuất (access violation) nếu một nhánh nào đó của quá trình chạm vào vùng nhớ này, tuy nhiên vì lý do kỹ thuậ thì thực tế Microsoft không thể bảo vệ toàn bộ vùng nhớ này mà chỉ có thể bảo vệ vùng 4KB thấp nhất. Vì thế nếu một nhánh nào đó của quá trình cố gắng đọc ghi vào vùng nhớ có địa chỉ từ 0x00000000 đến 0x00000FFF thì CPU sẽ phát hiện và báo lỗi truy xuất. Việc bảo vệ vùng 4KB này đặc biệt hữu ích cho việc phát hiện các phép gán con trỏ rỗng.

Vùng địa chỉ từ 0x00040000 đến 0x7FFFFFFF:

Phần không gian 2.143.289.344 (= 2GB – 4KB) là nơi thường trú của không gian địa chỉ riêng (không chia sẻ) của quá trình. Một quá trình Win32 không thể đọc/ghi hoặc bằng bất kỳ cách nào truy xuất truy xuất dữ liệu của quá trình khác đang thường trú trên vùng này. Đối với tất cả các ứng dụng Win32, vùng này là nơi mà phần chính yếu của dữ liệu quá trình đang cất giữ. (adsbygoogle = window.adsbygoogle || []).push({});

Vùng địa chỉ từ 0x80000000 đến 0xBFFFFFFF:

Vùng 1GB này là nơi hệ thống cất giữ dữ liệu dùng chia sẽ giữa tất cả các quá trình Win32 chẳng hạn như các thư viện liên kết động hệ thống, kernel32.dll, user32.dll, gdi32.dll, advapi32.dll đều được nạp vào vùng không gian địa chỉ này. Chính điều này làm cho 4 thư viện hệ thống trở nên dễ dàng khả dụng đối với toàn bộ các quá trình Win32 một cách đồng thời. Hệ thống cũng ánh xạ toàn bộ các tập tin ánh xạ bộ nhớ (memory-mapped file) vào vùng này.

Vùng địa chỉ từ 0xC0000000 đến 0xFFFFFFFF:

Vùng 1GB này là nơi mã lệnh của hệ điều hành được định vị, bao gồm các trình điều khiển thiết bị ảo của hệ thống (VxD), mã lệnh quản lý bộ nhớ ở mức thấp, mã lệnh tập tin hệ thống. Cũng giống như vùng nhớ trước, toàn bộ mã lệnh trong vùng này được chia sẽ cho tất cả quá trình Win32. Tuy nhiên dữ liệu trong vùng này lại không được bảo vệ, bất kỳ một ứng dụng Win32 nào cũng có thể đọc/ghi vào vùng này và làm hỏng hệ thống.

Như vậy thì ý tưởng cơ bản cho việc thực hiện kỹ thuật override trong Windows 32 là cũng nhảy tới địa chỉ của hàm override tương ứng mỗi khi hàm API nào đó được gọi. Tuy nhiên, đối với Windows 32bits thì mỗi quá trình trong hệ thống đều được thực thi trong một không gian địa chỉ riêng rẽ. Nên muốn can thiệp vào quá trình gọi hàm của ứng dụng thì chúng ta phải bằng mọi cách thâm nhập vào không gian địa chỉ của ứng dụng, thì lúc đó chúng ta mới có thể điều khiển được quá trình gọi hàm API. Nhưng ở Windows 16 bit thì các hàm dùng để thay đổi thuộc tính các trang nhớ chứa mã hàm API thì nay ở trong Windows 32 bit không còn được hỗ trợ nữa. Như vậy làm theo cách như ở Windows 16 bit là không khả thi, vấn đề đặt ra là phải tìm cách thay đổi thuộc tính các trang nhớ đang chứa mã hàm API nguyên thủy.

Chúng tôi đã cố gắng nghiên cứu công việc này bằng các phương pháp được giới thiệu trong chương 16: Breaking Through Process Boundary Walls của cuốn Advance Windows – The Developer’s Guide to the Win32 API for Windows NT 3.5 and Windows 95 và tìm cách thực hiện nhưng chưa đạt được kết quả khả quan.

Do hạn chế về thời gian cũng như tài liệu tham khảo về các kỹ thuật này rất ít nên việc nghiên cứu để tìm ra cách giải quyết vấn đề sử dụng kỹ thuật override trong Windows 32bits chưa đi đến kết quả nên chúng tôi buộc phải chọn kỹ thuật override trong Windows 16bits để overrride các hàm xuất văn bản có sẵn để áp dụng vào chương trình của mình.

Một phần của tài liệu Nghiên cứu các phương pháp nhận dạng từ dưới Cursor mouse trên destop windows (Trang 42 - 46)