Страничная адресация x64 PXE PPE PDE PTE

Тема в разделе "WASM.X64", создана пользователем DeRekX, 26 апр 2009.

  1. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    Всем, добрый день.

    Прохожу по всем структурам, получаю дамп, ниже исходник.

    Всё делаю по мануалу 3A (http://download.intel.com/design/processor/manuals/253668.pdf).
    Цитатка из мана
    я предположил, то знаковое расширение получается так:
    Если старший бит itmpPXE =0, то это расширение нулевое, иначе забивается FFFF.
    Но это неверно, потому что есть адреса ffff000000008ff8

    Не могу разобраться, как с генерировать биты адреса с 63-48.
    Подскажите, пожалуйста.

    Код (Text):
    1.     __int64 itmpPXE = 0;
    2.     __int64 itmpPPE = 0;
    3.     __int64 itmpPDE = 0;
    4.     __int64 itmpPTE = 0;
    5.  
    6.     PVOID copypage  = ExAllocatePool ( NonPagedPool , _2M );
    7.  
    8.     for (ULONG i = 0 ; i < PXE_PER_PAGE ; i++ )
    9.     {
    10.         if (X64_PXE_ARRAY[i].pnpe.P)        {      
    11.            
    12.             itmpPXE = static_cast<__int64>(i)<<PXI_SHIFT;
    13.             if (itmpPXE >= 0x0000800000000000 )                              
    14.             {
    15.                 itmpPXE = 0xFFFF000000000000 + itmpPXE;
    16.             }
    17.             //DbgLogMsg(StructSystem,  "%.16I64X\r\n" , itmpPXE );
    18.             for (ULONG ii = 0 ; ii < PPE_PER_PAGE ; ii++ )
    19.             {
    20.                 if (X64_PPE_ARRAY[ii].pnpe.P)
    21.                 {
    22.                     itmpPPE = ii<<PPI_SHIFT;
    23.                     //DbgLogMsg(StructSystem,"\t%.16I64X\r\n" ,  itmpPPE );
    24.                     for (ULONG iii = 0 ; iii < PDE_PER_PAGE ; iii++ )
    25.                     {                          
    26.                         if (X64_PDE_ARRAY[iii].pnpe.P)
    27.                         {
    28.                             itmpPDE = iii << PDI_SHIFT;
    29.                             ULONG ps = X64_PDE_ARRAY[iii].pnpe.PS;
    30.                             if ( ps == 0) /* 4Kb */
    31.                             {                              
    32.                                 for (ULONG iiii = 0 ; iiii < PTE_PER_PAGE ; iiii++ )
    33.                                 {                                  
    34.                                     if (X64_PTE_ARRAY[iiii].pnpe.P)
    35.                                     {
    36.                                         itmpPTE = iiii << PTI_SHIFT;
    37.                                         if (safecopy(copypage,(PVOID)(itmpPXE + itmpPPE + itmpPDE + itmpPTE),_4K))
    38.                                         {
    39.                                             DbgLogMsg(StructSystem,"\t\t\t%.16I64X-%.16I64X(4kb)\r\n" ,
    40.                                                 itmpPXE + itmpPPE + itmpPDE + itmpPTE ,
    41.                                                 itmpPXE + itmpPPE + itmpPDE + itmpPTE + _4K );
    42.                                             DbgLogMsgSaveBuf(DataSystem,copypage,_4K);
    43.                                         }                                      
    44.                                        
    45.                                     }
    46.  
    47.                                 }
    48.                             }
    49.                             else /* 2Mb */
    50.                             {
    51.                                 if (safecopy(copypage,(PVOID)(itmpPXE + itmpPPE + itmpPDE),_2M))
    52.                                 {
    53.                                     DbgLogMsg(StructSystem,"\t\t%.16I64X-%.16I64X(2mb)\r\n" ,
    54.                                         itmpPXE + itmpPPE + itmpPDE,
    55.                                         itmpPXE + itmpPPE + itmpPDE + _2M);
    56.                                     DbgLogMsgSaveBuf(DataSystem,copypage,_2M);
    57.                                 }
    58.                             }
    59.                         }
    60.                     }
    61.                 }
    62.             }
    63.         }
    64.     }
    65.     ExFreePool(copypage);
    66.     return;
     
  2. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    нули в биты 63-48 пробовал ставить?
     
  3. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    rpy3uH
    пробовал,выходит 300 килобайт

    но есть адреса, где в 63-48 выставлены FFFF
    их получается не копирую

    З.Ы. для 32 битной винды дамп контекста 4Гб составляет ~150 Мб, львиная доля это ядро.
     
  4. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    может я что-то не понял... в чём проблема-то заключается?
     
  5. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    Сначала опишу задачу: необходимо дампить полность память выбранного контекста используя страничную адресацию (PTE etc)
    Для 32 всё работает.

    При переводе на 64 устройство памяти другое, не понятно как получать первые 63-48 биты в адресе, все остальные биты находятся путём сдвига соответствующих индексов в таблицf[.

    А про 63-48 биты ничего путного не сказано, забивать их нулями - не дело, потому что часть памяти не дампиться.

    Проблема: как выбрать значения для 63-48 битов в адресе.
     
  6. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    биты 63-48 виртуального адреса вообще не учавствуют в формировании физического адреса, поэтому вроде как, по барабану что в этих битах.
     
  7. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    по мануалу выходит так.
    Но память по адресам отличается
    0x0000XXXXXXXXXXXX
    0xFFFFXXXXXXXXXXXX
     
  8. Ev0lwaves

    Ev0lwaves New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2008
    Сообщения:
    125
    0xFFFFXXXXXXXXXXXX - карты таблиц страниц, каталогов страниц и тд УРОВНЯ ЯДРА
     
  9. Ev0lwaves

    Ev0lwaves New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2008
    Сообщения:
    125
    всё что с 0xFFFF080000000000 - это память ядра кароче
     
  10. Ev0lwaves

    Ev0lwaves New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2008
    Сообщения:
    125
    соответсвенно 0x0000XXXXXXXXXXXX - user-land
     
  11. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    если я не ошибаюсь в Win64 если отбросить старшие 16 бит адреса, то всё равно user-mode и kernel-mode адреса не пересекутся.
    user-mode : 0 - 0x0000080000000000
    kernel-mode : 0xFFFF080000000000 - 0xFFFFFFFFFFFFFFFF
    т.е. адреса 0xFFFF060000001234 просто не существует.
     
  12. Ev0lwaves

    Ev0lwaves New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2008
    Сообщения:
    125
    rpy3uH
    да, по идее, адреса в диапазоне 0xFFFF080000000000 - 0xFFFF000000000000 не существуют
     
  13. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Некоторые считают AMD документацию правильнее/вернее/подробнее, чем у интела.
     
  14. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    Ev0lwavesrpy3uH
    Правильно, ли я понимаю
    0x0000000000000000 ..
    (0x0000080000000000-1) - user memory

    0xFFFF080000000000 ..
    0xFFFFFFFFFFFFFFFFF -kernel memory

    asmfan, спасибо за совет.
    Цитатка из Amd
    Что Amd имели ввиду, что такое canonical-address forms?
     
  15. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    вот из этого следует что
    user-mode 0 - 080000000000
    kernel-mode 080000000000 - FFFFFFFFFFFF
    просто отбрасываем старше 16 бит и всё
     
  16. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
  17. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    asmfan
    спасибо за ссылку, user memory копируется хорошо.
    Но на ядерной памяти падает, прям начале, может кто подробнее посмотрит, вроде всё так.
     
  18. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    Доработал, теперь нормально дампит, выпадает подсамый конец ядра)
    Отлаживаю на VirtualBox c XPx64, он падает в guru meditation.
    До падения размер дамп выходит разный: 300-600 Мб.
    Падает после 0xFFFFFFFFFFD00000.

    Код (Text):
    1. void print_pte_x64(ULONG StartOffset, ULONG FinishOffset)
    2. {
    3.  
    4.     unsigned __int64 pPXE = PXE_BASE;
    5.     unsigned __int64 pPPE = PPE_BASE;
    6.     unsigned __int64 pPDE = PDE_BASE;
    7.     unsigned __int64 pPTE = PTE_BASE;
    8.  
    9.  
    10.     unsigned __int64 i = 0;
    11.     unsigned __int64 ii = 0;
    12.     unsigned __int64 iii = 0;
    13.     unsigned __int64 iiii = 0;
    14.  
    15.     unsigned __int64 SizeofFile = 0;
    16.  
    17.     unsigned __int64 Address = 0;
    18.  
    19.     PVOID copypage  = ExAllocatePool ( NonPagedPool , _2M );
    20.  
    21.     PTable_4K_2M ptable_4K_2M   =   (PTable_4K_2M) ExAllocatePool( NonPagedPool, TABLE_4K_2M );
    22.     memset( ptable_4K_2M, 0, TABLE_4K_2M );
    23.  
    24. //  HANDLE handleStructFile = CreateFileAU(/*L"\\??\\C:\\Struct.txt"*/StructSystem);
    25. //  HANDLE handleDatatFile  = CreateFileAU(/*L"\\??\\C:\\Data.txt"*/DataSystem);
    26.  
    27.     for ( i = 0 ; i < 512 ; i++ )
    28.     {
    29.         if ( PX64_PE(pPXE + i*8)->pnpe.P )
    30.         {
    31.             for ( ii = 0 ; ii < 512 ; ii++ )
    32.             {
    33.                 if ( PX64_PE(pPPE + i*8*512 + ii*8)->pnpe.P )
    34.                 {
    35.                     for ( iii = 0 ; iii < 512 ; iii++ )
    36.                     {
    37.                         if (PX64_PE(pPDE + i*8*512*512 + ii*8*512 + iii*8)->pnpe.P)
    38.                         if (PX64_PE(pPDE + i*8*512*512 + ii*8*512 + iii*8)->pnpe.PS==0)
    39.                         {
    40.                             for ( iiii = 0 ; iiii < 512 ; iiii++ )
    41.                             {
    42.                                 if (PX64_PE(pPTE + i*8*512*512*512 + ii*8*512*512 + iii*8*512 + iiii*8)->pnpe.P)
    43.                                 {                                      
    44.                                     Address = static_cast<__int64>(i)<<PXI_SHIFT ;
    45.                                    
    46.                                     if (Address >= 0x0000800000000000 )                            
    47.                                         Address += 0xFFFF000000000000;                                 
    48.  
    49.                                     Address +=  ii<<PPI_SHIFT;
    50.                                     Address +=  iii<<PDI_SHIFT;
    51.                                     Address +=  iiii<<PTI_SHIFT ;
    52.  
    53.                                     if (safecopy(copypage,(PVOID)Address,_4K))
    54.                                     {
    55.                                         KdPrint(("%.16I64X-%.16I64X(4 Kbyte) %x %x %x %x \r\n" , Address , Address + _4K, i, ii , iii , iiii));
    56.  
    57.                                         DbgLogMsgSaveBuf( DataSystem, copypage, _4K );
    58.  
    59.                                         //if (NT_SUCCESS(saveAU( handleDatatFile,copypage,_4K )))
    60.                                         {
    61.                                             ptable_4K_2M->fileoffset    = SizeofFile;
    62.                                             ptable_4K_2M->StartVirtAddr = Address;
    63.                                             ptable_4K_2M->FinishVirtAddr= Address+_4K;                             
    64.  
    65.                                             //if (NT_SUCCESS(saveAU( handleStructFile, ptable_4K_2M, TABLE_4K_2M ))){;}
    66.                                             SizeofFile += _4K;
    67.  
    68.                                             DbgLogMsgSaveBuf(StructSystem,ptable_4K_2M,TABLE_4K_2M);
    69.                                            
    70.  
    71.                                             DbgLogMsg(Trace,"%.16I64X-%.16I64X(4 Kbyte) %x %x %x %x \r\n" , Address , Address + _4K, i, ii , iii , iiii);                                          
    72.  
    73.                                         }                                      
    74.                                     }  
    75.                                 }
    76.                             }
    77.                         }
    78.                         else
    79.                         {                          
    80.                             Address = static_cast<__int64>(i)<<PXI_SHIFT ;
    81.  
    82.                             if (Address >= 0x0000800000000000 )                            
    83.                                 Address += 0xFFFF000000000000; 
    84.  
    85.                             Address += ii<<PPI_SHIFT;
    86.                             Address += iii<<PDI_SHIFT;                             
    87.  
    88.                             if (safecopy(copypage,(PVOID)Address,_2M))
    89.                             {
    90.                                
    91.                                 DbgLogMsgSaveBuf(DataSystem,copypage,_2M);
    92.  
    93.                                 KdPrint(("%.16I64X-%.16I64X(2 Mbyte) %x %x %x \r\n", Address , Address + _2M, i, ii , iii ));
    94.  
    95.                                 //if (NT_SUCCESS(saveAU( handleDatatFile, copypage, _2M )))
    96.                                 {
    97.                                     ptable_4K_2M->fileoffset    = SizeofFile;
    98.                                     ptable_4K_2M->StartVirtAddr = Address;
    99.                                     ptable_4K_2M->FinishVirtAddr= Address+_2M;                             
    100.  
    101.                                     DbgLogMsgSaveBuf( StructSystem, ptable_4K_2M, TABLE_4K_2M );
    102.  
    103.                                     //if (NT_SUCCESS(saveAU( handleStructFile, ptable_4K_2M, TABLE_4K_2M ))){;}
    104.                                     SizeofFile += _2M;
    105.  
    106.                                    
    107.                                     DbgLogMsg(Trace,"%.16I64X-%.16I64X(2 Mbyte) %x %x %x \r\n", Address , Address + _2M, i, ii , iii );
    108.                                 }                                      
    109.                             }
    110.                         }
    111.                     }
    112.                 }
    113.             }
    114.         }
    115.     }
    116.  
    117.     if (copypage)
    118.         ExFreePool(copypage);
    119.     if (ptable_4K_2M)
    120.         ExFreePool(ptable_4K_2M);
    121.  
    122. //  ZwClose(handleDatatFile);
    123. //  ZwClose(handleStructFile);
    124. }