Проблема с переходом в защищённый режим

Тема в разделе "WASM.BEGINNERS", создана пользователем Igor1024, 29 мар 2011.

  1. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Итак, приступил я к изучению защищённого режима. И вот у меня возникли проблемы с мини-ядром, которое переводит проц в защищённый режим и далее работает в нём. Я хотел бы спросить насчёт матчасти, а именно о загрузке адреса в регистр gdtr. Как я могу найти адрес таблицы GDT (знаю, что вопрос глупый, но он меня несколько в тупик поставил)?
    Итак, ядро загружается по адресу 1000:0000.
    Таблица GDT.
    Код (Text):
    1. GDT:
    2.          dd  0,0 ; пустой дескриптор
    3.          db  0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b, 00        ; код  
    4.          db  0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b, 00        ; данные
    5.          db  0FFh, 0FFh, 00h, 80h, 0Bh, 10010010b, 01000000b, 00       ;видеобуфер
    6.  
    7.     GDT_size     equ $-GDT
    8.     GDTR         dw GDT_size-1
    9.                       dd ?
    Потом устанавливаю адреса... и вот тут я затрудняюсь.
    Пробовал так:
    Код (Text):
    1.    mov ax,cs
    2.    shl eax,4
    3.    add ax,GDT
    4.    mov dword [GDTR+2],eax
    Но так не получается. Не мог бы подсказать кто, как указать правильный адрес.
    Ещё раз каюсь за такой глупый вопрос...
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Все таблицы программист определяет сам. Соответственно, сначала сформируйте в памяти нужные структуры данных (ГДТ, ИДТ, ТСС), а потом по мере надобности загружайте их адреса в соответствующие регистры.

    И вообще, изучение матчасти перед тем, как браться за дело, ещё никто не отменял. Документацию на архитектуру ИА-32 в зубы -- и вперёд, там всё подробно описано (и даже почти без ошибок).
     
  3. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Ладно, манов от Intel у меня полно. Буду среди них смотреть, что подойдёт. (Хотя, честно говоря, читал ещё до этого, но не особо в System Programming Manual расписали нужный предмет - наверное плохо искал, или не тот смотрел).
     
  4. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    IDT у меня тоже построена, но TSS мне пока не нужно. Ни о какой мультизадачности мне пока рано ещё даже заикаться.
     
  5. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    А ТСС, по большому счёту, требуется _всегда_, даже без многозадачности (ну а многозадачность в реальных системах делается без ТСС: регистры сохраняются-восстанавливаются вручную -- получается и более гибко, и быстрей, чем "аппаратная многозадачность", которую в конце концов упразднили -- в 64-разрядном режиме ТСС существует только в единственном экземпляре и совершенно не для того, чтобы использоваться при переключении задач). В общем, лучше сначала изучите повнимательней разделы руководства, посвящённые защищённому режиму, многозадачности (для лучшего понимания того, какого рода информация имеется в ТСС) и прерываниям, ну а потом уже беритесь за практике: результата быстрей добьётесь, поскольку в интеловской архитектуре уж очень разные вещи тесно связаны друг с другом... Всё необходимое содержится в нескольких главах первой части третьего тома интеловского руководства. Правда, изучать надо внимательно, делая для себя заметки в тетрадке -- в голове всю необходимую информацию удержать проблематично.

    Пы.Сы. Ну и внимательно прочитайте описание инструкций, используемых для загрузки регистров защищённого режима -- благо, их очень немного. Там подробно сказано, какого рода информация загружается, как должен быть сформирован адрес и т.п. Это уже второй том руководства.
     
  6. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Memory management interviev и далее в Volume 3A: System Programming Manual, Part1
    Нашел... Читаемс.
    Я сначала читал статьи BrokenSword'a, потом почитал Юрова (как оказалось преотвратно пишет), но маны - святое :)
     
  7. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Чуть не забыл:
    SII, спасибо.
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Igor1024

    Ясень пень неправильно.


    Вот вам вопросы для. Проверки.
    1. Что такое сегмент?
    2. Что такое смещение?
    3. Что такое линейный адрес? Как он вычисляется в реальном режиме?
    4. add ax,GDTR - что будет в файле после компиляции этой команды?
    5. Что делает макрокоманда org 7с00h?
    6. Как влияет команда org на команду из 4 вопроса.
    7. Что будет со смещениями если код загрузить по адресу 1000h:0010h cs=1000h ip=10h? по адресу cs=1001h ip=0h?
    8. 1000h:0010h и 1001h:0000h это разные адреса или одинаковые?
    9. Код загружен по адресу cs=7c00h ip=10h
    a) ds=00 какое должен быть число у макрокоманды org?
    b) ds=7c00h какое должен быть число у макрокоманды org?
    с) ds=1 какое должен быть число у макрокоманды org?
    10. Что будет если не писать макрокоманду org?
    11. Чем org отличается от add?
    12. Чем занимается линкер?

    ps. Поведение макрокоманды org зависит от компилятора.
     
  9. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Pavia, в том куске кода я опечатался. На вопросы отвечу же несколько позднее.
     
  10. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    1) Логическое деление памяти в плоском режиме. В реальном размер сегмента не превышает 64кб, в реальном - 4Гб.
    2) Смещение - число, показывающее адрес в памяти, смещенного относительно начала сегмента, в котором он находится.
    3) Линейный адрес или физический, 32 битный адрес (в нашем случае), выставляемый на шину процессора.
    4) Получается: адрес базы сегмента+смещение GDTR (нужно было GDT).
    Но учитывая, что здесь не получилось, я неправ.
    5) Выравнивает программу в оперативе при загрузке таковой по смещению после директивы org.
    6)Смещение будет изменено. 07с00h+начальное смещение от начала сегмента.
     
  11. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    7)Смещение будет 10h;Смещение = 0;
    8)Одинаковые. 1000h*10h+10h=1001h*10h
    9)Мне кажется, что совершенно не важно, поскольку сегментные регистры инициализируются 0.
     
  12. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    1) А причём здесь плоский режим? Сегмент -- это просто логически единый участок памяти, занимающий непрерывную последовательность адресов (изначально физических, впоследствии -- только линейных), все ячейки которого имеют одинаковые атрибуты (типа прав доступа к ним)

    2) Смещение -- это именно смещение, а не "адрес в памяти".

    3) Линейный адрес -- это не физический адрес. То, что при отключенном страничном механизме они совпадают, не делает его физическим.

    Ну и т.д. В общем, внимательно изучаем материальную часть и ни в коем случае не смешиваем разные понятия, даже если на первый взгляд они кажутся одним и тем же.
     
  13. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Исправлюсь!
    Как то я на небольшие мелочи внимания не обращал, а теперь вот столкнулся и попался... Всё, нашёл лит-ру, заполню пробелы.
     
  14. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Я никак не могу понять, почему же этот код не работает... Переход в PM и выключение. Прошу помощи.
    Код (Text):
    1. use16
    2. start:
    3.     jmp continue_loading
    4.  
    5. GDT:
    6.          dd  0,0
    7.          db  0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b, 00        ; код  
    8.          db  0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b, 00        ; данные
    9.          db  0FFh, 0FFh, 00h, 80h, 0Bh, 10010010b, 01000000b, 00        ; видеобуфер
    10.          db  0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 00000000b, 00      
    11.  
    12.     GDT_size     equ $-GDT
    13.     GDTR         dw GDT_size-1
    14.                       dd ?
    15.  
    16. continue_loading:
    17.     mov eax,01000h
    18.     add eax,GDT
    19.     mov dword [GDTR+2],eax
    20.     xor eax,eax
    21.  
    22.     ; открываем адресную линию A20
    23.     in   al,92h
    24.     or   al,2
    25.     out  92h,al
    26.  
    27.  
    28.     cli
    29.     in   al, 70h
    30.     or   al, 80h
    31.     out  70h,al
    32.  
    33.    
    34.     lgdt fword [GDTR]
    35.  
    36.  
    37.     mov  eax,cr0
    38.     or al,1
    39.     mov  cr0,eax
    40.  
    41.     jmp  00001000b:PROTECTED_ENTRY
    42.  
    43. use32
    44. PROTECTED_ENTRY:
    45.     mov  ax, 00010000b
    46.     mov  ds, ax
    47.     mov  ss, ax
    48.     mov  ax, 00011000b  
    49.     mov  es, ax
    50.        
    51.     in   al, 70h
    52.     and  al, 7Fh
    53.     out  70h, al
    54.     sti
    55.  
    56.     mov ax, 0x5301; и выключаемся
    57.     xor bx, bx
    58.     int 0x15
    59.     mov ax, 0x5308
    60.     mov bx, 1
    61.     mov cx, bx
    62.     int 0x15
    63.     mov ax, 0x530D
    64.     mov bx, 1
    65.     mov cx, bx
    66.     int 0x15
    67.     mov ax, 0x530F
    68.     mov bx, 1
    69.     mov cx, bx
    70.     int 0x15
    71.     mov ax, 0x530E
    72.     xor bx, bx
    73.     mov cx, 0x102
    74.     int 15h
    75.     mov ax, 0x5307
    76.     mov bx, 1
    77.     mov cx, 3
    78.     int 0x15
    79.     jmp $
     
  15. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Некоторые причины я тебе назвал (см. форум на flatassembler.net). Вместо "выключения" сделай зацикливание с предварительным выводом в видеопамять или просто посмотри в отладчике, доходит ли управление до этого зацикливания. Про прерывания тоже написал.
     
  16. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Код (Text):
    1. continue_loading:
    2.     mov eax,01000h
    3.     add eax,GDT
    4.     mov dword [GDTR+2],eax
    5.     xor eax,eax
    Что-то я не понял, как твой код вообще запускается? Как проинициализирован стек и вообще сегментные регистры?
     
  17. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    +1
     
  18. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Сегментные регистры для реального режима в бутлоадере инициализированы. В лоадере гружу ядро на 01000h:0, и ret'ом на него перехожу (far jmp эдакий получается).
     
  19. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Если не переходить в PM (не загружать GDTR и не выставлять бит PE в cr0), то всё работает прекрасно.
     
  20. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    А если в PM после инициализации сегментных регистров поставить, не разрешая прерывания, jmp $, то всё равно вылетает #GP.