0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 37
|
|
1 | |
Не могу понять действие сегментных регистров в защищенном режиме17.11.2018, 16:01. Показов 2501. Ответов 1
Метки c++, gdb, reverse engeneering, дескрипторы, защищенный режим, отладка, сегментирование, сегментные регистры, си, си++, таблицы дескрипторов (Все метки)
Добрый день! Пытаюсь разобраться с сегментными регистрами и возник ряд вопросов. Если я правильно понимаю, эти регистры в защищенном режиме указывают не на сам адрес в памяти, а не глобальную или локальную таблицу дескрипторов в которых лежат нужные адреса (или нет?).
1) Если это так, то значит, деление на cs, ds и т.д. происходит в самой таблице дескрипторов или как? 2) Как программа понимает, какую из таблиц нужно использовать? 3) Возможно ли как-то в процессе отладки, к примеру, с помощью GDB посмотреть содержание этих таблиц? 4) В реальном режиме они сразу указывают на точный адрес?
0
|
17.11.2018, 16:01 | |
Ответы с готовыми решениями:
1
Ошибка в DOS-BOXо - на любое действие пишет "эта операция недопустима в защищенном режиме" Обменять содержимое сегментных регистров DS и ES Связь сегментных регистров с сегментами Вывести значение сегментных регистров на экран |
Эксперт Hardware
|
|
17.11.2018, 23:01 | 2 |
Сообщение было отмечено Mikl___ как решение
Решение
..примерно так-оно и есть.
В таблице GDT прописаны 8-байтные дескрипторы, которые описывают сегменты памяти (в РМ сегменты называют секциями). Дескрипторы отличаются лишь (1)размерами описываемых секций (база всегда =0, а лимит может быть произвольным), второе - атрибутами защиты этих секций (R/W/Exec), и третье - типом (секция кода/данных/TSS). Когда система загружает EXE-файл в память, ядро проверяет, от куда происходит запуск - из пространства юзера (диапазон 00010000..7FFFFFFF), или ядра (80000000..FFFFFFFF). В зависимости от этого, система записывает в сегментный регистр 2-байтный селектор, где указывается 2-битное поле защиты DPL 0=ядро, или 3=юзер. Если это сегмент-данных(DS/ES/SS), то поле называют DPL. Если сегмент-кода(CS), то CPL (Descriptor_ или Current_Privelege_Level). Теперь по этому селектору, система выбирает соответствующий дескриптор из таблицы GDT, и копирует этот дескриптор из таблицы в скрытую/8-байтную часть сегментного регистра - итого в нём получается уже 10-байт, из которых программисту "виден" только 2-байтный селектор. По сути селектор - это порядковый номер (смещение) дескриптора в таблице GDT (нулевой не используется, а минимальный 8 принадлежит ядерному сегменту-кода CS=8). Процессор обращается к GDT только 1-раз при запуске приложения, и скопировав дескриптор в сегм.регистр, забывает о GDT вообще (в течении одной задачи). Адрес таблицы GDT хранится в спец/регистре процессора GDTR. Кроме него есть ещё LDTR (локальная таблица выбирается битом(3) селектора), IDTR (регистр базы таблицы-прерываний), TR (базовый рег. сегмента задачи Task) и прочие. Вся эта кухня описывается в манах Интела том(2), или можешь почитать на русише здесь: Память компьютера
3
|
17.11.2018, 23:01 | |
17.11.2018, 23:01 | |
Помогаю со студенческими работами здесь
2
Загрузить в стек содержимое всех сегментных регистров Не могу понять действие строки из кода Таймер в режиме захвата. Не могу понять что не так Память в защищенном режиме Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |