Для чего в ядре Linux используются регистры fs и gs. Как правильно называются дескрипторы, на которые указывают селекторы загружаемые в эти регистры
#define GDT_ENTRY_PERCPU (GDT_ENTRY_KERNEL_BASE + 15)
#ifdef CONFIG_SMP
#define __KERNEL_PERCPU (GDT_ENTRY_PERCPU * 8)
#else
#define __KERNEL_PERCPU 0
#endif
...
#define GDT_ENTRY_STACK_CANARY (GDT_ENTRY_KERNEL_BASE + 16)
#ifdef CONFIG_CC_STACKPROTECTOR
#define __KERNEL_STACK_CANARY (GDT_ENTRY_STACK_CANARY * 8)
#else
#define __KERNEL_STACK_CANARY 0
#endif
почему они используються только ядром, для юзерспейса нету аналогичных дескрипторов, также при выполнение инстпукцмм iret (в слечае понижение привилегий) регистры fs и gs обнуляются.
Почему при заполнении GDT дескриптор
[GDT_ENTRY_PERCPU] = GDT_ENTRY_INIT(0xc092, 0, 0xfffff),
static inline void setup_percpu_segment(int cpu)
{
#ifdef CONFIG_X86_32
struct desc_struct gdt;
pack_descriptor(&gdt, per_cpu_offset(cpu), 0xFFFFF,
0x2 | DESCTYPE_S, 0x8);
gdt.s = 1;
write_gdt_entry(get_cpu_gdt_table(cpu),
GDT_ENTRY_PERCPU, &gdt, DESCTYPE_S);
Инициализация дескриптора _KERNEL_STACK_CANARY, имеет еще более странные значения
#define GDT_STACK_CANARY_INIT \
[GDT_ENTRY_STACK_CANARY] = GDT_ENTRY_INIT(0x4090, 0, 0x18),
Почти не нашел не какой информации по этому вопросу. Надеюсь что хоть кто то сможет пролить свет на сею темную сторону