Здравствуйте, alexraynepe196, Вы писали:
A>MMU современных процессоров с другой стороны просто предназначено для решения подобных задач — достаточно создать несколько сегментов данных — по одному на каждое устройство, и переключать эти сегменты при исполнении одного общего сегмента кода. Но как это сделать реально? A>Вродебы это операционная система проделывает при использовании разделяемой библиотеки для разных процессов. НО как это сделать в рамках одного процесса? Это вообще реально в существующей среде, на линухе?
Нет, потому что MMU работает с контекстами виртуальных адресных пространств. Транслируя адреса из нескольких совершенно разных адресных пространств в одно пространство — реальные адреса физических страниц памяти.
Выполняется это посредством ассоциативного кэша в виде TLB (который как правило ещё и двух-уровневый).
Т.е. средства ОС не помогут в данном случае избежать необходимости ломать реализацию проблемной библиотеки — таки придётся её переделывать.
Чтобы библиотека в явной форме позволяла управлять контекстами — теми экземплярами объектной модели (областями данных), которые предоставляет для изменения клиентским кодом.
Фактически исполняемому коду библиотеки надо будет принимать некий токен/хэндл, являющийся индексом в таблице контекстов.