В путь.. (По мотивам "Процессор Intel в защищенном режиме")

Тема в разделе "WASM.OS.DEVEL", создана пользователем spa, 18 июн 2007.

  1. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Мне нужен рабочий 100% исходник переведённый на фасм из статьи
    http://wasm.ru/article.php?article=pipm09
    Просто мне кажеться там в сорцах есть ошибки и я не хочу их запоминать.

    Например
    ; заполнить таблицу страниц 0
    mov EAX,00000007h ; 0 - адрес страницы 0
    А по мне
    ; заполнить таблицу страниц 0
    mov EAX,00101007h ; 0 - адрес страницы 0

    Или я чегото не понимаю?

    В любом случае разобравшимуся человеку перевод займёт 2/5 минут, а мне поможет не тратить время проверяя опечатка или моё непонимание.
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    SPA
    все правильно
    мы заполняем таблицу страниц, в каждой ячейке которой записаны физические адреса отдельных страниц (старшие 20 бит)
    т. к у нас отображение 1:1 первых 4-х мегабайт, поэтому начальный физический адрес = 0x00000000 и он увеличивается на 0x1000 для следующей ячейки
    Код (Text):
    1. fill_page_table:
    2.     stosd                              ; записать элемент таблицы
    3.     add        EAX,00001000h               ; добавить к адресу 4096 байтов
    4.     loop                fill_page_table        ; и повторить для всех элементов
     
  3. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    rei3er
    Если я правильно понял, то сначала тождественно проецируем 4 первых мб, а потом для страницы 12000h меняем фз адресс на 0B8000h, правильно?


    И ещё хотел спросить можно ли без дискрипторов в страничной адресссации.
    Ведь когда включенна страничная адрессация мы не можем обращаться через селектор+смеещение, или как. И на что влияют заначения в сегментных регистрах при страничной адрессации.

    Кстати я так и не понял почему 00000007h
    Код (Text):
    1. mov  EAX,00000007h  ; первая запись - адрес нулевой страницы равен 0
    2. mov  ECX,1024       ; кол-во страниц в таблице
    Код (Text):
    1. ; вывод mes1 по стандартному адресу (начало видеопамяти 0B8000h)
    2.     mov        EDI,0B8000h                 ; для команды movsw, EDI = начало видепамяти
    3.     mov            ESI,PM_DATA                 ;
    4.     shl            ESI,4
    5.     add            ESI,offset mes1             ; ESI = адрес начала mes1
    6.      mov           ECX,mes_len                 ; длина текста в ECX
    7.     rep            movsw                       ; DS:ESI (наше сообщение) -> ES:EDI
    8.                                                ; (видеопамять)
    9.  
    10. ; вывод mes2 по НЕСТАНДАРТНОМУ АДРЕСУ 12000h:
    11.                 mov            EDI,0120A0h     ; 12000h (уже можешь считать, что это
    12.                                                ; 0B8000h) + A0h
    13.                 mov            ESI,PM_DATA
    14.                 shl            ESI,4
    15.                 add            ESI,offset mes2 ; ESI = адрес начала mes2
    16.                 mov            ECX,mes_len     ; длина текста в ECX
    17.                 rep            movsw           ; DS:ESI (наше сообщение) -> ES:12000h
    18.                                                ;(типа видеопамять)
    19.  
    20.     jmp            $                           ; погружаемся в вечный цикл
    В первом случае т.к. страничная адрессация включенна, мы также пойдем по каталогу страниц, и т.д.?
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    да
    читай описание формата PTE/PDE
    бит 0 = 1 если страница (таблица страниц), описываемая PTE (PDE) присутствует в памяти
    бит 1 = 1 если страница (таблица страниц) доступна для записи
    бит 2 = 1 если страница доступна для задач с CPL <= 3
    нет
    прочитай внимательно, что такое страничная адресация
    если вкратце, то дополнительный уровень косвенности для получения физического адреса из линейного
    если страничная адресация выключена - линейный адрес = физическому и никакого дополнительного уровня косвенности нет
     
  5. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Т.е. для каждого сегмента которыйз аписанн в дискрипторе сушествует(точнее может существовать) свой каталог и таблица страниц? А когда меняеться cr3 в этом случае.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ы, нет конечно. Советую перечитать весь цикл с начала.
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    SPA
    ты не в том направлении мыслишь
    1. Прочитай про защищенный режим без страничной адресации
    2. Защищенный режим со страничной адресацией - это тоже самое + дополнительное преобразование линейного адреса
     
  8. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    rei3er

    А каталог + таблицы страниц при 4 Кб. страницы могут формировать лишь пространство 4 гб.


    ЗЫ ну вродебы я начал тебя понимать, страничная адрессация работает так 4Гб. оператифы сопоставляються другим 4 Гб. оперативы, при страничной адресации работаем с настоящей, а при страничной с виртуальной и всё различие, так?
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    любой дескриптор любой таблицы (GDT, LDT) можно закэшировать в одном из сегментных регистров и с его помощью получить доступ ко всему сегменту
    ты бы сначала вопросы научился нормально формулировать, а то ж читать невозможно
    если по делу, то в целом да, так и есть
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    оперативы может быть и меньше, а виртуальное пространство 4гб. причем страницы могут соответствовать оперативным физическим, а могут и не соотвтетствовать
     
  11. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Да ты прав, я уже запарился от не понимания моих вопросов/утверждений. ;(

    Но это то я понял.


    Ну и вот ещё вопрос, если две программы работают на одном уровне привелегий я могу "угадать" адрес в пространстве другого процесса и записать в него?
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    смотря в какой ОСи, и как происходит организация защиты АП процессов.
     
  13. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Win?
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    SPA
    функция
    WriteProcessMemory()
    прямая запись по "угаданному" адресу приведет к записи (или к исключению :)) в адресное пространство того процесса, который осуществлял запись
     
  15. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    rei3er
    Не понял ты про что, я врмнцепе без использования WriteProcessMemory() и к томуже это так для общего развития.

    ЗЫ а в Linux?
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    там для каждого процесса своя таблица страниц.
     
  17. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    n0name
    Ну да сам должен был догадаться.

    Но вот вопрос как в win тогда система себе 2 Гб. оставляет, т.е. вопрос вот в чём у каждого процесса свой каталог, и драйвера выполняются в контексте какогото процесса(ИМХО) следовательно в этом каталоге должна быть и информация о системной части памяти.
     
  18. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    SPA
    Ну да, потоки драйверов исполняются в контексте System процесса. И cr3 для этого процесса содержит адреса выше 2Гб.
     
  19. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    А прерывания где обрабатываються? Гдето я читал что не факт что в system.
     
  20. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Нет, без использования апи этого сделать нельзя. В етом и есть смысл странички: в каждой программы доступ к 2 гигабайтам виртуальной памяти НИКАК НЕ ВЛИЯЮЩИХ на виртуальную память другой программы. Если бы это было так, то винда бы падала в БСОД даже не успевая полностью загрузится.

    И уровни привелегий тут не причём: один и тот же самый кусочек физической памяти может быть адресован например как супервизор, а в другой странице - как данные третьего кольца, естественно доступного для записи из 3 уровня. И если сделать такую запись, то данные супервизора испортятся, а система будет думать что все в порядке. Слава богу, что такие действия в винде запрещенны.