OSDev

для всех
Текущее время: 21 июн 2018, 13:17

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: 24 окт 2010, 10:18 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Всем доброго утра!

Моя задача: разобраться в работе процессора и написать операционную систему для длинного режима (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 элементов, описывающих всё адресное пространство? А то ведь тогда страничка будет обращаться не к оперативной памяти (ОЗУ), а к памяти какого-нибудь устройства. Так ведь?

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

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

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 окт 2010, 11:32 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1344
Откуда: Зеленоград
Читайте умные книги, например, Танненбаума; перепечатывать же главы из них на форуме никто не будет.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 окт 2010, 12:23 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Вот как осуществлять переход то со страницами на код уже другой страницы, если программа пользователя не знает ничего об страничках и думает что всё плоское:

Изображение

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

Изображение

Поясните, пожалуйста, как же идёт такое формирование. Ведь при разработке 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 так не используется. Там мы же пишем программы как будто для сегментов (ничего не учитываем для страниц). Как же это так получается?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 окт 2010, 19:59 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1055
Откуда: Балаково
s3dworld писал(а):
Поясните, пожалуйста, как же идёт такое формирование. Ведь при разработке Windows программ на ассемблере, мы ведь не указываем никаких страниц с которыми будем работать.

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

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

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


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

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


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

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


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

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