2013-03-11 64 views
8

Tôi cần phải sửa đổi một số dll, nhưng tôi không biết, những gì excatly nào phân khúc đăng ký (DS, SS, ...) trong chế độ bảo vệ. Tôi đã học ở trường về chế độ 16 bit thực, trong đó phân đoạn đăng ký nhân với 16 cộng với bù trừ trong thanh ghi bình thường cho địa chỉ hiệu quả trong bộ nhớ vật lý. Trong chế độ bảo vệ, có một số mô hình bộ nhớ phẳng và bộ nhớ ảo, trong đó mỗi quá trình "có" bộ nhớ 4GB, vì vậy nếu thanh ghi có 32 bit, thì tôi có thể giải quyết từng byte của bộ nhớ ảo chỉ bằng "bù" đăng ký. Vì vậy mà puproses có thanh ghi segment trong chế độ bảo vệ, ví dụMục đích của phân đoạn đăng ký ở chế độ được bảo vệ x86 là gì?

mov eax, dword ptr ds:[20037DA0] 
+0

Bạn đang sử dụng bộ tách rời nào? Có lẽ nó mặc định luôn luôn deducing và hiển thị đăng ký phân khúc dựa trên opcode ngay cả khi bộ nhớ không được phân đoạn. – Michael

+0

@Michael: Tôi đang sử dụng ollydbg – Krab

+1

Bộ nhớ vẫn được phân đoạn, mặc dù các hệ điều hành phổ biến nhất chỉ sử dụng một phân đoạn và đặt tất cả các thanh ghi phân đoạn thành cùng một giá trị. –

Trả lời

6

về cơ bản mục đích là giống như trong chế độ thực ngoại trừ cách họ làm việc là hơi khác nhau. DS trong ví dụ của bạn chọn một bộ mô tả bộ nhớ trong GDT của bạn (google thuật ngữ này nếu bạn thực sự muốn hiểu điều này, "Bảng mô tả toàn cục") chứa thông tin như địa chỉ cơ sở, địa chỉ cuối, độ chi tiết, vv. , kết thúc. Nếu bạn đang ở trên cửa sổ (tôi đặt cược trên linux của nó giống nhau) bạn không generaly phải lo lắng về các đăng ký phân khúc, như bạn nói mô hình phẳng của nó, có nghĩa là có nên chỉ có một mô tả cho tất cả bộ nhớ, vì vậy nếu bạn không thay đổi những thanh ghi này sẽ hoạt động như thể chúng thậm chí còn tồn tại.

+0

Có một số khác biệt quan trọng trong việc sử dụng thanh ghi phân đoạn giữa chế độ thực và mô hình được bảo vệ cần được thực hiện vào tài khoản. Ví dụ, trong chế độ được bảo vệ bằng cách sử dụng ghi đè phân đoạn 'ss:' có thể tạo lỗi phân đoạn, vì vậy không thể sử dụng bất kỳ thanh ghi nào khác ngoại trừ 'esp' và' ebp' làm cơ sở đăng ký trong ngăn xếp địa chỉ. Trong chế độ thực, bạn có thể xử lý stack với bất kỳ thanh ghi nào bạn muốn, bằng cách sử dụng ghi đè phân đoạn 'ss:'. – nrz

+0

Hmm, điểm hợp lệ, nhưng với mục đích đọc/ghi chồng tôi tin rằng bạn chỉ có thể sử dụng ds: bù đắp cũng như trong khi có bất kỳ đăng ký bạn muốn như bù đắp. Cung cấp các điểm bù đắp cho ngăn xếp của khóa học. – Pyjong

+2

@nrz Trong khi 'ds/es.base' có thể khác với' ss.base' (lý do cơ bản nhất tại sao bạn không thể sử dụng các phân đoạn này thay thế cho nhau), đó sẽ là một thiết lập khá hiếm trong chế độ được bảo vệ 32 bit và có thể yêu cầu thêm hướng dẫn để truyền xung quanh địa chỉ của biến cục bộ trong C/C++ (bạn cần tính đến sự khác biệt cơ sở phân đoạn, vì vậy người dân địa phương có thể được truy cập thông qua 'ds' trong các hàm được gọi, giống như globals). –

5

Một số bối cảnh lịch sử

Các 8086 luôn được sử dụng một cửa sổ 64KiB cố định cho mỗi phân đoạn có địa chỉ bắt đầu đã được tính toán bằng cách (đăng ký phân khúc * 16). Kể từ 80286 có một số bảng đặc biệt trong bộ nhớ (GDT và LDT). Các bảng này chứa địa chỉ xuất phát, độ dài và quyền truy cập của phân đoạn. Phân đoạn đăng ký (CS, DS, ES, SS - và từ 80386: FS, GS) chứa các chỉ mục vào các bảng này. Vì vậy về mặt lý thuyết, một hệ điều hành có thể thiết lập độ lệch và chiều dài của đoạn theo cách nó muốn thực hiện: Trên 8086 DS = 0xcó nghĩa là: Phân đoạn là 64KiB bắt đầu từ địa chỉ 0x. Trong chế độ 32 bit DS = 0xcó thể có nghĩa là: Phân đoạn bắt đầu tại địa chỉ 0xABCD, độ dài là 0xEF byte - điều này phụ thuộc vào nội dung của bảng GDT và LDT được tạo bởi hệ điều hành. Cố gắng truy cập một phân đoạn nằm ngoài phạm vi này (DS: 0x1000 nếu độ dài là < 0x1000) sẽ gây ra một ngoại lệ (ngắt).

trạng

hệ điều hành 32-bit Tuy nhiên hiện đại nhất không thực sự sử dụng phân đoạn đăng ký nữa. Giá trị của chúng được đặt tùy thuộc vào chế độ (hạt nhân hoặc người dùng) do các vấn đề về quyền truy cập. Địa chỉ bắt đầu thường là 0 và độ dài là 4GiB.

Việc bảo vệ bộ nhớ thực được thực hiện bằng MMU để một số vùng bộ nhớ không thể truy cập được ở chế độ người dùng. Trong các hệ điều hành hiện đại, MMU hoàn toàn mang tính tinh vi. Nó ánh xạ một địa chỉ ảo "tuyệt đối" đến một địa chỉ vật lý thực kiểm tra các vi phạm quyền truy cập.

Có một ngoại lệ: Một số hệ điều hành (ví dụ Windows và Linux) sử dụng phân đoạn FS và/hoặc GS để thực sự trỏ đến một vùng bộ nhớ khác. Vì lý do này trong chế độ 64 bit, bộ vi xử lý x86 chỉ sử dụng thanh ghi CS cho các vấn đề về quyền truy cập và FS và GS có thể được sử dụng để thêm bù đắp cho mỗi địa chỉ. Theo như tôi biết DS, ES và SS không được sử dụng trong khi nội dung của sổ đăng ký FS và GS không quan trọng nhưng có các thanh ghi đặc biệt cho phép bù đắp một cách rõ ràng cho một hoạt động sử dụng FS hoặc GS.

+0

FS được sử dụng để xử lý ngoại lệ trên Windows. Stackframe được lưu ở đó, do đó, trình xử lý ngoại lệ có thể tìm thấy nó quay trở lại. – Devolus

+0

@Devolus Nó không chỉ là xử lý ngoại lệ. Nói chung, 'FS' trỏ đến [** TIB **] (http://en.wikipedia.org/wiki/Win32_Thread_Information_Block). –

+1

Trong chế độ 64 bit cs, ds, es và ss không tồn tại nữa. Chỉ fs và gs làm. – Nubok

0

Tôi sẽ cung cấp cho bạn một câu trả lời đơn giản, nhưng để biết thêm thông tin, tôi khuyên bạn nên liên kết bên dưới với tài liệu kiến ​​trúc của AMD, đọc rất dễ dàng.PS: Tôi chưa bao gồm Xeon hoặc PAE ở đây ..

Kiến trúc IA-32 (x86) có bus địa chỉ vật lý 32 bit cho RAM.

Xe buýt 32 bit được chia tách thành các phân đoạn 2x16bits, mỗi đoạn có khả năng truy cập 2GB RAM với tổng số 4GB.
Điều này được gọi là chuyển đổi ngân hàng bộ nhớ.

Để cho phép bảo vệ, Intel cùng với MS đã quyết định sử dụng một phân đoạn cho kernelmode và một cho usermode - đó là lý do tại sao Windows trong lịch sử có không gian địa chỉ usermode 2GB. Đó là giới hạn phần cứng x86, không phải là giới hạn của Windows.

Phân khúc này ghi lại không gian hạt nhân và địa chỉ không gian người dùng được tách biệt. Đó là cách bảo vệ bộ nhớ được thực hiện.

Ngoài ra, tổng đài IA-32 cũng có thanh ghi bên trong 32 bit nên không thể trang. Đây là chế độ thực (không có bản dịch địa chỉ).

Phân trang yêu cầu 36bits Tôi nghĩ (không báo cho tôi) là nơi IA32e xuất hiện. Các bit bổ sung trên IA-32e cho phép phân trang từ HDD, đây là cách duy nhất có thể chạy trên x64 Windows kể từ x64 yêu cầu NX và nó nằm ở bit 63.

Vui lòng đọc tài liệu kiến ​​trúc AMD, cá nhân tôi tìm thấy chúng nhiều thông tin hơn các phiên bản của Intel.

http://developer.amd.com/wordpress/media/2012/10/24593_APM_v21.pdf

PS với AMD64 bộ nhớ phẳng được giới thiệu, với việc từ bỏ phân khúc.

Tuy nhiên, các quy trình 32bit vẫn cần đăng ký phân đoạn. Trên AMD64 khi một quá trình 32 bit chạm đầu stack, một con trỏ được ném đến một địa chỉ cơ sở trên thanh ghi phân đoạn mới. Bằng cách này, các ứng dụng 32 bit có hiệu quả có thể ăn nhiều RAM tùy thích, không giới hạn. Cũng trong vòng lý do ... ...

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan