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 hố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 tố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ỉ tồ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 hồn tồ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ệ tồ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ữ.
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 tồn bộ các quá trình Win32 một cách đồng thời. Hệ thống cũng ánh xạ tồ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, tồ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.