OSDev http://osdev.su/ |
|
Помогите с разобраться с GDT http://osdev.su/viewtopic.php?f=5&t=812 |
Страница 1 из 1 |
Автор: | ByMsx [ 24 окт 2013, 21:44 ] |
Заголовок сообщения: | Помогите с разобраться с GDT |
Всем доброго времени суток! Помогите понять, как всё таки составлять GDT-структуру и использовать её, перечитал http://wiki.osdev.org/GDT_Tutorial раз 5, всё равно никак не могу врубиться, код снизу видел, но всё равно он генерит какое-то длинное 8-байтное число. А что с ним дальше делать, понимаю, что передавать процессору, но... Как я до всего этого докатился: * Реализация ф-ций malloc, free(new, delete); * Реализация многозадачности; Вот мои наработки по GDT. Код: struct gdt_null { unsigned long n1; unsigned long n2; }; struct gdt_code { unsigned short c; unsigned short a; unsigned char b; unsigned char g; unsigned char n; unsigned char v; }; struct gdt_data { unsigned short c; unsigned short a; unsigned char b; unsigned char g; unsigned char n; unsigned char v; }; struct _gdt { struct gdt_null null; struct gdt_code code; struct gdt_data data; }; А главная ф-ция получает от ассемблерного кода путем push'a указатель на структуру _gdt, помогите с описаниемм вообщем и с использованием. ---------------------------------------- Прежде чем начинать меня троллить и обсирать - вспомините себя(первый раз пишу тему на этом форуме, о контингенте Вашем не знаю) |
Автор: | Himik [ 24 окт 2013, 23:30 ] |
Заголовок сообщения: | Re: Помогите с разобраться с GDT |
Какую главную функцию ты имеешь ввиду? Для начала, таблицу GDT нужно указать процессору с помощью ассемблерной инструкции LGDT [адрес _gdt]. В общем-то прежде всего ты должен знать что такое сегменты. Здесь каждая 8-байтная структура описывает параметры некого сегмента - кода, данных, и т.п., называется дескриптором. Потом в сегментный регистр заносим число, равное смещению дескриптора в таблице GDT. Для объявления 32-битных переменных лучше использовать int, а не long. Разрядность long зависит от разрядности процессора, а int - нет. Какой ты используешь компилятор - тоже интересно. |
Автор: | ByMsx [ 25 окт 2013, 08:38 ] |
Заголовок сообщения: | Re: Помогите с разобраться с GDT |
Himik писал(а): Какую главную функцию ты имеешь ввиду? Для начала, таблицу GDT нужно указать процессору с помощью ассемблерной инструкции LGDT [адрес _gdt]. В общем-то прежде всего ты должен знать что такое сегменты. Здесь каждая 8-байтная структура описывает параметры некого сегмента - кода, данных, и т.п., называется дескриптором. Потом в сегментный регистр заносим число, равное смещению дескриптора в таблице GDT. Для объявления 32-битных переменных лучше использовать int, а не long. Разрядность long зависит от разрядности процессора, а int - нет. Какой ты используешь компилятор - тоже интересно. Использую i586-elf-as и i586-elf-g++ Да, гружу ассемблером таблицу gdt: Код: inb $0x92, %al orb $0x02, %al outb %al, $0x92 cli lgdt gdt_descriptor movw $1, %ax lmsw %ax push $gdt call kernel_init Вот gdt в асме: Код: .section .gdt gdt: gdt_null: .long 0 .long 0 gdt_code: .short 0x0FFFF .short 0 .byte 0 .byte 0x9A .byte 0xCF .byte 0 gdt_data: .short 0x0FFFF .short 0 .byte 0 .byte 0x9A .byte 0xCF .byte 0 gdt_end: gdt_descriptor: .short gdt_end - gdt - 1 .long gdt Главная ф-ция - та на которую, на данный момент, идёт вызов из ассемблера. Скажу честно, я со всем этим так запутался за последние дни. Про сегменты сейчас почитаю. Ещё раз огромное спасибо! |
Автор: | pavia [ 25 окт 2013, 17:39 ] |
Заголовок сообщения: | Re: Помогите с разобраться с GDT |
GDT это таблица т.е массив дескрипторов. Дескриптор это 8 байт. Со сложной структурой, форматом данных. Более того в 64-битном процессоре есть и 8 байтовые и 16 байтовые дескрипторы. Код: const MaxGDT=1024; type TDescriptor=array [0..7] of Byte; var GDT:array [0..MaxGDT-1]of TDescriptor; const GDTR:packed record Limit:Word; Base:DWord; Reserv:Word; end=(Limit:8*MaxGDT-1;Base:0;Reserv:0); Нулевой элемент GDT зарезервирован для служебных нужд и должен содержать нулевой дескриптор. Нулевой дескриптор это в котором все байты нулевые. GDTR - это регистр который хранит описания таблицы GDT, а именно её лимит и базу. Reserv для выравнивания до 8 байт. Для работы с регистром GDTR существуют 2 команды со странными названиями LGDT и SGDT Собственно всё. Осталось только разобраться со структурой дескриптора и зачем он вообще нужен. В сегментный регистр CS, DS, ES, SS мы можем загрузить селектор. Селектор состоит из фага выбора между таблицами GDT и LDT и индекса в этой таблице (и ещё RPL). При загрузке селектора в теневую часть сегментного регистра копируется дескриптор из указанной таблице GDT\LDT. По поводу дескриптора. Он имеет сложную структуру. Дескрипторы бывают 3 классов. Кода или данных или нулевой. В каждом классе дескриптора кода и данных есть свои типы. Плюс есть лимит, есть базовый адрес, есть несколько флагов которые отвечают за защиту сегмента который описывает дескриптор. Сегмент это база+лимит. Что конкретно не понятно? |
Автор: | phantom-84 [ 25 окт 2013, 19:50 ] |
Заголовок сообщения: | Re: Помогите с разобраться с GDT |
lmsw - устаревшая команда времен 16-разрядного защищенного режима. Как вариант: Код: mov eax,cr0 or al,1 mov cr0,eax Образ GDTR в памяти лучше не называть дескриптором, чтобы не путать с обычными дескрипторами. Как вариант: Код: lgdt [GDTR]
... GDTR: dw GDT_SIZE-1 dd GDT |
Автор: | ByMsx [ 26 окт 2013, 19:45 ] |
Заголовок сообщения: | Re: Помогите с разобраться с GDT |
pavia, Стало понятнее, намного понятнее, спасибо большое! |
Автор: | ByMsx [ 07 ноя 2013, 20:42 ] |
Заголовок сообщения: | Re: Помогите с разобраться с GDT |
Назрел ещё вопрос. GDT применяется для сегментной адресации памяти или для страничной? ------------- UPD: разобрался |
Автор: | scuter [ 08 ноя 2013, 08:15 ] |
Заголовок сообщения: | Re: Помогите с разобраться с GDT |
ByMsx писал(а): Назрел ещё вопрос. GDT применяется для сегментной адресации памяти или для страничной? и то и другое. |
Автор: | SII [ 08 ноя 2013, 09:35 ] |
Заголовок сообщения: | Re: Помогите с разобраться с GDT |
Дескрипторы сегментов, а соответственно, и таблицы дескрипторов относятся только к сегментированию памяти и для страничной организации сами по себе не нужны. Однако сегментацию в IA-32 выключить невозможно в принципе, поэтому, даже если система реально использует лишь страничную организацию памяти, процессору всё равно необходимы дескрипторы сегментов, а значит, и GDT. Просто эти дескрипторы будут соответствовать плоской модели памяти без каких-либо ограничений по доступу (весь контроль возлагается на страничный механизм), а поэтому настраиваются всего один раз и больше никогда не изменяются. |
Автор: | ByMsx [ 16 ноя 2013, 13:34 ] |
Заголовок сообщения: | Re: Помогите с разобраться с GDT |
Спасибо огромное!!! |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |