OSDev
http://osdev.su/

Архитектура памяти и сегметов. как?
http://osdev.su/viewtopic.php?f=6&t=444
Страница 1 из 3

Автор:  qeos [ 16 сен 2011, 10:15 ]
Заголовок сообщения:  Архитектура памяти и сегметов. как?

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

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

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

Автор:  Himik [ 16 сен 2011, 13:17 ]
Заголовок сообщения:  Re: Архитектура памяти и сегметов. как?

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

Автор:  qeos [ 16 сен 2011, 14:09 ]
Заголовок сообщения:  Re: Архитектура памяти и сегметов. как?

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

Автор:  phantom-84 [ 16 сен 2011, 14:50 ]
Заголовок сообщения:  Re: Архитектура памяти и сегметов. как?

Зачем нужны сегменты данных 0-N?

Автор:  qeos [ 16 сен 2011, 14:56 ]
Заголовок сообщения:  Re: Архитектура памяти и сегметов. как?

phantom-84 писал(а):
Зачем нужны сегменты данных 0-N?

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

Автор:  Himik [ 16 сен 2011, 16:28 ]
Заголовок сообщения:  Re: Архитектура памяти и сегметов. как?

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

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

Автор:  phantom-84 [ 16 сен 2011, 16:33 ]
Заголовок сообщения:  Re: Архитектура памяти и сегметов. как?

qeos писал(а):
есть желаение сделать громадный монолит..
Не уловил связи...

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

Автор:  qeos [ 16 сен 2011, 16:48 ]
Заголовок сообщения:  Re: Архитектура памяти и сегметов. как?

да, наверно правильнее использовать разные PageDirectory для разных сегментов..
в самом простом варианте я подумал сделать следущее:

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

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

Автор:  Himik [ 16 сен 2011, 18:07 ]
Заголовок сообщения:  Re: Архитектура памяти и сегметов. как?

Можно и без плясок, но использовать 64-битный режим. Правда там сегментов нет...
Или обходись небольшими сегментами в 32-битном режиме.

Автор:  phantom-84 [ 16 сен 2011, 20:46 ]
Заголовок сообщения:  Re: Архитектура памяти и сегметов. как?

qeos писал(а):
да, наверно правильнее использовать разные PageDirectory для разных сегментов..
в самом простом варианте я подумал сделать следущее:

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

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/