Защищенный режим Intela(статья №2 и №3)

Тема в разделе "WASM.BEGINNERS", создана пользователем Godod, 26 окт 2010.

  1. Godod

    Godod New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2010
    Сообщения:
    16
    Здравствуйте. Прочитав статьи http://www.wasm.ru/series.php?sid=20 с 1 по 5 и узнав ответы на конкурс(знаю давно было) учитель нам задал те же вопросы до дескриптору. Сколько я не читал, я не смог понять по какому принципу находится адрес базы и размер.Возьмем для примера 1 дескриптор
    ; Линейный адрес базы = 0, линейный адрес лимита = 0 + 1235h = 1235h
    1. Descr_code db 34h,12h,00h,00h,00h,XXh,0X000000b,00h
    Размер находится по такому пути(имхо): берется последние 34h,12h и переделываются в 1234+1=1235h это и будет размер.
    База: как я понял берется 00h,00h,00h и по аналогии с размером только не прибавляем 1, т.е. 000000 и получается 0.
    Дальше пойдем
    2. Descr_data db 0C8h,0Dh,36h,12h,00h,XXh,0X100000b,00h
    т.к. здесь 23 бита(считая от конца к началу) G=0(первый бит сначала).
    Размер:0DC8h+1=0DC9h(первый не берем). База:1236h(по аналогии с 1 дескриптором)
    Возьмем например 4 дескриптор
    4. Descr_code2 db 0DEh,0BCh,01h,20h,10h,XXh,0X001010b,00h
    Размер:OBCDEh+1=0BCDFh, это если считать по аналогии. Откуда взялся 0ABCDFh?? Вот этого я не понимаю
    База:102001h. Почему мы берем 13-19 байты(если считать с конца)??
    Дальше идем
    6. Descr_stack2 db 01h,00h,10h,00h,00h,XXh,0X000001b,10h
    7. Descr_LDT db 04h,00h,00h,00h,00h,XXh,1X000000b,20h

    Обьясните как в этих считать базу и лимит? И самое главное Ошибка во втором дескрипторе: бит 21 во втором двойном слове дескриптора ДОЛЖЕН ВСЕГДА равняться нулю. С какой стороны считать?? Если считать с конца тогда в первых тоже на 21 байте не стоят 0. Обьясните пожайлуста.

    З.Ы. если создал не в том топике перенесите тему пожайлуста.
     
  2. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Godod
    Адрес базы - это 32-битное значение. Это значит что можно адресовать 4294967296 байт данных (4 ГБ). Не обращай внимание что все поля базы разбросаны, они собираются и образуют 32-битный адрес. Лимит сегмента - это 20-битное значение. В 20 бит можно уместить 1048576 байт (1 МБ). Но тут есть нюанс: существует в дескрипторе бит гранулярности (G). Если он сброшен (равняется 0), то лимит считается в байтах. Укажешь в лимите 11111111111111111111b, то получишь 1048576 байт (1 МБ). А если бит гранулярности (G) установлен (равняется 1), то лимит измеряется в страничках. Одна страничка равняется 4096 байт (4 КБ). И получается что если ты укажешь в лимите 11111111111111111111b, то получишь 1048576 байт (1 МБ) умноженное на 4096 байт (4 КБ). 1048576 * 4096 = 4294967296 (4 ГБ).
     
  3. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Вот, к примеру, моё описание дескрипторов для глобальной таблицы дескрипторов (GDT):

    Код (Text):
    1. ; *******************************************************************************
    2. ;                                   Д А Н Н Ы Е
    3. ; *******************************************************************************
    4.  
    5. translation_pmode__Data16:
    6.     translation_pmode__GDTR:
    7.         dw 8*5-1
    8.         dq translation_pmode__gdt
    9.        
    10.     translation_pmode__gdt:
    11.         translation_pmode__descriptor0:
    12.             dw 0000000000000000b    ; Segment Limit(16)
    13.             dw 0000000000000000b    ; Base Address(16)
    14.             db 00000000b            ; Base Address(8)
    15.             db 00000000b            ; P(1), DPL(2), S(1), Type(4)
    16.             db 00000000b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    17.             db 00000000b            ; Base Address(8)
    18.         translation_pmode__descriptor1:
    19.             dw 1111111111111111b    ; Segment Limit(16)
    20.             dw 0000000000000000b    ; Base Address(16)
    21.             db 00000000b            ; Base Address(8)
    22.             db 10011000b            ; P(1), DPL(2), S(1), Type(4)
    23.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    24.             db 00000000b            ; Base Address(8)
    25.         translation_pmode__descriptor2:
    26.             dw 1111111111111111b    ; Segment Limit(16)
    27.             dw 0000000000000000b    ; Base Address(16)
    28.             db 00000000b            ; Base Address(8)
    29.             db 10010010b            ; P(1), DPL(2), S(1), Type(4)
    30.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    31.             db 00000000b            ; Base Address(8)
    32.         translation_pmode__descriptor3:
    33.             dw 1111111111111111b    ; Segment Limit(16)
    34.             dw 0000000000000000b    ; Base Address(16)
    35.             db 00000000b            ; Base Address(8)
    36.             db 11111000b            ; P(1), DPL(2), S(1), Type(4)
    37.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    38.             db 00000000b            ; Base Address(8)
    39.         translation_pmode__descriptor4:
    40.             dw 1111111111111111b    ; Segment Limit(16)
    41.             dw 0000000000000000b    ; Base Address(16)
    42.             db 00000000b            ; Base Address(8)
    43.             db 11110010b            ; P(1), DPL(2), S(1), Type(4)
    44.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    45.             db 00000000b            ; Base Address(8)
     
  4. Godod

    Godod New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2010
    Сообщения:
    16
    Спасибо за обьяснение, но к сожалению Вы не до конца поняли о чем я. Про что сколько может адресовать памяти и какой адрес я понял. Я вам привел пример и почему появляются такие буквы и цифры, а не такие как ожидалось, вот это мне обьясните
     
  5. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Godod
    Я особо не понял что именно Вас интересует? А то у Вас там такое ужасное форматирование, что глаза ломать не хочется. Конкретно спросите что интересует.

    Прочитал:

    И ответил.
     
  6. Godod

    Godod New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2010
    Сообщения:
    16
    Ладно пойдем так
    Обьясните мне по Вашему, как строится база и размер этого сегмента:
    6. Descr_stack2 db 01h,00h,10h,00h,00h,XXh,0X000001b,10h
    Все по-порядку если можно
     
  7. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Код (Text):
    1. dw 0000000100000000b    ; Segment Limit(16)
    2. dw 0000000000010000b    ; Base Address(16)
    3. db 00000000b    ; Base Address(8)
    4. db ????????b    ; P(1), DPL(2), S(1), Type(4)
    5. db 0?000001b    ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    6. db 00010000b    ; Base Address(8)
    Получается что базовый адрес 00000000000100000000000000010000b (0x00100010). Лимит 00000001000000000001b (0x00001001), то есть 4097 байт. Бит гранулярности (G) равен 0, так что измеряется лимит в байтах.
     
  8. Godod

    Godod New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2010
    Сообщения:
    16
    Спасибо большое, а теперь не могли бы Вы обьяснить как что находится. Вот так будеь яснее еще 01h=---------b(Base Addres (8)),00h=---------b(Base address(16)) например. Думаю после этого я полностью все пойму
     
  9. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Вы вообще маны интела курили? Там таблички все нарисованы с картинками как формируется линейный адрес.
    А перевод из шестнадцатеричной в двоичную надо знать еще до изучения программирования как такового.
     
  10. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Вот есть:

    Не знаю почему, но мне больше по душе, когда там стоят знаки вопроса:

    И прям подряд всё это можно перевести в двоичный вид (хотя бы через калькулятор операционной системы):

    Можно взять это всё в один большой 64-битный массив:

    А теперь можно открыть таблицы из справочника AMD или Intel, и сравнить:

    [​IMG]
     
  11. Godod

    Godod New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2010
    Сообщения:
    16
    Маны интела не курил, бумагу не курю впринципе. Если есть ссылка дайте пожалуйста почитаю. Все понял как переводить. Спасибо, а мануалы я бы почитал
     
  12. Godod

    Godod New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2010
    Сообщения:
    16
    Все спасибо всем. Тему можно закрывать
     
  13. Miyamoto

    Miyamoto New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2010
    Сообщения:
    46