Странная вещь... Вот, читаю амд64мануал, и нигде не могу найти ответы на вопросы: 1)какие есть ограничения на кол-во значащих битов вирт.адреса в различных реализациях x86-64? 2)есть ли какойнить нетупой способ определить кол-во этих самых битов на данном компе? (нетупой-значит не проверяя разные адреса на #gp) 3)если эта битность составляет, например, 40 значащих бит, то где будет в pml4 ссылка на соответствующий pdp для, например, такого адреса {24 единицы знакового расширения}{1 шт. значащая единица}{39 значащих нулей}: в элементе 0x1ff или в #1? 4)зачем старшие биты забиваются знаком, а не нулями?.. можно,конечно,предположить, что в целях отделения ядра от пользовательских прог, только мне это кажется перебором, ибо если забивать нулями, эффект тот же, разве что не так красиво и симметрично, но при этом, например, как-то проще создавать системы, не разделяющие ядро и userspace так явно... или я просто не могу сообразить как это сделать с учетом данного изврата... мб, вряд ли, конечно, после 0xffff..ffff идет 0x0000..0000 ...
максимум 64 Код (Text): mov eax, 0x80000008 cpuid shr eax, 8 and eax, 255 ; в EAX - количество значащих бит линейного адреса 0x1FF если 39-ый бит - 1, иначе - 0x1
спасибо вопрос только по первому пункту еще.. насчет макс.ограничения, там кажется доступно макс. 48 бит: по 9 бит на индексы в pml4,pdp,pd,pt и 12 бит смещение в странице. или я не прав? меня же больше интересует сколько бит гарантированно значащие, то есть какой объем виртуальной памяти предоставлен любой реализацией архитектуры
да много тут уже от оси больше зависит кажись) столько памяти на десктоп не ставят, зачем тебе так много? если глянуть табличку 3-24 которая называется IA-32e Mode Paging Structures (4-KByte Pages), то можно увидеть: 512 PML4 *512 PDPTE ∗ 512 PDE ∗ 512 PTE = 2^36 Pages это для 4К ниже табличка а для 2х мегобайтных страниц там их 2^27 Pages да в той же табличке всё и расписано даже нарисовано лучше там посмотреть чем тут на форуме вырисовывать) ну дык это для удобства слаживания \ вычитания
мне надо стока виртуальной памяти, чтоб каждая отдельная pml4,pdp,pd и pt была по фикс. виртуальному адресу, чтоб можно было быстро получить доступ к любой таблице А вот в физ память будут отображаться токо те, которые содержать что-нить кроме нулей нет такой таблички в моем мануале( она нашлась в мануале по пень4, но там ниче не упоминается про canonical form а в мануале от амд написано, что тут упоминаются реализации, поддерживающие меньше 64 бит, а 4х-уровневая система page mapper'ов поддерживает не больше 48 бит вирт. адреса, причем судя по упомянутому рисунку в мануале от интела и по рисункам в амд их _ровно_ 48. это я во что-то не врубаюсь, или просто придираюсь по мелочам?
IA-32e архитектура предусматривает возможность использования максимум 64-х разрядов для представления линейного адреса конкретная имплементация архитектуры (скажем EM64T) предусматривает 48 разрядов для этого см. пример определения количества значащих разрядов но всегда будет как минимум 32 разряда для этого можно использовать концепцию self-mapping т. е в каждой таблице последний элемент использовать для хранения физического адреса самой таблицы тогда по адресу 0xFFFFFFFFFFFFF000 будет доступна PML4T по адресу 0xFFFFFFFFFFE00000 | (P << 12) будет доступна PDPT с индексом P в PML4T и т. д