Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel x86上linux的段定义_Linux Kernel_X86 - Fatal编程技术网

Linux kernel x86上linux的段定义

Linux kernel x86上linux的段定义,linux-kernel,x86,Linux Kernel,X86,Linux 3.4.6在arch/x86/include/asm/segment.h中定义了以下宏。有人能解释为什么用户宏在定义的常量中加3,为什么内核宏不加3吗 #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_ENT

Linux 3.4.6在arch/x86/include/asm/segment.h中定义了以下宏。有人能解释为什么用户宏在定义的常量中加3,为什么内核宏不加3吗

#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)

这四个符号代表的是。这些描述符的两个最低有效位包含与其关联的,第三个最低有效位包含描述符表类型(or)。稍后出现的代码更清楚地说明了这一点:

/* 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
,将其向左移动三位,然后使用表类型和特权级别(使用加法)对其进行
运算:

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