e820 int 15 карта памяти при наличии 3-х и более ГБ ОЗУ

Тема в разделе "WASM.OS.DEVEL", создана пользователем GLEB, 24 мар 2011.

  1. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    Добрый день!
    Заметил что Memtest86+ при тестировании памяти свыше 2-х гб, тестирует ее кусками
    например 4 гб
    184K-2048M (~2GB)
    2048M - 3096M (~1GB)
    4096M - 5120M (~1GB)

    в диапазоне 3096-4096 находится зарезервированная память.
    об этом также сообщает функция E820 биос (мемтест так же берет информацию из этой функции)

    А как обратиться к участку 4096M - 5120M адреса которого находятся за пределом 4-х ГБ из защищенного режима?

    Ковырял исходники мемтеста, но так и не понял, при получении информации из e820 начало и размер блока памяти сохраняет в long long переменной, функции тестирования обращаются уже к 4-х байтовым переменным.

    GDT имеет следующий вид:
    Код (Text):
    1. gdt:
    2.     .word   0,0,0,0     # dummy
    3.  
    4.     .word   0,0,0,0     # unused
    5.  
    6.     .word   0x7FFF      # limit 128mb ;<------------   ПОЧЕМУ ЛИМИТ СЕГМЕНТА ВСЕГО 128 MB???
    7.     .word   0x0000      # base address=0
    8.     .word   0x9A00      # code read/exec
    9.     .word   0x00C0      # granularity=4096, 386
    10.  
    11.     .word   0x7FFF      # limit 128mb
    12.     .word   0x0000      # base address=0
    13.     .word   0x9200      # data read/write
    14.     .word   0x00C0      # granularity=4096, 386
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    GLEB
    Либо включать страничную адресацию и разбираться с PAE
    Как второй вариант перейти в длинный режим. Там вам будет все 64ГБ адресного пространства доступны.
     
  3. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    Код (Text):
    1. Либо включать страничную адресацию
    Memtest получается исрользует страничную адресацию?

    Покопался еще нашел такой код:

    Код (Text):
    1. unsigned long long start; //тут получается данные из e820
    2. unsigned long long end;
    3.  
    4. ...
    5.  
    6. v->pmap[n].start = (start + 4095) >> 12; // вот это преобразование мне пока непонятно
    7. v->pmap[n].end = end >> 12;
    8.  
    9. //v->pmap[n].start и v->pmap[n].end уже unsigned long