linux-kernel – x86上linux的段定义
发布时间:2020-12-14 01:00:30 所属栏目:Linux 来源:网络整理
导读:Linux 3.4.6在arch / x86 / include / asm / segment.h中定义了以下宏.任何人都可以解释为什么__USER宏将3添加到已定义的常量以及为什么不对__KERNEL宏执行此操作? #define __KERNEL_CS (GDT_ENTRY_KERNEL_CS*8)#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8
Linux 3.4.6在arch / x86 / include / asm / segment.h中定义了以下宏.任何人都可以解释为什么__USER宏将3添加到已定义的常量以及为什么不对__KERNEL宏执行此操作?
#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) 解决方法
这四个符号代表
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,将其向左移位3位,然后与表类型和权限级别进行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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |