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