Системное программное обеспечение. Особенности программирования 32-разрядных процессоров. Рощин А.В. - 27 стр.

UptoLike

Составители: 

27
может обращаться только та задача, в которой эти дескрипторы описаны.
Поскольку пока мы имеем дело с однозадачным режимом, локальная
таблица нам не нужна.
Поля дескрипторов для наглядности заполнены конкретными
данными явным образом, хотя объявление структуры descr с нулями во
всех полях позволяет описать дескрипторы несколько короче [8],
например:
gdt_null descr<>; Селектор 0 – обязательный нулевой дескриптор
gdt_data descr<data_size-1,,,92h> ; Селектор 8 – сегмент данных
В дескрипторе gdt_data (строка 23 листинга), описывающем сегмент
данных программы, заполняется поле границы сегмента (фактическое
значение размера сегмента data_size будет вычислено компилятором,
строка 30 листинга), а также байт атрибутов 1. Код 92h говорит о том, что
это сегмент данных с разрешением записи и чтения. Базу сегмента, т.е.
физический адрес его начала, придется вычислить программно и занести в
дескриптор уже на этапе выполнения.
Дескриптор gdt_code (строка 25 листинга) сегмента команд
заполняется схожим образом. Код атрибута 98h обозначает, что это
исполняемый сегмент, к которому, между прочим, запрещено обращение с
целью чтения или записи. Таким образом, сегменты команд в защищенном
режиме нельзя модифицировать по ходу выполнения программы.
Дескриптор gdt_stack (строка 27 листинга) сегмента стека имеет, как
и любой сегмент данных, код атрибута 92h, что разрешает его чтение и
запись, и явным образом заданную границу 255 байтов, что соответствует
размеру стека. Базовый адрес сегмента стека так же будет вычислен на
этапе выполнения программы.
Последний дескриптор gdt_screen (строка 29 листинга) описывает
страницу 0 видеобуфера. Размер видеостраницы, как известно, составляет
4096 байтов, поэтому в поле границы указано число 4095. Базовый
может обращаться только та задача, в которой эти дескрипторы описаны.
Поскольку пока мы имеем дело с однозадачным режимом, локальная
таблица нам не нужна.
     Поля дескрипторов для наглядности заполнены конкретными
данными явным образом, хотя объявление структуры descr с нулями во
всех полях позволяет описать дескрипторы несколько короче [8],
например:
     gdt_null descr<>; Селектор 0 – обязательный нулевой дескриптор
     gdt_data descr ; Селектор 8 – сегмент данных


     В дескрипторе gdt_data (строка 23 листинга), описывающем сегмент
данных программы, заполняется поле границы сегмента (фактическое
значение размера сегмента data_size будет вычислено компилятором,
строка 30 листинга), а также байт атрибутов 1. Код 92h говорит о том, что
это сегмент данных с разрешением записи и чтения. Базу сегмента, т.е.
физический адрес его начала, придется вычислить программно и занести в
дескриптор уже на этапе выполнения.
     Дескриптор gdt_code (строка 25 листинга) сегмента команд
заполняется схожим образом. Код атрибута 98h обозначает, что это
исполняемый сегмент, к которому, между прочим, запрещено обращение с
целью чтения или записи. Таким образом, сегменты команд в защищенном
режиме нельзя модифицировать по ходу выполнения программы.
     Дескриптор gdt_stack (строка 27 листинга) сегмента стека имеет, как
и любой сегмент данных, код атрибута 92h, что разрешает его чтение и
запись, и явным образом заданную границу 255 байтов, что соответствует
размеру стека. Базовый адрес сегмента стека так же будет вычислен на
этапе выполнения программы.
     Последний дескриптор gdt_screen (строка 29 листинга) описывает
страницу 0 видеобуфера. Размер видеостраницы, как известно, составляет
4096 байтов, поэтому в поле границы указано число 4095. Базовый


                                      27