Почему биты 11 и 12 дескриптора сегмента не сгруппированы вместе? - PullRequest
0 голосов
/ 06 сентября 2018

Вопрос по определению: в Руководстве по разработке программного обеспечения для архитектуры Intel 64 и IA-32, том 3А, кратко описаны поля дескриптора сегмента в разделе 5.2. Почему поле «тип» определяется как биты с 8 по 11 и не включает в себя бит 12, который просто указывается как «флаг типа дескриптора»? Учитывая, что биты 11 и 12 используются вместе, чтобы определить, является ли сегмент кодом, данными или системным сегментом, разве не логичнее сгруппировать их вместе?

1 Ответ

0 голосов
/ 06 сентября 2018

Это происходит потому, что структура поля TYPE (биты 8-11) сильно отличается, когда поле S (бит 12) равно 0 или 1.

Когда это поле равно 1, у нас есть следующая таблица:

   11 10 9 8
0   0  0 0 0 Data Read-Only
1   0  0 0 1 Data Read-Only, accessed
2   0  0 1 0 Data Read/Write
3   0  0 1 1 Data Read/Write, accessed
4   0  1 0 0 Data Read-Only, expand-down
5   0  1 0 1 Data Read-Only, expand-down, accessed
6   0  1 1 0 Data Read/Write, expand-down
7   0  1 1 1 Data Read/Write, expand-down, accessed
8   1  0 0 0 Code Execute-Only
9   1  0 0 1 Code Execute-Only, accessed
10  1  0 1 0 Code Execute/Read
11  1  0 1 1 Code Execute/Read, accessed
12  1  1 0 0 Code Execute-Only, conforming
13  1  1 0 1 Code Execute-Only, conforming, accessed
14  1  1 1 0 Code Execute/Read, conforming
15  1  1 1 1 Code Execute/Read, conforming, accessed

Но когда это поле равно 0, таблица сильно отличается:

   11 10 9 8 32-Bit Mode            IA-32e Mode
0   0  0 0 0 Reserved               Upper 8 bytes of an 16-byte descriptor
1   0  0 0 1 16-bit TSS (Available) Reserved
2   0  0 1 0 LDT                    LDT
3   0  0 1 1 16-bit TSS (Busy)      Reserved
4   0  1 0 0 16-bit Call Gate       Reserved
5   0  1 0 1 Task Gate              Reserved
6   0  1 1 0 16-bit Interrupt Gate  Reserved
7   0  1 1 1 16-bit Trap Gate       Reserved
8   1  0 0 0 Reserved               Reserved
9   1  0 0 1 32-bit TSS (Available) 64-bit TSS (Available)
10  1  0 1 0 Reserved               Reserved
11  1  0 1 1 32-bit TSS (Busy)      64-bit TSS (Busy)
12  1  1 0 0 32-bit Call Gate       64-bit Call Gate
13  1  1 0 1 Reserved               Reserved
14  1  1 1 0 32-bit Interrupt Gate  64-bit Interrupt Gate
15  1  1 1 1 32-bit Trap Gate       64-bit Trap Gate

Так что, конечно, вы можете рассматривать 12-й бит как часть типа дескриптора, но легче представить их как два отдельных свойства.

Таким образом, для сегментов кода / данных вы используете следующие 4 бита в качестве битовой маски (т. Е. Каждый бит определяет, включена или выключена некоторая «функция», например, 11-й бит 0 означает данные), но для системных сегментов вы рассматривая его как одно значение 0-15, где каждый бит не имеет особого значения

...