OSDev

для всех
Текущее время: 29 апр 2024, 11:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Помогите с разобраться с GDT
СообщениеДобавлено: 24 окт 2013, 21:44 

Зарегистрирован: 23 окт 2013, 22:26
Сообщения: 13
Всем доброго времени суток!
Помогите понять, как всё таки составлять 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, помогите с описаниемм вообщем и с использованием.
----------------------------------------
Прежде чем начинать меня троллить и обсирать - вспомините себя(первый раз пишу тему на этом форуме, о контингенте Вашем не знаю)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с разобраться с GDT
СообщениеДобавлено: 24 окт 2013, 23:30 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Какую главную функцию ты имеешь ввиду? Для начала, таблицу GDT нужно указать процессору с помощью ассемблерной инструкции LGDT [адрес _gdt]. В общем-то прежде всего ты должен знать что такое сегменты. Здесь каждая 8-байтная структура описывает параметры некого сегмента - кода, данных, и т.п., называется дескриптором. Потом в сегментный регистр заносим число, равное смещению дескриптора в таблице GDT.

Для объявления 32-битных переменных лучше использовать int, а не long. Разрядность long зависит от разрядности процессора, а int - нет.
Какой ты используешь компилятор - тоже интересно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с разобраться с GDT
СообщениеДобавлено: 25 окт 2013, 08:38 

Зарегистрирован: 23 окт 2013, 22:26
Сообщения: 13
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

Главная ф-ция - та на которую, на данный момент, идёт вызов из ассемблера.

Скажу честно, я со всем этим так запутался за последние дни. Про сегменты сейчас почитаю. Ещё раз огромное спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с разобраться с GDT
СообщениеДобавлено: 25 окт 2013, 17:39 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
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 классов. Кода или данных или нулевой. В каждом классе дескриптора кода и данных есть свои типы.
Плюс есть лимит, есть базовый адрес, есть несколько флагов которые отвечают за защиту сегмента который описывает дескриптор. Сегмент это база+лимит.

Что конкретно не понятно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с разобраться с GDT
СообщениеДобавлено: 25 окт 2013, 19:50 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
lmsw - устаревшая команда времен 16-разрядного защищенного режима. Как вариант:
Код:
  mov eax,cr0
  or al,1
  mov cr0,eax


Образ GDTR в памяти лучше не называть дескриптором, чтобы не путать с обычными дескрипторами. Как вариант:
Код:
  lgdt [GDTR]
...
GDTR:
  dw GDT_SIZE-1
  dd GDT


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с разобраться с GDT
СообщениеДобавлено: 26 окт 2013, 19:45 

Зарегистрирован: 23 окт 2013, 22:26
Сообщения: 13
pavia,
Стало понятнее, намного понятнее, спасибо большое!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с разобраться с GDT
СообщениеДобавлено: 07 ноя 2013, 20:42 

Зарегистрирован: 23 окт 2013, 22:26
Сообщения: 13
Назрел ещё вопрос.
GDT применяется для сегментной адресации памяти или для страничной?
-------------
UPD: разобрался


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с разобраться с GDT
СообщениеДобавлено: 08 ноя 2013, 08:15 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
ByMsx писал(а):
Назрел ещё вопрос.
GDT применяется для сегментной адресации памяти или для страничной?

и то и другое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с разобраться с GDT
СообщениеДобавлено: 08 ноя 2013, 09:35 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Дескрипторы сегментов, а соответственно, и таблицы дескрипторов относятся только к сегментированию памяти и для страничной организации сами по себе не нужны. Однако сегментацию в IA-32 выключить невозможно в принципе, поэтому, даже если система реально использует лишь страничную организацию памяти, процессору всё равно необходимы дескрипторы сегментов, а значит, и GDT. Просто эти дескрипторы будут соответствовать плоской модели памяти без каких-либо ограничений по доступу (весь контроль возлагается на страничный механизм), а поэтому настраиваются всего один раз и больше никогда не изменяются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с разобраться с GDT
СообщениеДобавлено: 16 ноя 2013, 13:34 

Зарегистрирован: 23 окт 2013, 22:26
Сообщения: 13
Спасибо огромное!!!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB