Почему такие поля, как 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

Другие вопросы по тегам