x86

2012-07-31 16 views
5

लिनक्स 3.4.6 पर लिनक्स के लिए सेगमेंट परिभाषाएं आर्क/x86/include/asm/segment.h में निम्न मैक्रोज़ को परिभाषित करती हैं। क्या कोई यह समझा सकता है कि __USER मैक्रोज़ परिभाषित स्थिरांक में 3 क्यों जोड़ते हैं और यह __KERNEL मैक्रोज़ के लिए क्यों नहीं किया जाता है?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) 

उत्तर

5

ये चार प्रतीकों segment descriptors का प्रतिनिधित्व करते हैं। इन वर्णनकर्ताओं के दो कम-से-कम महत्वपूर्ण बिट्स में privilege level उनके साथ जुड़े होते हैं, और तीसरे कम से कम महत्वपूर्ण बिट में वर्णक तालिका प्रकार (GDT या LDT) शामिल है। यह एक छोटे से बाद होने वाली कोड से साफ किया जाता है:

/* 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 

इस लक्ष्य को पूरा वर्णनकर्ता तालिका प्रविष्टि 8 से गुणा किया जाता है, जो यह बाईं ओर तीन बिट बदलाव, और फिर OR तालिका प्रकार और विशेषाधिकार के साथ एड स्तर (अतिरिक्त का उपयोग करके):

/* 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)