OSDev

для всех
Текущее время: 22 ноя 2019, 05:30

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




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 16 сен 2011, 10:15 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
Вобщем задача. Хочу сделать так:
Нужены сегменты:
- кода (выполнение)
- данных кода (проекция предыдущего, как данные, чтоб загружать, выгружать и пр)
- данных 0 (не пересекается с кодом)
- данных 1 (не пересекается с кодом)
- данных N (не пересекается с кодом)

это как я понимаю не проблема. Указывается размер и стартовый адрес (виртуальный) в GDT. А paging как использовать? Он же не на каждый GDT делается, а на всю физ память?

Чтото я не могу сообразить как мне сделать все эти сегменты максимального размера (4Г)..


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2011, 13:17 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1096
Откуда: Балаково
qeos писал(а):
это как я понимаю не проблема. Указывается размер и стартовый адрес (виртуальный) в GDT. А paging как использовать? Он же не на каждый GDT делается, а на всю физ память?

С точки зрения сегментов, страничная память воспринимается как обычная память. Используя 4КБ страницы, можно подстроить память и под отдельные сегменты - если надо.
qeos писал(а):
Чтото я не могу сообразить как мне сделать все эти сегменты максимального размера (4Г)..

Для этого в сегменте надо указать базу = 0, а лимит = -1. Вот примеры на Си:
Код:
0xFF,0xFF,0,0,0,0x9A,0xCF,0, //Code 32bit PL0
0xFF,0xFF,0,0,0,0x92,0xCF,0, //Data 32bit PL0
0xFF,0xFF,0,0,0,0xFA,0xCF,0, //Code 32bit PL3
0xFF,0xFF,0,0,0,0xF2,0xCF,0, //Data 32bit PL3


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2011, 14:09 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
Himik писал(а):
qeos писал(а):
Чтото я не могу сообразить как мне сделать все эти сегменты максимального размера (4Г)..

Для этого в сегменте надо указать базу = 0, а лимит = -1. Вот примеры на Си:
Код:
0xFF,0xFF,0,0,0,0x9A,0xCF,0, //Code 32bit PL0
0xFF,0xFF,0,0,0,0x92,0xCF,0, //Data 32bit PL0
0xFF,0xFF,0,0,0,0xFA,0xCF,0, //Code 32bit PL3
0xFF,0xFF,0,0,0,0xF2,0xCF,0, //Data 32bit PL3

да, но эти сегменты будут тогда пересекаться! или нет?
мне нужно чтоб я писал в сегмент 1 и это никак не отразилось на данных сегмента 2


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2011, 14:50 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1204
Зачем нужны сегменты данных 0-N?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2011, 14:56 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
phantom-84 писал(а):
Зачем нужны сегменты данных 0-N?

есть желаение сделать громадный монолит..


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2011, 16:28 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1096
Откуда: Балаково
qeos писал(а):
да, но эти сегменты будут тогда пересекаться! или нет?
мне нужно чтоб я писал в сегмент 1 и это никак не отразилось на данных сегмента 2

Если сегменты охватывают всю память, то как же они могут не пересекаться?
Чтобы их разделить, надо использовать разные виртуальные адресные пространства - тоесть разные каталоги страниц, и переключаться между ними. Как в микроядре.


Последний раз редактировалось Himik 16 сен 2011, 16:36, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2011, 16:33 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1204
qeos писал(а):
есть желаение сделать громадный монолит..
Не уловил связи...

У меня до середины 2008 года было ядро с непересекающимися сегментами кода (данных) для каждого модуля ядра и самого ядра. Но это было сделано для загружаемых модулей (чтобы их не релоцировать). Проблем здесь нет никаких. Я вводил дополнительные функции только для определения базового адреса "пространства модуля" в линейном адресном пространстве (чтобы, например, драйвер смог выровнять буфер на 4-мегабайтную отметку в линейном адресном пространстве) и для изменения размера "пространства модуля" на этапе инициализации. Ну и естественно везде селекторы, дальние переходы и т.п. Стеки были общими. Если ты под "громадным монолитом" подразумеваешь цельное монолитное ядро, то тебе такое вообще без надобности.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2011, 16:48 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
да, наверно правильнее использовать разные PageDirectory для разных сегментов..
в самом простом варианте я подумал сделать следущее:

есть нечто монолитное.. т.е. все выполняется в одном и томже адресном пространстве..
вот к примеру надо загрузить файлик 4Gb.. создается дескриптор в GDT данных... в который прогружается этот файл.. (я знаю что такое кеширование, но пока тут оно не нужно.. т.к. утрирую задачу).. соответственно работа идет через регистр DS.. а к этим данным обращение через GS..

видимо без плясок такое сделать нельзя..


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2011, 18:07 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1096
Откуда: Балаково
Можно и без плясок, но использовать 64-битный режим. Правда там сегментов нет...
Или обходись небольшими сегментами в 32-битном режиме.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2011, 20:46 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1204
qeos писал(а):
да, наверно правильнее использовать разные PageDirectory для разных сегментов..
в самом простом варианте я подумал сделать следущее:

есть нечто монолитное.. т.е. все выполняется в одном и томже адресном пространстве..
вот к примеру надо загрузить файлик 4Gb.. создается дескриптор в GDT данных... в который прогружается этот файл.. (я знаю что такое кеширование, но пока тут оно не нужно.. т.к. утрирую задачу).. соответственно работа идет через регистр DS.. а к этим данным обращение через GS..
На 32-разрядной архитектуре такое невозможно. Нужно по очереди загружать отдельные фрагменты файла в одну и ту же память или использовать PAE и переключаемые банки памяти.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2, 3  След.

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


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

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


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

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