vak: (Улыбка)
Serge Vakulenko ([personal profile] vak) wrote2013-01-28 12:04 pm

О чем говорят инженеры

Выдержки из дискуссии:
Chris Rowen, CTO at Tensilica;
Andrew Caples, senior product manager at Mentor Graphics;
Drew Wingard, CTO at Sonics;
Larry Hudepohl, vice president of hardware engineering at MIPS;
Barry Pangrle, senior power methodology engineer at Nvidia.

"There are examples of chip companies that were started to do some very clever things, but they never got off the ground because no one could figure out how to develop the software. It’s easy to build embarrassingly parallel hardware that is programmable, but building a software environment that people are willing to use is a different matter."

Как бы вдогонку к обсуждению Мультиклета.
(deleted comment)

[identity profile] oboguev.livejournal.com 2013-01-28 11:32 pm (UTC)(link)
Вы же и говорите в заглавном комментарии: "коммерческая операционная система".

Вот, пожалуйста: OpenVMS использует 4 кольца и требует 15 уровней защиты страницы.
В Itanium-е это есть (и больше, с добавкой доступа Execute), а в x86 -- нет.
OpenVMS работает на IA64, а на x64 -- ее не переносили, разумеется не по этой причине, но если бы встал вопрос о переносе, то отсутствие поддержки 4 колец защиты виртуальной памяти стало бы значимым техническим препятствием.
(deleted comment)

[identity profile] oboguev.livejournal.com 2013-01-29 02:32 am (UTC)(link)
Ну и, нельзя виртуальную память точно так же организовать на базе сегментов, как на базе страниц.
Либо количество страниц в виртуальном пространстве получится ограниченным, либо страницы большими и wasteful.
Хуже же всего, что void* окажется 128-битным типом, и адресация к каждому элементу памяти будет медленной из-за необходимости постоянных перезагрузок сегментных регистров.
И наконец, last but not least, в х86/х64 с помощью сегментных регистров можно задать защиту KW, EW, SW и UW, но не UR или URKW.
(deleted comment)

[identity profile] oboguev.livejournal.com 2013-01-29 02:50 am (UTC)(link)
Фиксированность размера страницы определяется необходимостью иметь manageable paging algorithms.
Указатель должен быть адресовать всё адресное пространство, приключения с разными категориями указателей никому не нужны.
Указатели данных могут приходить из самых разных, наперед неизвестных сегментов, поэтому перегрузка сегментного регистра потребуется практически перед каждой инструкцией или, в лучшем случае, коротким блоком инструкций. Поскольку же выяснится, что данные могут также пересекать границы сегментов-страниц, то реально проверка на переполнение указателя потребуется при каждом обращении с индексацией или инкрементом или попросту при возможности того, что поле атомарного типа пересечет границу сегментов. См. FAR-указатели в 16-битном Windows.
(deleted comment)

[identity profile] oboguev.livejournal.com 2013-01-29 05:34 am (UTC)(link)
То, что вы описываете -- это система без виртуальной памяти с ручной организацией подкачки. Всё это можно делать и раньше делалось (оверлеи кода и данных и т.д.), но это никому не нужно.

Как только вводится виртуальная память, возникает агностическое разбиение ядром адресного пространства на страницы фиксированного размера, реализация которых с помощью сегментов x86 ведёт ко всем перечисленным последствиям.

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

Сегменты нарезал пейджер.

[identity profile] oboguev.livejournal.com 2013-01-29 02:56 am (UTC)(link)
> Фиксированность размера страницы определяется необходимостью иметь manageable paging algorithms.

И, конечно, собственно вообще иметь paging.

[identity profile] oboguev.livejournal.com 2013-01-29 02:38 am (UTC)(link)
Опечатка:
И наконец, last but not least, в х86/х64 с помощью сегментных регистров можно задать защиту (K/E/S/U)(R/W), но не напр. URKW.

[identity profile] mandrykin.livejournal.com 2013-01-29 02:20 am (UTC)(link)
> Виртуальную память можно точно так же организовать на базе сегментов, как и на базе страниц. Сложнее? Да! Гибче? Несомненно!


Как удивительно это пересекается с тем, над чем сейчас думаю. На базе сегментов вполне можно организовать страничную память. В некотором роде "костыль", но при этом обработчик исключения по нарушению границы сегмента может эмулировать страницы любого размера. Т.е. даже на такой схеме можно получить некоторый выигрыш.
(deleted comment)

[identity profile] mandrykin.livejournal.com 2013-01-29 02:37 am (UTC)(link)
Может быть, но есть вопросы.

Какие системы организуют страничную память на основе сегментов? Какой в этом смысл для секцмй .text и .data, если каждую из них всегда можно описать одним сегментом? Интересная картина могла бы получиться для стека и кучи - но на x86 это дорого и громоздко.


(deleted comment)

[identity profile] mandrykin.livejournal.com 2013-01-29 03:05 am (UTC)(link)
> Скажем, в самом простом случае каждая функция помещается в свой сегмент.

Это не даст никаких преимуществ, а лишь убьёт производительность. Фишка как раз в том, чтобы на основе сегментов реализовать страничную память там, где она больше всего нужна - стек и куча. Размер стека и кучи - динамический. Увеличивать, наращивая границы сегмента, не получится - рано или поздно сегмент упрётся в другой сегмент. Менеджер памяти мог бы "тасовать" сегменты, создавая иллюзию непрерывного адресного пространства.

(deleted comment)

[identity profile] mandrykin.livejournal.com 2013-01-29 03:37 am (UTC)(link)
На x86 это интересно разве что в академических целях, как демонстрация возможностей. Скорости это никак не прибавит, потому что в "аппаратной" страничной реализации участвует TLB. Программная эмуляция в любом случае будет медленнее - переключение сегментов по исключениям будет сильно тормозить.

А вот что касается уровня привелегий - то они как бы и не нужны вовсе. Вполне достаточно прав rwx на виртуальную страницу для организации защищённой системы. Уровень привлегий - лишняя сущность. Защита на уровне страниц вполне покрывает все нужды. Пожалуй, единственное исключение из этого утверждения - это средства виртуализации. Тут бы хватило два уровня привелегий - гипервизор и всё остальное.
Edited 2013-01-29 03:40 (UTC)
(deleted comment)

[identity profile] mandrykin.livejournal.com 2013-01-29 11:11 am (UTC)(link)
Вполне благородная. Но c помощью прав страниц это делается легко.
(deleted comment)

[identity profile] mandrykin.livejournal.com 2013-01-29 05:49 pm (UTC)(link)
А что может случиться страшного, если процессор начнёт исполнять данные? Вряд-ли он успеет навредить системе или другому процессу, прежде чем наткнётся на несуществующую команду или обратится по неправильному адресу. Самое страшное, что может случиться - завснет в бесконечном цикле.

Одним битом можно обойтись. Если неправильный адрес, то страницы просто не существует. Чтение разрешено всегда, а бит определеяет разрешёную операцию - исполнение или запись страницы. Всё же правильнее разделять чтение и исполнение, но если архитектура не поддерживает, то обойтись можно.