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
   217   218   219   220   221   222   223   224   225   226   227