Page 222 - Hướng Dẫn Cách Phòng Thủ Và Khắc Phục Sự Cố Máy Tính
P. 222
Vậy một địa chỉ sẽ là Base của đoạn đó + giá trị của
thanh ghi chỉ mục (ebx,esi,edi...) nhưng theo tôi thường
thấy các chương trình 32 bit thường set base của tất cả các
đoạn =0 hết.
Mục đầu tiên của bảng mô tả luôn toàn là sô" 0, vì vậy
nếu một segment selector =0 thì nó sẽ invalid. Do một
segment selector có 13 bít chỉ mục nên sô segment trong
bảng mô tả tốì đa là 2^13 -1 = 8191.
Linux Protected Mode
Nếu bạn choáng về sự phức tạp của chê độ protected
mode (thực ra còn nhiều nữa), thì may mắn cho bạn cho tôi
và cho cả lập trình viên Linux là không ai mà implement
hết. Giông Windows, Linux cũng làm protected mode đơn
giản thôi chỉ có 2 mức 0 cho Kernel và 3 cho User
Application. Vấn đề là tương thích vói các kiến trúc CPU
khác nữa. Tất cả các phân đoạn của Linux dùng GDT
không cần LDT. Có duy nhất một bảng GDT bao gồm:
1. Null
2. Kernel Code Segment: Chứa code của kernel.
Base=0. Limit=0xFFFF. G=l. s= l. Type=A có thể đọc và
thi hành (không modify được). DPL=0 Kernel mode only.
3. Kernel Data Segment: Chứa dữ liệu kernel. Base=0.
Limit=OxFFFF.G=l.S=l. Type=2 có thể đọc và ghi (không
thi hành được). DPL=0
4. User Code Segment: Chứa code segment cho tất cả
User proccess. Base=0. Limit=OxFFFF.G=l.S=l. Type=A.
DPL=3
5. User Data Segment: Chứa data segment cho tất cả
User process. Base=0. Limit=OxFFFF.G=l.S=l. Type=2.
DPL=3
6. Default null LDT
223