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 для разных сегментов.. На 32-разрядной архитектуре такое невозможно. Нужно по очереди загружать отдельные фрагменты файла в одну и ту же память или использовать PAE и переключаемые банки памяти.
в самом простом варианте я подумал сделать следущее: есть нечто монолитное.. т.е. все выполняется в одном и томже адресном пространстве.. вот к примеру надо загрузить файлик 4Gb.. создается дескриптор в GDT данных... в который прогружается этот файл.. (я знаю что такое кеширование, но пока тут оно не нужно.. т.к. утрирую задачу).. соответственно работа идет через регистр DS.. а к этим данным обращение через GS.. |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |