OSDev
http://osdev.su/

Проясните понимание адресной памяти для страничек
http://osdev.su/viewtopic.php?f=5&t=345
Страница 1 из 1

Автор:  s3dworld [ 24 окт 2010, 10:18 ]
Заголовок сообщения:  Проясните понимание адресной памяти для страничек

Всем доброго утра!

Моя задача: разобраться в работе процессора и написать операционную систему для длинного режима (L-Mode) работы процессора. Но прежде чем переходить к длинному режиму (L-Mode), следует разобраться в защищённом режиме (P-Mode) и в естественное в режиме реальных адресов (R-Mode).

С режимом реальных адресов (R-Mode) я разобрался. Теперь меня мучают вопросы, связанные с оперативной памятью (ОЗУ) и со страничной организацией памяти.

Пока не рассматриваю длинный режим (L-Mode) работы процессора, так как не разобрался ещё в защищённом режиме (P-Mode) - то есть пока у меня адресная память имеет предел в 4 ГБ. Так вот, под все эти 4 ГБ под оперативную память (ОЗУ) отводится только определённая часть адресов (эта часть большая, по сравнению с другими).

Слышал я что через функции BIOS можно определить какие диапазоны адресов доступны для оперативной памяти (ОЗУ). Но вот что меня мучает: если через BIOS мы можем определить, то это только в режиме реальных адресов (R-Mode) или в режиме совместимости (V-Mode). А как же определить диапазон адресов для оперативной памяти (ОЗУ) на 4 ГБ адресном пространстве? А на 16777216 ТБ адресном пространстве?

И как вообще дело обстоит со страничной адресацией, ведь тут же нужно учитывать адреса, отведённые под оперативную память (ОЗУ)? Ведь глупо просто взять и заполнить все странички (одна страничка будет у меня на 4 МБ) в одноуровневой таблице из 1024 элементов, описывающих всё адресное пространство? А то ведь тогда страничка будет обращаться не к оперативной памяти (ОЗУ), а к памяти какого-нибудь устройства. Так ведь?

Что я хочу понять, так это алгоритм как делать. Нужно странички описывать только лишь на адреса, отведённые для оперативной памяти (ОЗУ). Так ведь? Это я имею в виду для программ пользователя. А для программ операционной системы (ОС) можно составить странички для видеопамяти и прочих устройств. Всё так? И потом странички прикладных программ (программ пользователя) выгружать и подгружать. А странички с программами операционной системы (ОС) и памяти устройств - постоянно держать в памяти.

Это тут мои доводы, вариантов кучу. Хочу услышать Ваше мнение.

Автор:  SII [ 24 окт 2010, 11:32 ]
Заголовок сообщения:  Re: Проясните понимание адресной памяти для страничек

Читайте умные книги, например, Танненбаума; перепечатывать же главы из них на форуме никто не будет.

И кстати, операционная система недаром называется системой: это не просто набор отдельных компонентов; её различные функции весьма тесно увязаны между собой, и без понимания картины в целом создать ОС невозможно в принципе (невозможно сначала придумать и написать менеджер памяти, потом менеджер ввода-вывода, потом планировщик и т.п.). Проектировать надо всё сразу, чтобы всё было увязано в систему, и лишь затем программировать (кодировать, если угодно) отдельные компоненты по уже готовому проекту. Естественно, в процессе программирования и сам проект будет несколько меняться, поскольку всего не учтёшь, однако при грамотном проектировании эти изменения не будут носить глобального характера (фактически это будут не изменения, а уточнения).

Автор:  s3dworld [ 25 окт 2010, 12:23 ]
Заголовок сообщения:  Re: Проясните понимание адресной памяти для страничек

Вот как осуществлять переход то со страницами на код уже другой страницы, если программа пользователя не знает ничего об страничках и думает что всё плоское:

Изображение

И если не делать переходы, а код сам выполняется и как тогда будет идти переход от конца страницы до начало другой страницы, если же программа не знает о страничках:

Изображение

Поясните, пожалуйста, как же идёт такое формирование. Ведь при разработке Windows программ на ассемблере, мы ведь не указываем никаких страниц с которыми будем работать. Или же строгое ограничение, чтобы код не занимал больше 4 МБ?

Да я понимаю про исключения отсутствия странички в памяти подгрузку данных в этот страничный кадр. Понимаю я зачем нужна виртуальная память. Я не понимаю другого.

Пускай у меня будет код программы на 8 МБ данных. Если не использовать странички и использовать только лишь сегменты, то всё легко. Мы сделаем один сегмент с базой 0 и максимальным лимитом, со включённым битом гранулярностью. То есть опишем 4 ГБ данных. Загрузим по какому-нибудь смещение эти 8 МБ кода и передадим управление на начало кода. И код будет выполнять как плоская модель памяти, команда от команды (если нужно, то переходы от 0-3 МБ в 4-7 МБ). Мы сможем просто написать jmp и указать смещение.

А если включить страничное преобразование и каждую страничку представить как 4 МБ данных, то тут я уже не понимаю принципов работы. Я разделяю код от 0-3 МБ в страничку №1, а код от 4-7 МБ - в страничку №2. И вот выполняется последняя команда в страничке №1 и следом должна идти команда в начале страничке №2. Но как это так сделать?

Да и переходы идут так, что я указываю в 32-битном регистре индекс (10 бит) и смещение (22 бита), то есть определяю страничку и смещение в ней. А если я встречу в коде, который писался не зная ничего об программных особенностях операционной системы, который только работает со всей памятью, как с плоской - если я встречу команду дальнего перехода (больше 128), то получится неразбериха. Для плоской модели можно подумать что это 32-битное значение будет определять смещение в сегменте, а для страничной организации памяти - будет определять страничку и смещение в ней.

Так вот и получается, что мне на у меня только один выход - проектирование программ так, чтобы разработчик уже знал какие данные в какой страничке окажутся и обращался именно к страничкам.

Но ведь в том же Windows так не используется. Там мы же пишем программы как будто для сегментов (ничего не учитываем для страниц). Как же это так получается?

Автор:  Himik [ 25 окт 2010, 19:59 ]
Заголовок сообщения:  Re: Проясните понимание адресной памяти для страничек

s3dworld писал(а):
Поясните, пожалуйста, как же идёт такое формирование. Ведь при разработке Windows программ на ассемблере, мы ведь не указываем никаких страниц с которыми будем работать.

Очень даже указываем -- конкретный рабочий адрес. Под этот адрес ОС и формирует виртуальные страницы при запуске.

По поводу смежных страниц, нет ни каких проблем. Команда процессора может пересекать смежные страницы без всяких проблем. Смежные страницы являются линейным адресным пространством. Они продолжают друг друга, и можно рассматривать 2 смежные 4МБ страницы как одну единую 8МБ страницу, а 4 смежных страниц можно считать 16МБ страницей (с точки зрения приложения). Так же, как ты не задумываешься от пересечении 2МБ границы внутри 4МБ страницы.

В целом всё строится так, чтобы страничная адресация была прозрачна для приложения. Она является как бы внутренней логикой процессора.

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