2012-07-31 30 views
5

Linux 3.4.6 xác định các macro sau trong arch/x86/include/asm/segment.h. Ai có thể giải thích tại sao các macro __USER thêm 3 vào hằng số được xác định và tại sao điều này không được thực hiện cho các macro __KERNEL?Định nghĩa phân đoạn cho linux trên x86

#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS*8) 
#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8) 
#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8+3) 
#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8+3) 

Trả lời

5

Bốn ký hiệu này đại diện cho segment descriptors. Hai bit ít quan trọng nhất của các bộ mô tả này chứa privilege level được liên kết với chúng và bit thứ ba có ý nghĩa nhỏ nhất chứa loại bảng mô tả (GDT hoặc LDT). Này được thực hiện rõ ràng hơn bởi mã xảy ra một chút sau:

/* User mode is privilege level 3 */ 
#define USER_RPL    0x3 
/* LDT segment has TI set, GDT has it cleared */ 
#define SEGMENT_LDT    0x4 
#define SEGMENT_GDT    0x0 

/* Bottom two bits of selector give the ring privilege level */ 
#define SEGMENT_RPL_MASK  0x3 
/* Bit 2 is table indicator (LDT/GDT) */ 
#define SEGMENT_TI_MASK   0x4 

Để đạt được điều này, các mục nhập bảng mô tả được nhân 8, mà thay đổi nó ba bit sang bên trái, và sau đó OR ed với các loại bảng và đặc ân cấp độ (sử dụng bổ sung):

/* GDT, ring 0 (kernel mode) */ 
#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS*8) 

/* GDT, ring 3 (user mode) */ 
#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8+3) 
Các vấn đề liên quan