ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 25
- 26
- 27
- 28
- 29
- …
- следующая ›
- последняя »