pavia писал(а):
Адреса бывают разные:
- физические
- виртуальные
- линейные
Так вот почему бы не иметь функции для преобразования из одних в другие?
Зачем? Ну метод у меня разработки с низу вверх. Вначале делаю низкоуровневые примитивы потом из них собираю более сложные вещи.
В целом не особо нужны.
К примеру нам надо скопировать данные и одного процесса в другой. Пусть к примеру мы загружаем некоторый исполняемый файл exe. Используем функцию ProcessWrite.
Тогда нам достаточно отобразить часть страниц из адресного пространства второго процесса в в адресное пространство первого или если это делает ядро то в его пространство.
Для этого нам нужно знать физические адреса. А так как ядро работает с линейными или виртуальными адресами, то и нужно сделать преобразование линейных в физические адреса.
Все это делается в рамках других функций, связанных не только с физическими страницами. Тут нужны и блокировки, и разделение страниц, и работа с регионами (я не использую отдельные структуры для хранения свойств каждой распределенной страницы; используются только табличные входы и дескрипторы регионов). Сам список физических адресов страниц можно получить из таблицы страниц процесса после блокировки соответствующего региона.
Actium писал(а):
Насколько я понимаю, системе индифферентно, что там у пользователя в памяти хранится. В таком случае зачем ей копировать данные из одного ВАПа в другой? Наверное, речь о чем-то другом?
А как размножать код между процессами, если он требует релокации? С диска тащить? Как реализовать механизм Copy-On-Write? Даже просто для разделения памяти нужно получать физические адреса уже распределенных страниц, чтобы отображать их в другие ВАП.
Цитата:
Преобразование виртуальных адресов в физические делает процессор (ну, или какой-нить блок, не суть). Зачем еще и ядро обучать этому?
Тут имелось в виду получение списка физ. адресов.