Переход в long mode. PAE.

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

  1. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Доброго времени суток!
    Уважаемые форумчане, дайте пример переводапроцессора в long mode c формированием нужных структур.

    С Уважением, Александр.
     
  2. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    в этой теме в последнем посте есть пример
    http://www.wasm.ru/forum/viewtopic.php?id=18634
     
  3. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Не могу понать пару вещей:
    1.
    Код (Text):
    1.   ; Init several field
    2.   mov dword[pde.base],010000011b      ; PS or Present or Write
    3.   mov dword[pdpe.base],pde.base+3     ; Present or Write
    4.   mov dword[pml4e.base],pdpe.base+3   ; Present or Write
    почему записи 32х битные? Вроде нужно использовать 64х битные.

    2.Для чего нужен 64х битный дескриптор? Сколько их должно быть.
     
  4. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    1. у всех полей размер равен 8 байтам, но в старшей части находится только старшая часть адреса (и бит для запрета выполнения на странице, но по умолчанию он не нужен). и все флаги находятся в младшей части, вот она и редактируется
    2. Дексрипторы были 64 битными ещё в обычном защищённом режиме. Если мне не изменяет память, то в long mode расширились до 128 бит только дескрипторы TSS и все дскрипторы в IDT. В long mode в GDT должно быть как минимум два дескриптора: один для кода и ещё один для всего остального. ( у него достаточно выставить только поле Present)

    P.S. В мануалах от Intel режим long mode (IA-32e) объясняется как-то не внятно, поэтому я рекомендовал бы курить маны от AMD, в манах от AMD всё написано более внятно и понятнее. Это только моё ИМХО
     
  5. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Немного поигравшись, получил следующее:
    Код (Text):
    1. [BITS 16]
    2. [ORG 0x7c00]
    3. _start:
    4.     cli
    5.     mov ax, cs
    6.     mov ds, ax
    7.     mov ss, ax
    8.     mov sp, _start
    9.  
    10.     ;; Загрузка регистра GDTR: 
    11.     lgdt [gd_reg]
    12.  
    13.     ;; Включение A20:
    14.     in al, 0x92
    15.     or al, 2
    16.     out 0x92, al
    17.  
    18.     ;; Установка бита PE регистра CR0
    19.     mov eax, cr0
    20.     or al, 1   
    21.     mov cr0, eax  
    22.  
    23.     ;; С помощью длинного прыжка мы загружаем
    24.     ;; селектор нужного сегмента в регистр CS
    25.     ;; (напрямую это сделать нельзя)
    26.     ;; 8 (1000b) - первый дескриптор в GDT, RPL=0
    27.     jmp 0x8: _protected
    28.  
    29.  
    30. [BITS 32]
    31. _protected:
    32.     ;; Загрузим регистры DS и SS селектором
    33.     ;; сегмента данных
    34.     mov ax, 0x10
    35.     mov ds, ax
    36.     mov ss, ax
    37.  
    38.     ;; Готовимся к переходу в 64-битный режим
    39.    
    40.     mov es, ax
    41.     mov edi, 0x100000
    42.     mov ecx, 0x1000
    43.     xor eax,eax
    44.     rep stosd
    45.  
    46.     mov edi, 0x100000 ;; PML4E
    47.     mov eax, 0x101007
    48.     stosd
    49.    
    50.     mov edi, 0x101000 ;; PDPE
    51.     add eax, 0x1000
    52.     stosd
    53.  
    54.     mov edi, 0x102000 ;; PDE
    55.     add eax, 0x1000
    56.     stosd
    57.  
    58.     mov edi, 0x103000
    59.     mov eax, 0x7
    60.     mov ecx, 512
    61. fill:
    62.     stosd
    63.     mov edx,eax
    64.     xor eax,eax
    65.     add edi, 0x4
    66.     stosd
    67.     mov eax,edx
    68.     add eax,0x1000
    69.     loop fill
    70.  
    71.     ;; Начинаем переход
    72.    
    73.     mov eax,cr4
    74.     bts eax,5
    75.     mov cr4,eax
    76.  
    77.     mov eax,0x100000
    78.     mov cr3,eax
    79.  
    80.     mov ecx,0xC0000080
    81.     rdmsr
    82.     bts eax,8
    83.     wrmsr
    84.    
    85.     mov eax,cr0
    86.     bts eax,31
    87.     mov cr0,eax
    88.  
    89.     jmp 0x18: _64
    90.    
    91. [BITS 64]
    92.    
    93. _64:
    94.     mov ax,0x28
    95.     mov ss,ax
    96.     mov ds,ax
    97.     mov byte [0xB805], 'A'
    98.     jmp _64
    99.    
    100.  
    101. [BITS 32]
    102.    
    103. gdt:
    104.     dw 0, 0, 0, 0   ; Нулевой дескриптор
    105.  
    106.     db 0xFF     ; Сегмент кода с DPL=0
    107.     db 0xFF     ; Базой=0 и Лимитом=4 Гб
    108.     db 0x00
    109.     db 0x00
    110.     db 0x00
    111.     db 10011010b
    112.     db 0xCF
    113.     db 0x00
    114.    
    115.     db 0xFF     ; Сегмент данных с DPL=0
    116.     db 0xFF     ; Базой=0 и Лимитом=4Гб 
    117.     db 0x00
    118.     db 0x00
    119.     db 0x00
    120.     db 10010010b
    121.     db 0xCF
    122.     db 0x00
    123.  
    124.     db 0xFF     ; Сегмент кода с DPL=0
    125.     db 0xFF     ; 64 битный сегмен, 0x18
    126.     db 0x00
    127.     db 0x00
    128.     db 0x00
    129.     db 10011010b
    130.     db 0xAF
    131.     db 0x00
    132.    
    133.     db 0xFF     ; Сегмент данных с DPL=0
    134.     db 0xFF     ; 64 битный сегмен, 0x28   
    135.     db 0x00
    136.     db 0x00
    137.     db 0x00
    138.     db 10010010b
    139.     db 0xAF
    140.     db 0x00
    141.  
    142.  
    143.  
    144.  
    145.     ;; Значение, которое мы загрузим в GDTR: 
    146. gd_reg:
    147.     dw 8192
    148.     dd gdt
    149.  
    150.     times 510-($-$$) db 0
    151.     db 0xaa, 0x55
    На экран ничего не выводится... VirtualBox пишет в лог:
    Код (Text):
    1. 00:00:03.844 Guest CPUM state: se
    2. 00:00:03.844 eax=e0000011 ebx=00000000 ecx=c0000080 edx=00000000 esi=0000bff0 edi=00104800
    3. 00:00:03.844 eip=00007ca8 esp=00007c00 ebp=00000000 iopl=0      rf nv up di pl zr na pe nc
    4. 00:00:03.844 cs={0008 base=0000000000000000 limit=ffffffff flags=0000c09b} dr0=00000000 dr1=00000000
    5. 00:00:03.844 ds={0010 base=0000000000000000 limit=ffffffff flags=0000c093} dr2=00000000 dr3=00000000
    6. 00:00:03.844 es={0010 base=0000000000000000 limit=ffffffff flags=0000c093} dr4=00000000 dr5=00000000
    7. 00:00:03.844 fs={0000 base=0000000000000000 limit=ffffffff flags=0001c000} dr6=ffff0ff0 dr7=00000400
    8. 00:00:03.844 gs={0000 base=0000000000000000 limit=ffffffff flags=0001c000} cr0=e0000011 cr2=00007ca8
    9. 00:00:03.844 ss={0010 base=0000000000000000 limit=ffffffff flags=0000c093} cr3=00100000 cr4=00000020
    10. 00:00:03.844 gdtr=0000000000007cc4:2000  idtr=0000000000000000:ffff  eflags=00010002
    11. 00:00:03.844 ldtr={0000 base=00000000 limit=00000000 flags=00000082}
    12. 00:00:03.844 tr  ={0000 base=00000000 limit=0000ffff flags=0000008b}
    13. 00:00:03.844 SysEnter={cs=0000 eip=00000000 esp=00000000}
    14. 00:00:03.844 FPU:
    15. 00:00:03.844 FCW=037f FSW=0000 FTW=00
    16. 00:00:03.844 res1=00 FOP=0000 FPUIP=00000000 CS=0000 Rsvrd1=0000
    17. 00:00:03.844 FPUDP=0000 DS=0000 Rsvrd2=0000 MXCSR=00000000 MXCSR_MASK=00000000
    18. 00:00:03.844 MSR:
    19. 00:00:03.844 EFER         =0000000000000500
    20. 00:00:03.844 PAT          =0007040600070406
    21. 00:00:03.844 STAR         =0000000000000000
    22. 00:00:03.844 CSTAR        =0000000000000000
    23. 00:00:03.844 LSTAR        =0000000000000000
    24. 00:00:03.844 SFMASK       =0000000000000000
    25. 00:00:03.844 KERNELGSBASE =0000000000000000
    26. 00:00:03.844 ***
    27. 00:00:03.844 Guest paging mode:  AMD64, changed 2 times, A20 enabled
    28. 00:00:03.844 Shadow paging mode: AMD64
    29. 00:00:03.844 Host paging mode:   PAE+G
    Как я понял - не осуществляется переход в 64-битный сегмент.
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    exst
    Вообще в идеале надо бы проверять, поддерживается ли 64 битный режим :derisive:
    (Хотя я вбокс не юзал, юзал QEMU)
    Дальше, A20 у вас как то странно открывается. Я не так делал
    Код (Text):
    1. ;Откроем линию а20
    2. open_a20:
    3.     mov al,0d1h        ;команда управления
    4.     out 64h,al           ;линией А20
    5.     mov al,0dfh         ;код открытия
    6.     out 60h,al           ;линии А20
    7.     ret
    Едем дальше зачем сразу прерывания запрещать ?
    А если уж запрещать (чтоб изменить cr0) то и NMI тоже запрещать надо.
    Код (Text):
    1.    
    2. ;Запрещаем прерывания
    3.     cli                              ;запрет аппаратных прерываний
    4.     mov      al,80h         ;запрет NMI
    5.     out      70h,al          ;порт КМОП микросхемы
    Адрес видеопамяти у вас какой, то не такой
    Бред. Там как минимум 0xb8000
    Почему так криво дескрипторы описаны? Разве сложно описать для данных, для стека, для кода, для видеопамяти. Это же удобно в дальнейшем

    Ладно в общем прикрепляю свою наработку. Надеюсь поможет. С комментариями. Когда то делал для универа, для студентов новую лабу, ну и преподу, экземпл)
    Там и адресация, и прерывания.
     
  7. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    64 бита на виртуалке поддерживаются. Пробовал menuet64. С адресом видеопамяти вышла очепятка. А мои 64-битные дескрипторы и страничная разметка правильно описаны?

    P.S. Не выкачивается прикрепленный файл. Пробовал с разных компов.
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    exst
    Например сегмент кода в 64 битовом сегменте:
    [ LIMIT | BASE | PDLSTYPE GD0ALIMT | BASE ]
    CODE64_descr db 0FFh, 0FFh, 00h, 00h, 00h, 10011011b, 10101111b, 00
    Надо так , а у вас 10011010 , куда accessed дели в типе сегмента?
     
  9. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Делал по аналогии с 32-битным. Только поменял местами биты L и D. Из АМДшной документации:
    Видимо от них нет толку.
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    exst
    Скачай тот файл что я прикрепил. Ну и читай маны интела ) Там есть таблички типов сегментов.
     
  11. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Не качается.( Вышлите мне на почту: free9@list.ru
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    exst
    Выслал, кстати по поводу вашего
    В манах интела я такого не видел.
     
  13. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Посмотрел ваш код. Появилась пара вопросов:
    1)Если использовать страницы по 2МБ и разметить ими 1Гб, а на машине (ну или виртуалке) установлено меньше памяти будет ли ошибка?
    2)Для чего очищаете cr2?
    Код (Text):
    1.     xor eax,eax
    2.     mov cr2,eax
     
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    exst
    Не разу так не пробовал, но ошибка будет только если вы обратитесь по тем адресам. Хотя вам никто не мешает разметить один и тот же регион несколько раз, тем самым с эмулировать подкачку при определенных условиях.
    cr2 содержит линейный адрес где (при случае) произошло нарушение Page Fault. Тем самым в обработчике прерываний можно его увидеть..
     
  15. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Ясно. Как я понял программа у меня останавливается на инструкции перехода в 64хбитный сегмент. Куда теперь копать? Может ли быть связана ошибка с разметкой страниц? Или же копать дескриптор.

    P.S.Воспользовался вашим дескриптором сегмента кода.
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    exst
    Ну вначале протестите программу до перехода в 64 битный режим (до джампа) выведете на экран что нить наподобие "Я в 32 битном режиме". А далее по нарастающей. Заполняйте страницы. Сделайте переходы. И вообще по моему исходнику ориентируйтесь, сравнивайте каждый шаг. в чем отличее.
     
  17. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    exst, пробуй запускать код на Bochs. на ней как-то проще отлаживать.
    я когда то хотел включить режим PAE в защищённом режиме, оказалось что VitualBox поддерживает PAE через жопу (впрочем, может эта ошибка уже устранена)
     
  18. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    TermoSINteZ, спасибо. Воспользовался вашей 2МБ разметкой)
    Код (Text):
    1.     mov esi,0x100000
    2.     emms
    3.     pxor mm0,mm0
    4.     mov ecx,2048
    5. null:
    6.     movq [ds:esi],mm0
    7.     add esi,8
    8.     loop null
    9.    
    10.     mov dword [ds:0x100000],0x100000 + 4096 + 15
    11.     mov dword [ds:0x100000+4096],0x100000 + 8192 + 15
    12.    
    13.     xor esi,esi
    14.     mov ecx,15 + 128
    15.     mov eax,0x200000
    16. paging:
    17.     mov dword [ds:0x100000+8192+esi],ecx
    18.     add ecx,eax
    19.     add esi,8
    20.     cmp esi,8*512
    21.     jne paging
    В VirtualBox отлично работает при 32 битной винде. )
     
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    exst
    просто поймите, что:
    при 4 килобайтной организации у нас 5 уровней PML4TE, PDPTE, PDE, PTE, Page Offset
    при 2х мегабайтной организации у нас 4 уровня PML4TE, PDPTE, PDE, Page Offset
     
  20. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    При 1Гб организации еще проще, однако, ни разу я не встречал ее поддержку... Может только в новых АМД...