gpt4 book ai didi

linux-kernel - x86 上 linux 的段定义

转载 作者:行者123 更新时间:2023-12-04 05:11:05 25 4
gpt4 key购买 nike

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与它们相关联,第三个最低有效位包含描述符表类型( GDTLDT )。稍后发生的代码更清楚地说明了这一点:

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

关于linux-kernel - x86 上 linux 的段定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11735729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com