#operating-system #x86-64 #tlb
#операционная система #x86-64 #tlb
Вопрос:
Возможно ли предоставить физический адрес для данного виртуального адреса напрямую в TLB на архитектурах x86-64 в длительном режиме?
Например, допустим, я помещаю нули в PML4E, поэтому будет вызвано исключение ошибки страницы, потому что будет найден недопустимый адрес, во время исключения может ли процессор сообщить TLB с помощью какой-либо инструкции, что этот виртуальный адрес находится в X кадре физической страницы?
Я хочу сделать это, потому что по коду я могу легко определить, где будет находиться физический адрес, и таким образом избежать дорогостоящего обхода страниц.
Комментарии:
1. Как вы узнаете, в каком фрейме будет адрес? Разве это не случайно каждый раз?
2. Это будет дорого, только если вы будете делать это программно, а не аппаратно (TLB), тратя много циклов на сохранение и восстановление регистров процессора и управление некоторыми другими структурами данных ядра на пути к обработчику исключений и обратно.
Ответ №1:
Нет, вам нужно поместить страницу в TLB. Чтобы быть точным, вам необходимо создать / обновить соответствующий PTE (с PDE и PDPE, если необходимо). Все, что связано с управлением MMU, каким-то образом основано на таблицах страниц и TLB. Даже режим защиты пользователя / супервизора выполняется как специальный флаг отображаемой страницы.
Почему вы думаете, что «просмотр страницы» — дорогостоящая операция? Это совсем не дорого. Чтобы определить PTE, который необходимо обновить, вам нужно разыменовать только 4 указателя: PML4E -> PDPE -> PDE -> PTE. Эти записи являются просто индексами в связанных таблицах. Чтобы получить PML4E, вам нужно использовать 39-47 бит адреса, полученного во время обработки ошибок страницы, и использовать значение в качестве индекса в таблице PML4. Чтобы получить PDPE, вам нужно 30-39 бит адреса в качестве индекса в таблице PDE и так далее. Это не то, что может замедлить работу вашей системы. Я думаю, что выделение физической страницы занимает больше времени, чем это.
Комментарии:
1. Если вы храните адреса физических страниц в стеке, поиск бесплатной страницы обходится максимально дешево. Если вы сделаете одну точку PDE обратно в PD (в оригинальной схеме 80386 2-уровневой PD / PT или аналогично в более глубоко вложенных схемах, доступных на Pentium), отображение и разархивирование страницы также становится очень быстрым.
2. @Dan Kruchinin Если бы у меня был способ сообщить TLB физический адрес, я бы скопировал его напрямую из регистра DS. Это займет несколько циклов. Но разыменование 4 указателей займет около 200 нс на доступ к DRAM это приведет к удалению ваших данных из кэша. Теперь, представьте, приложение считывает страницы 4K случайным образом ….. MMU — очень неэффективный способ адресации памяти, и, как я вижу, от него невозможно избавиться….
3. @Nulik: Я не уверен, что понимаю, что вы пытаетесь сделать. В процессорах есть кэши TLB, поэтому они не постоянно разыменовывают 4 указателя. Более того, после кэширования PTE вы вообще не получаете исключения (что дорого!).). Кроме того, MMU обращается к памяти только для своей конфигурации, а не к ALU / регистрам процессора (на самом деле это далеко от них).).