Как понять следующий код в загрузочном коде xv6? - PullRequest
0 голосов
/ 12 октября 2018

Код :

#define SEG(type,base,lim)                  \
.word (((lim) >> 12) & 0xffff), ((base) & 0xffff);  \
.byte (((base) >> 16) & 0xff), (0x90 | (type)),     \
    (0xC0 | (((lim) >> 28) & 0xf)), (((base) >> 24) & 0xff)

Я знаю, что это структура дескриптора сегмента.

Но я не понимаю код: ((lim) >> 12 & 0xffff)

Зачем нужен сдвиг вправо на 12 бит?

Мне нужна помощь.

1 Ответ

0 голосов
/ 12 октября 2018

Причина архаичная.Дескрипторы составляли 8 байтов в 286, а ограничение использовалось для кодирования в 16 бит в 286 16-битном защищенном режиме.Когда пришло 386, дескрипторы не были расширены - каждая запись по-прежнему 8 байтов.Однако не было бы достаточно места для кодирования как базы сегмента, так и предела сегмента с использованием 32 битов - поэтому ограничения теперь кодируются с использованием 20 битов.

Существует 2 варианта определения 20-битного ограниченияинтерпретируется - как кратное 4K или как байты - это называется гранулярностью.Режим 4K является хорошим компромиссом и довольно неплохо работает вместе с размером страницы 4K 386 - когда вы используете ограничения более 1 МБ, очень вероятно, что вы также используете виртуальную память, и тогда вы потеряете всю страницу на краюв любом случае.

Ограничение, данное макросу, выражается в байтах и ​​делится на 4096 (>> 12), чтобы получить гранулярный предел страницы.

...