RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : С очеpедным наступающим ;)


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : Igor Vaskov
To : Slavik Gnatenko
Subj : С очеpедным наступающим ;)

> > А почему ж тогда стоны по необходимости старого биоса? Куда уходят программные прерывания? Тот же INT 10, INT 13?
> > Я как бы не спец совсем. Но по моему ощущению command.com очень даже 16-и битный. И исполняется вроде как не в эмуляторе. Или я ошибаюсь?
> > Расскажи в двух словах, как на самом деле?
> Судя по вопросам, тут в двух словах не получится, а нужно начинать с начала времён IBM PC, т.е. 80-90х годов :)
>
> В начале вышел PC на процессоре 8086 (или совместимых, например, 8088). На этом процессоре код использует 16:16 адресацию и формирует физический адрес (тот, который на шину уходит), сдвигая первые 16 бит (т.н. сегмент) на 4 бита влево и добавляя к этому вторые 16 бит (т.н. смещение). В итоге получаем 16:16 бит т.н. виртуального адреса и 20 бит физического (пресловутый первый мегабайт). Такой режим называется real mode.
>
> Дальше выпустили PC/AT на 80286. У процессора появился второй режим работы: protected mode. Виртуальный адрес остался 16:16, но физический стал формироваться совсем иначе. Старшую часть адреса обозвали селектором сегмента и она стала использоваться не напрямую, а, как индекс в таблице дескрипторов сегментов (GDT, LDT). А уже в дескрипторе сегмента лежит базовый физический адрес, к которому прибавляется смещение. Базовый адрес имеет разрядность 24 бита, что уже позволяет адресовать 16 MiB физпамяти, но всё ещё кусочками по 64 KiB (потому, что смещение 16 бит). Плюс добавилась система прав, почему режим и называется protected, но не будем углубляться. Таким образом в процессоре стало два 16 бит режима: RM и PM16. В PM16 работала OS/2 1.x и её приложения. В общем, неплохой режим для своего года но очевидно, что DOS в нём работать уже не может, поэтому ОС, где хотелось давать пользователю запускать и досовые приложения, для них переключались в RM. Конечно, про мультизадачность и защищённость на время работы досового приложения можно было забыть, но пользователь лучше хоть так, чем полностью перегружаться в DOS.
>
> А дальше произошла революция: 80386. В нём добавилось сразу два режима: PM32 и VM86. PM32 - это расширение PM. В дескрипторе стало можно поставить флажок, что это 32 бит сегмент, и если процессор исполняет код из этого сегмента, то у него виртуальный адрес становится не 16:16, а 16:32. Базовый адрес в дескрипторе расширили тоже до 32 бит и технически все эти 32 бит физадреса стало можно использовать без переключения селектора. Поэтому в PM32 обычно используется т.н. flat, когда базовый адрес сегмента равен нулю. К этому приложили ещё один уровень преобразования: страничный. Теперь сложение базового адреса и смещения - это не сразу физический адрес, а линейный, который потом через таблицу страниц пересчитывается в физический. Таким образом каждый процесс стал располагать своим 4 GiB пространством линейных адресов. Ну и вишенкой на этом торте стал VM86. Это тоже, формально, PM и тоже 16 бит, но третий вид :) В нём виртуальный адрес в линейный пересчитывается по правилам RM, но получается уже линейный, который на физику можно мапить каждому процессу в отдельное место и запускать несколько досовых задач одновременно. Кроме того, поскольку это таки PM, в нём работают обычные механизмы защиты и через них ОС может виртуализовать "железо", которое видит DOS, в любой желаемой степени.
>
> Теперь, наконец-то, можно отвечать на исходный вопрос. command.com работает в VDM процессе. Процессор в это время использует VM86. Безусловно, это 16 бит, но тут 16 бит - это требование DOS и без них никак. Да и не нужно, в общем-то. Это железная эмуляция RM и она работает максимально быстро. Для эмуляции ресурсов кроме оперативной памяти процессор исключением вылетает в ядерный уровень ОС: монитор V86 и VDD. Тут всё PM32. Дальше зависит от полноэкранности сессии. Если сессия в окошке, то у неё видео и клавиатура реализованы в pmmerge, т.е. тоже в PM32 (возможно, в промежутке есть чутка PM16, но не много и проблем оно не доставляет). int 13h для флопа, конечно, в любой сессии направляется в реальный биос, но уже тоже выполняемый в VM86, т.е. многозадачности и защищённости не очень угрожает. Для полноэкранной сессии задуман минимум эмуляции, чтобы DOS работал с одной стороны максимально быстро, а с другой, чтобы мог использоват даже такие возможности железа, которые в окошке не эмулируются. Там int 10h уже тоже идёт на реальный биос и к регистрам видеокарты можно лазить напрямую (хотя видеоподсистема эти вещи и мониторит, чтобы восстановить регистры, когда переключаемся в другую сессию, а потом назад). Тут много PM16 кода, но не сказать, чтобы это была прям проблема и что-то станет лучше, если его переписать на PM32. В любом случае DosBox не корректно сравнивать с FS VDM потому, что DosBox не даёт доступа к реальному железу и биосу. DosBox - это замена оконной VDM, где эмулируется всё, но вот как раз там в софтовой части эмуляции 16 бит если и попадается, то очень мало и не заметно.

Благодарю за понятный рассказ "от сотворения мира" ))) Я достаточно стар, чтобы помнить самое начало в деталях. Но уже к 386 от ассемблера отошёл и деталей реализации VM86 не помню.

А моя нелюбовь к 16-и битам связана с тем, что я вроде как читал, что невозможно совмещать 64 бита и 16. Я так понял, что VM86 в 64 битном режиме не возможен. Я конечно понимаю, что Оси до 64 бит, как до Китая. Но хотелось бы хотя-бы лежать в этом направлении.


Sun 09 Jan 2022 13:37 Mozilla/5.0 (OS/2; Warp 4.5; rv:45.0) Gecko/20100101 Firefox




Programmed by Dmitri Maximovich, Dmitry I. Platonoff, Eugen Kuleshov.
25.09.99 (c) 1999, RU/2. All rights reserved.
Rewritten by Dmitry Ban. All rights ignored.