Здравствуйте! Такой-вот вопросик у меня (а точнее, просьба): При сегментной адресации памяти линейный адрес получается через селектор, который описан в GDT (берём в учёт что TI=0) + смещение. Но чтобы колдовать над всем этим, в P-mode надо сперва: 1). Создать (описать) саму дескрипторную таблицу. 2). Подготовить дескрипторы. 3). Загрузить всё это в память. Вот как это сделать? Мне нужен конкретный (наиболее понятный пример) создания таблицы GDT с адресом базы, пределом, а ещё и пример создания дескриптора/дескрипторов с пределом, базой и его флагами (права доступа, etc). Желательно под *NIX-систему, хотя это и не особо важно. Заранее благодарен!
А вот что я нашёл: Код (Text): gdt: gdt_null: dw 0, 0, 0, 0 ; Нулевой дескриптор - Здесь мне всё ясно - 8 байт заполняются нулями gdt_code: db 0xFF db 0xFF db 0x00 db 0x00 db 0x00 db 10011010b db 0xCF db 0x00 - а вот заполнение gdt_code неясно совсем. В какой последовательности эти поля заполняются? Как узнасть какое из этих 8 полей база, предел, DPL, права доступа и тд?
А вот нашёл более подробно: Код (Text): ; Сегментный дескриптор limit_low dw 0 ; Младшие два байта поля Segment limit base_low dw 0 ; Младшие два байта поля Base Address base_high0 db 0 ; Второй байт поля Base Address type_and_permit db 0 ; Флаги flags db 0 ; Ещё одни флаги base_high1 db 0 ; Старший байт поля Base Address Всё равно не понятно. Я ожидал тут встретить Базовай адрес, предел, бит гранулярности и всё то что включает в себя 64 битная структура дескриптора. А тут какие-то "Младшие два байта", "Второй байт"... Может кто-либо разъяснить? как правильно описывать дескриптор?
загугли struct _LDT_ENTRY виндовая структура, описывающая поля LDT. отличается мало, как я помню. зато красиво и с битовыми полями. или в статьях, на кноторые ссылка выше, тоже есть красивые картинки - что где
nixman Возьми маны от интел или амд. Там формат расписан. Так как защищенный режим появился в х286 то в дескрипторе полная каша. Флага лимиты база все перемешено.