Почему такие поля, как limit и base отдельно хранятся в gdt в os?
Например, в коде xv6 mmu.h segdesc имеет такой вид
struct segdesc {
uint lim_15_0 : 16; // Low bits of segment limit
uint base_15_0 : 16; // Low bits of segment base address
uint base_23_16 : 8; // Middle bits of segment base address
uint type : 4; // Segment type (see STS_ constants)
uint s : 1; // 0 = system, 1 = application
uint dpl : 2; // Descriptor Privilege Level
uint p : 1; // Present
uint lim_19_16 : 4; // High bits of segment limit
uint avl : 1; // Unused (available for software use)
uint rsv1 : 1; // Reserved
uint db : 1; // 0 = 16-bit segment, 1 = 32-bit segment
uint g : 1; // Granularity: limit scaled by 4K when set
uint base_31_24 : 8; // High bits of segment base address
};
почему база определяется как base_15_0, base_23_16, base_31_24, а не как 'uint base'?
Я полагаю, что это отчасти связано с тем, что каждое подполе имеет особое значение, поэтому удобнее хранить их отдельно, а не в целом. Но я не уверен, что предположение является полным или правильным
1 ответ
Потому что это не произвольная приятная для чтения внутренняя структура данных, а точное описание структуры данных, используемой оборудованием
Источник: Руководства разработчика программного обеспечения для архитектуры Intel® 64 и IA-32.
Смотрите также: http://wiki.osdev.org/Global_Descriptor_Table